使用&进行精确控制和灵活性
假设您想要选择.demo元素,并使用:not()选择器。这时就需要使用&:
.demo { &:not() { ... } }
这将.demo和:not()合并为.demo:not(),与之前的示例.demo :not()不同。这一点非常重要,当您想要嵌套:hover交互时,需要特别注意。
.demo { &:hover { /* .demo:hover */ } :hover { /* .demo :hover */ } }
更多嵌套示例
CSS嵌套规范中包含了更多示例。如果您想通过示例了解更多关于语法的内容,该规范涵盖了各种有效和无效的示例。
接下来的几个示例将简要介绍CSS嵌套的更多特性,帮助您了解其广泛的功能。
嵌套@media
在样式表中,如果要修改选择器及其样式的媒体查询条件位于不同的地方,这可能会分散注意力。使用嵌套,您可以将媒体查询条件直接嵌套在上下文中。
为了方便起见,如果嵌套的媒体查询仅修改当前选择器上下文的样式,则可以使用最简化的语法。
.card { font-size: 1rem; @media (width >= 1024px) { font-size: 1.25rem; } }
使用&也可以:
.card { font-size: 1rem; @media (width >= 1024px) { &.large { font-size: 1.25rem; } } }
这个示例展示了使用&的扩展语法,同时也针对.large
卡片进行了定位,以展示继续工作的其他嵌套特性。
了解更多关于嵌套@media的内容。
任意嵌套
到目前为止,所有的示例都是在前一个上下文中继续或附加选择器。如果需要,您可以完全更改或重新排列上下文。
.card { .featured & { /* .featured .card */ } }
&符号表示选择器对象的引用(不是字符串),可以放置在嵌套选择器的任何位置。甚至可以多次放置:
.card { .featured & & & { /* .featured .card .card .card */ } }
虽然这个示例看起来有点没有用,但在某些情况下,能够重复选择器上下文是很方便的。
无效的嵌套示例
在嵌套中,有几种语法场景是无效的,如果您之前使用预处理器进行嵌套,可能会对此感到惊讶。关于有效嵌套语法的速查表可以在本文的理解嵌套解析器部分找到。
嵌套元素标签名
HTML元素目前需要在前面加上&符号或使用:is()进行包装。
.card { h1 { /* 🛑 h1 does not start with a symbol */ } }
通过以下语法进行修复:
.card { & h1 { /* ✅ now h1 starts with a symbol */ } /* or */ :is(h1) { /* ✅ now h1 starts with a symbol */ } }
嵌套和连接
许多CSS类命名约定依赖于嵌套能够像连接字符串一样连接或附加选择器。但在CSS嵌套中,这种方法是无效的,因为选择器不是字符串,而是对象引用。
.card { &--header { /* is not equal to ".card--header" */ } }
更详细的解释可以在规范中找到。
混合嵌套和声明
考虑以下嵌套的CSS块:
.card { color: green; & { color: blue; } color: red; }
.card元素的颜色将是蓝色。
所有混合的样式声明都会被提升到顶部,就好像它们是在嵌套之前编写的一样。更多细节可以在规范中找到。
理解嵌套解析器
要在CSS嵌套中取得最好的效果,我们可以研究解析器在处理嵌套时的工作原理。了解这一点,我们可以自信地嵌套样式,而不必经常查找规则。
首先,最简单的方法是识别触发解析器开始消耗嵌套样式的符号。
& @ : . > ~ + # [ *
这些符号应该看起来很熟悉。其中一些是组合器,一些是选择器。所以最简单的情况是,如果解析器发现您的嵌套选择器,并且它不以这些符号之一开头,它将失败,并错误地消耗您的样式。
