CSS
彼时 CSS 原生嵌套还处于工作草案 Working Draft (WD) 阶段,而今天(2023-09-02),CSS 原生嵌套 Nesting 终于成为了既定的规范!
现代 CSS 解决方案:原生嵌套(Nesting) - 图1

CSS 原生嵌套语法

在之前,只有在 LESS、SASS 等预处理器中,才能使用嵌套的写法,像是这样:

  1. div {
  2. & > p {
  3. color: red;
  4. }
  5. &:hover {
  6. color: yellow;
  7. }
  8. }

从 Chrome 112 开始,原生 CSS 也可以使用嵌套语法了。
其语法规则大致如下:

  1. parentRule {
  2. /* parent rule style properties */
  3. & childRule {
  4. /* child rule style properties */
  5. }
  6. }

CSS 原生嵌套语法能力边界

大部分同学对嵌套应该还是非常熟悉的,下面一起看看,CSS 原生嵌套的能力边界,语法支持范围。

支持嵌套,并且支持多层嵌套

这个很好理解,直接看 DEMO:

  1. <div class="g-container">
  2. <h3 class="g-h3">CSS
  3. <span class="g-span">Nesting</span>
  4. </h3>
  5. </div>
  1. div {
  2. border: 1px solid #000;
  3. .g-h3 {
  4. color: red;
  5. .g-span {
  6. color: blue;
  7. }
  8. }
  9. }

效果如下:
现代 CSS 解决方案:原生嵌套(Nesting) - 图2
当然,这里有个值得注意的点。如果不使用具体的 ClassName,而是使用标签名称选择器,像是这样:

  1. div {
  2. border: 1px solid #000;
  3. h3 {
  4. color: red;
  5. span {
  6. color: blue;
  7. }
  8. }
  9. }

嵌套规则是不会生效的,此时,需要在标签名称选择器前,加上 & 符号:

  1. div {
  2. border: 1px solid #000;
  3. & h3 {
  4. color: red;
  5. & span {
  6. color: blue;
  7. }
  8. }
  9. }

与 SASS 等类似,& 符号在嵌套中,也表示嵌套的父选择器本身,因此,上面两个嵌套选择器最终的表达式实则为:

  • div h3 { color: red };
  • div h3 span { color blue };

    在嵌套中使用伪元素和伪类

    直接上代码,这个也是传统 CSS 预处理器支持的内容:

    1. div {
    2. /* ... */
    3. &:hover {
    4. color: red;
    5. }
    6. &:is(.content, footer) {
    7. padding: 16px;
    8. }
    9. &::before {
    10. content: "";
    11. /* ... */
    12. }
    13. }

    上述代码中,能够在嵌套中使用伪类、伪元素。

    在嵌套中使用媒体查询

    这个就比较有意思了,甚至可以在嵌套中,使用媒体查询语法。

    1. <div class="g-container">
    2. <h3>CSS Nesting without @media</h3>
    3. </div>
    4. <div class="g-container media">
    5. <h3>CSS Nesting with @media</h3>
    6. </div>
    1. .media {
    2. @media (min-width: 600px) {
    3. & h3 {
    4. color: red;
    5. }
    6. }
    7. }

    此时,下方带有 .media class 的容器,在视口宽度大于 600px 的时候,设置 color: red
    效果如下:
    现代 CSS 解决方案:原生嵌套(Nesting) - 图3

    在嵌套中嵌套自身

    什么是在嵌套中嵌套自身
    其实也很好理解,也就是 & 符号的时候,上面提到了,& 符号在嵌套中,也表示嵌套的父选择器本身,因此,还可以有这样的写法:

    1. div {
    2. & h2 & {
    3. /* 表示 div h2 div {} */
    4. }
    5. }

    这种写法也是允许的,只需要将 & 替换成 div 即可,此时表示 div h2 div {}

    总结一下

    总结而言,CSS 原生的嵌套功能相当强大,基本是传统预处理器的平替。使用嵌套规则的好处在于:

  1. 更加易读和易维护,嵌套帮助我们编写更易于维护的 CSS,基于嵌套,可以更好的控制样式的作用域
  2. 更少的代码,嵌套帮助我们编写更少的代码,因为不需要一遍又一遍地重复父选择器

随着兼容性的铺开,慢慢地,可以尝试真正运用它们到实际代码中。