选中父元素下的“特殊元素”需先明确定义“特殊”的具体含义,再结合后代选择器(空格)与子代选择器(>)精准定位,避免过度嵌套,优先通过语义化class辅助选择。
想选中父元素下的“特殊元素”,关键不是堆砌选择器,而是明确你指的“特殊”是什么——是某个类名、属性、状态,还是特定位置或类型?CSS 本身没有“特殊元素”这个概念,但可以通过后代选择器(空格)和子代选择器(>)混合使用,精准定位符合多重条件的元素。
所谓“特殊”,常见有这几类:
.highlight、[data-role="menu"])svg、button、input[type="submit"])
一个 span):hover、:checked、:nth-child(2n))单独用 div span(后代)太宽泛,只用 div > span(子代)又太死板。混合使用才能灵活控制层级深度:
.card > .content span.highlight:选中 .card 的直接子元素 .content 内部的所有 span.highlight(不限嵌套深度).modal > .header + .body > p:first-of-type:选中 .modal 下直接子元素 .header 后面紧邻的 .body,再从中找其直接子元素 p 中的第一个nav > ul > li:not(:last-child) > a:导航中每个非末尾菜单项里的链接(注意层级与逻辑结合)混合选择器容易写错层级或语义,导致不生效:
> 混用错位,比如 section > .item .title 表示:section 的直接子元素中带 .item 的元素内部任意后代的 .title;而 section > .item > .title 才表示直接子元素关系[disabled] 和 :hover 不影响层级判断,只追加条件与其拼命写复杂选择器,不如在 HTML 中加轻量 class 表达意图:
class="js-target" 或 class="theme-primary",然后写 .card .theme-primary
card__title--large),让选择器更直观:.card__body .card__title--large
is-loading),CSS 写 .btn.is-loading,比查 DOM 结构稳定得多基本上就这些。混合选择器不是越长越强,而是越准越有用。先理清结构意图,再挑合适的组合方式,比盲目套语法更高效。