无需登录 数据私有 本地保存

:has() 选择器测试场 - 父元素根据子元素动态样式

14
0
0
0

CSS :has() 选择器测试场

交互式体验「父元素根据子元素动态样式」——现代 CSS 的里程碑特性

1 图片检测
demo image
📷 卡片包含图片 → 边框高亮
.card:has(img) {
  border-color: gold;
  box-shadow: 0 4px 16px rgba(245,158,11,0.2);
}
2 复选框状态
.task-item:has(input:checked) {
  background: #ecfdf5;
  border-left: 3px solid #10b981;
}
3 错误状态检测
.form-field:has(.error-badge) {
  border-color: #ef4444;
  background: #fef2f2;
}
4 焦点感知容器
聚焦输入框试试
💡 焦点在容器内 → 卡片提升
.card:has(:focus-within) {
  box-shadow: 0 8px 28px rgba(99,102,241,0.2);
  transform: translateY(-3px);
}
5 空值提示
.field:has(input:placeholder-shown) {
  opacity: 0.55;
  border-style: dashed;
}
6 链接感知段落
这是一段包含重要链接的文本内容,:has() 选择器能够检测到它。
.content-block:has(a) {
  border-left-color: #8b5cf6;
  background: #faf9ff;
}
自定义 :has() 规则测试沙箱
📦 Box A
⭐ Box B (highlight)
📦 Box C
🏷 Box D (badge)
操作子元素:
💡 规则自动限定在 #custom-sandbox 作用域内,安全无忧
快速预设: 高亮盒子 徽章盒子 选中复选框 聚焦元素 不含高亮
常见问题与知识点

:has() 是一个关系伪类选择器,它可以选择包含特定子元素的父元素。例如 div:has(p) 会选择所有包含 <p> 标签的 <div>。传统CSS只能向下选择(父→子),而 :has() 实现了"向上查询"的能力,因此被称为"父选择器"。实际上它更强大——可以选择包含任意后代、或满足特定条件的兄弟元素之前的元素。

截至2025年,:has() 已在所有主流浏览器中获得支持:Chrome 105+、Edge 105+、Safari 15.4+、Firefox 121+。全球覆盖率超过95%。对于旧浏览器,建议使用 @supports selector(:has(*)) 进行特性检测并提供降级方案。移动端iOS Safari 15.4+和Android Chrome均完全支持。

应用场景丰富:① 表单验证——包含错误信息的字段组自动高亮;② 卡片布局——包含图片的卡片自动调整样式;③ 状态响应——检测焦点、选中、悬停等状态改变父容器样式;④ 空状态处理——检测空内容区域显示不同UI;⑤ 组件变体——根据内部结构自动切换组件样式;⑥ 数量查询——根据子元素数量调整网格布局;⑦ 暗色模式——检测特定子元素存在来切换主题。

可以!:has() 支持嵌套,例如 section:has(article:has(img)) 会选择包含带有图片的文章的section。也可以链式使用:.form:has(input:invalid):has(.error-msg)。但需要注意性能——深层嵌套会增加浏览器重评估的计算成本,建议嵌套深度不超过2-3层。

:has() 的性能在大多数场景下表现良好,但需注意:① 避免在 :has(*) 中使用通配符匹配大量元素;② 尽量限定作用域,如 .container:has(.specific-class) 而非 body:has(...);③ 减少深层嵌套;④ 利用 :has(> 直接子元素) 比后代选择器更高效;⑤ 避免在动画帧中频繁触发 :has() 重新评估。浏览器引擎已针对 :has() 进行了大量优化,实际影响通常可忽略。

关键区别:① CSS :has() 是声明式的,浏览器自动响应DOM变化,无需手动监听;② JS方案 需要手动遍历或使用 closest(),并在DOM变化时重新执行;③ :has() 可以结合其他选择器实现复杂组合,CSS的可维护性更高;④ :has() 可被CSS过渡/动画使用;⑤ JS方案在极致性能优化场景下可提供更精细的控制。推荐优先使用 :has(),仅在需要复杂逻辑时使用JS。

:has() 内支持绝大多数CSS选择器:伪类——:hover, :focus, :checked, :valid, :invalid, :empty, :nth-child(), :focus-within, :placeholder-shown 等;组合器——后代空格、直接子元素 >、相邻兄弟 +、后续兄弟 ~属性选择器——[attr], [attr=value] 等。几乎支持所有简单选择器的组合。

使用CSS特性检测:@supports selector(:has(*)) { /* 支持时的样式 */ }@supports not selector(:has(*)) { /* 降级方案 */ }。在JavaScript中:CSS.supports('selector(:has(*))') 返回布尔值。建议始终提供降级样式,确保在不支持:has()的旧浏览器中体验不受严重影响。
💡 所有示例均使用真实 CSS :has() 规则,实时响应 DOM 变化 · 打开开发者工具查看实际生效的样式