:has() 关系伪类
使用强大的 :has() 关系伪类,根据子元素选择父元素。
:has() 关系伪类 是 CoddyKit 上的免费 CSS Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 CSS Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 CSS Academy 课程共包含 4 节课。
什么是 :has()?
:has() 伪类会在元素包含与参数匹配的后代元素时选中该元素。它通常被称为“父选择器”,可以根据子元素设置父元素的样式,这是 CSS 过去从未具备的能力。
基本语法
.card:has(img) 会选中包含 img 后代元素的所有 .card 元素。参数是一个相对选择器列表,即描述相对于目标元素的元素的任意有效 CSS 选择器。
设置父元素样式
当表单容器包含无效输入项时为其设置样式:form:has(:invalid) { border-color: red; }。为包含标题的区块设置样式:section:has(h2) { padding-top: 2rem; }。父元素会根据子元素的状态改变外观。
兄弟元素选择
:has() 可以选择前置兄弟元素,这是 + 和 ~ 无法做到的。h2:has(+ p) 会选择后面紧接着 p 元素的 h2 元素。li:has(~ .active) 会选择具有后续 .active 兄弟元素的 li 元素。
表单状态样式
无需 JavaScript 即可响应原生表单有效性:input:has(~ .error-msg) 会为带有兄弟错误消息的输入项设置样式。label:has(+ input:required) 会为其配对输入项为必填项的标签设置样式——这一切仅使用 CSS 即可完成。
导航状态
根据活动子元素突出显示导航容器:nav:has(.active) 会在任意子元素具有 active 类时,为整个 nav 应用样式。它适合在容器级别指示当前所在的导航区块。
与其他伪类结合使用
.grid:has(.card:focus-within) 会在任意卡片获得键盘焦点时,为整个网格设置样式。.dropdown:has(:hover) 会在鼠标悬停于任意后代元素时保持下拉菜单打开,比复杂的兄弟组合器链更简洁。
CSS 中类似媒体查询的效果
与 .sidebar:not(:has(nav)) 相比,.sidebar:has(nav) 会应用不同的布局。无需 JavaScript 即可实现条件布局:特定子元素的存在或缺失会驱动父元素的布局,从而实现真正自适应、感知内容的 CSS。
性能注意事项
带有宽泛参数选择器的 :has()(例如 :has(*))可能会消耗较多性能,因为浏览器必须检查每个元素。请让 :has() 的参数尽可能具体。在可能的情况下,优先使用 :has(> .specific-child)(直接子元素),而不是 :has(.specific-child)(任意后代元素)。
浏览器支持
:has() 支持 Chrome 105+、Safari 15.4+ 和 Firefox 121+。自 2023 年末起已获得完整的基线支持。不存在可用的兼容填充方案(因为需要使用 JavaScript 进行模拟),因此对于较旧的浏览器,请在该功能并非关键功能时结合渐进增强使用。
替代 JavaScript 模式
过去需要使用 JS 事件监听器的模式包括:“子元素获得焦点时为父元素添加类”“存在模态框触发器时显示覆盖层”“网格恰好包含三个项目时使用不同样式”。:has() 可以以声明式方式处理所有这些情况。
知识检查
与现有的 CSS 组合器(如 + 和 ~)相比,:has() 的独特之处是什么?
总结
:has() 是 CSS 首个真正的关系型伪类,可以选择父元素和前置兄弟元素。它支持内容驱动的样式、表单状态响应、导航突出显示,以及许多过去需要通过 JavaScript 操作 DOM 才能实现的模式,而且全部可以用 CSS 以声明式方式完成。
常见问题解答
「:has() 关系伪类」课时是免费的吗?
是的 — 「:has() 关系伪类」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 CSS Academy 课程的其余内容,请升级到 CoddyKit PRO。 CSS Academy 课程共包含 4 节课。
「:has() 关系伪类」这节课中我会学到什么?
使用强大的 :has() 关系伪类,根据子元素选择父元素。 你通过在浏览器中直接运行的动手代码来练习 CSS Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 CSS Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 CSS Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「:has() 关系伪类」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 CSS Academy 课中编写并运行代码吗?
能。每节 CSS Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 原生 CSS 嵌套
- :has() 关系伪类
- 用于局部样式的 @scope
- 视图过渡 API