多多读书
764 字
4 分钟
都2024年了,你还在用SASS/LESS写CSS嵌套吗?
2024-07-18

CSS 预处理器(如 SASS 和 LESS)仍然是绝大部分项目中必不可少的一部分,它们的广泛使用源于 CSS 嵌套的便利。然而,需要通过编译器转换成原生 CSS 代码仍然是一个痛点。那么,你是否知道原生 CSS 已经支持嵌套写法了?自去年 9 月起,CSS 原生嵌套被正式纳入规范,后续各大主流浏览器也相继进行了兼容。如今,我们可以真正用上原生 CSS 嵌套而不需要编译了。

CSS 嵌套的优势#

  1. 代码更简洁:通过减少重复的选择器名称,使 CSS 代码更加清晰易读。
  2. 维护更方便:修改父选择器时,所有嵌套的子选择器样式也会自动更新,极大简化了样式的维护。
  3. 提高开发效率:减少了书写冗余代码的时间,让开发者可以更专注于设计和功能实现。

基础嵌套#

最基础的嵌套写法与 SCSS/LESS 相似,也提供了一个 & 嵌套符。

/* 没有嵌套符 */
.parent {
  .child {
  }
}

/* 有嵌套符 */
.parent {
  & .child {
  }
}

上述两种写法都能实现相同的嵌套效果,但在某些场景中,使用 & 是必要的。例如,对于复合选择器 class="a b",需要使用 & 嵌套符来正确定位类 b,否则类 a 和类 b 会被解释为父子关系。

/* 正确写法 */
.a {
  &.b {
  }
}

同样,伪类和伪元素也需要 & 嵌套符进行定位。

.a {
  /* .a 样式 */
  &:hover {
  }

  &:first-child {
  }
}

附加嵌套#

嵌套符 & 也可以追加到另一个父选择器的后面,用于在不同父选择器下为同一个元素设置不同样式。这在父元素样式改变时非常有用,例如:

<div class="wrapper">
  <div class="item">
    <h2>VIP</h2>
    <span>20/月</span>
  </div>
  <div class="item active">
    <h2>SVIP</h2>
    <span>40/月</span>
  </div>
  <div class="item">
    <h2>SSVIP</h2>
    <span>80/月</span>
  </div>
</div>
.wrapper {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 20px;
  color: #333;

  .item {
    display: flex;
    align-items: center;
    justify-content: center;
    flex-direction: column;
    width: 200px;
    height: 250px;
    border: 1px solid #c8c9cc;
    border-radius: 10px;

    h2 {
      margin: 0 0 10px;
      /* 选中父类 active 下的 h2 元素 */
      .active & {
        color: #1989fa;
      }
    }
  }
}

在上面的代码中,当父元素具有类 active 时,h2 元素的文字颜色会发生改变。这样写的好处是,所有 h2 相关的样式都集中在一起,逻辑更加合理,也更易维护。

不可用功能#

在 SASS/LESS 等预处理器中,可以使用 & 来连接字符串形成新的类,但在 CSS 原生写法中这是不可用的。

/* 不可用 */
.component {
  &__child-element {
  }
}

/* 预处理器结果 */
.component__child-element {
}

如果使用无效的选择器符号(如 %),也会被忽略。

.parent {
  & %invalid {
    /* %invalid 无效选择器 */
  }
}

总之,CSS 原生嵌套已经非常强大,并且得到了各主流浏览器的支持。SASS 和 LESS 等预处理器的时代将逐渐过去。赶紧尝试在新项目中使用 CSS 原生嵌套吧!

都2024年了,你还在用SASS/LESS写CSS嵌套吗?
https://fuwari.vercel.app/posts/20240718/
作者
我也困了
发布于
2024-07-18
许可协议
CC BY-NC-SA 4.0