用途:CSS :has() 关系型伪类的权威参考,用原生 CSS 替代 JS 驱动的父级状态类,实现“由子元素决定父元素样式”。
主要能力:支持四种关系形态——后代 .gallery:has(img.broken)、直接子级 .gallery:has(> img)、相邻兄弟 h2:has(+ p)、通用兄弟 .section:has(~ .footer),并可用逗号表示 OR、链式表示 AND。可仅用 CSS 完成表单状态编排(如 form:has(input:invalid) [type=submit] 禁用提交按钮)与兄弟感知布局(如 h2:has(+ p) 去掉标题下边距)。
用法与限制:语法为 <anchor-selector>:has(<relative-selector-list>)。优先级取内部选择器的最高值(不含 :has 本身)。硬性限制::has() 内不可放伪元素、不可作为伪元素的锚点、不可嵌套,且不匹配锚点自身。
性能要点:必须锚定尽可能小的子树,避免 body:has(...) 或 div:has(...) 这类无界选择器;用类名收窄锚点、用 > + ~ 限制遍历深度。
适用场景:父级按子级存在或状态设样式、兄弟节奏、容器驱动布局。需要 :focus 时优先用 :focus-within;JS 已维护的状态直接切类名更快更明确。2026 年 :has() 已无需默认门控,需兼容旧浏览器时用 @supports selector(:has(*)) 并回退,使其对外规则宽容可包在 :is() 或 :where() 中。基线状态:2023 年 12 月起新近可用。