:has功能性伪类选择器:
:has()
是 CSS 中的一个功能性伪类选择器,它允许开发者根据元素的后代元素、兄弟元素或后续元素的存在或状态来选择目标元素。它本质上是一个“父选择器”或“关系选择器”,解决了 CSS 长期以来无法根据子元素反向选择父元素的痛点。
核心功能与语法 :
/* 选择包含匹配子元素的父元素 */
parent:has(childSelector) {/* 样式规则 */
}/* 选择包含匹配兄弟元素的元素 */
element:has(+ siblingSelector) {/* 样式规则 */
}
关键特性详解:
1.基于后代/兄弟关系选择
- 选择包含特定子元素的父元素:
/* 选择所有包含 <img> 子元素的 <div> */div:has(> img) {border: 2px solid blue;
}
- 选择包含特定兄弟元素的元素:
/* 选择紧邻 <h2> 的 <div> */
div:has(+ h2) {background: yellow;
}
2.支持复杂嵌套条件
可组合其他选择器实现精细控制:
/* 选择包含 "active" 类子按钮的卡片 */
.card:has(> .btn.active) {box-shadow: 0 0 10px red;
}
3.链式调用
允许多层条件筛选:
/* 选择包含已勾选复选框的表单 */
form:has(input[type="checkbox"]:checked) {background: lightgreen;
}
实际应用场景
1.动态表单反馈
当输入框无效时高亮其父容器:
.form-group:has(:invalid) {border-left: 3px solid red;
}
2.响应图片容器
为包含图片的卡片添加特殊样式:
article:has(figure > img) {padding: 1.5em;
}
3.交互状态联动
根据子元素状态改变父元素样式:
/* 下拉菜单展开时改变按钮颜色 */
.dropdown:has(.menu:visible) > .dropdown-btn {background: #555;
}
浏览器兼容性
浏览器 | 支持版本 |
---|---|
Chrome | 105+ (2022年起) |
Safari | 15.4+ (2022年起) |
Firefox | 121+ (2023年起) |
Edge | 105+ |
移动端浏览器 | 主流版本均已支持 |
提示:在旧版浏览器中需使用 JavaScript 实现类似逻辑。
注意事项
性能优化
避免在大型DOM树中使用复杂:has()
选择器,可能影响渲染性能。作用域限制
不能用于匹配伪元素(如::before
)。组合优先级
选择器优先级由:has()
内部的选择器决定:
/* 优先级等效于 div.foo:has(...) */
div:has(.foo) { ... }
总结:
:has()
彻底改变了 CSS 的选择器能力,使开发者能够基于子元素状态动态控制父元素样式,大幅减少对 JavaScript 的依赖,标志着 CSS 在现代 Web 开发中的重大进步。