用现代CSS替换Less

阅读 23
标签: CSS

相信不少人(前辈,或者说老人)都领教过写CSS的痛苦。下面一张5年前发布在reddit的CSS梗图:

一个胖子在努力地调整窗帘,可惜无论他怎么努力,窗帘都无法按照他的想法来调整。经过一番折腾后,实在忍无可忍,他一把扯掉了整个窗帘。可见在早期写CSS是多么让人抓狂。

好消息是开源社区做了很多工作来帮助开发者提高效率,降低写CSS的痛苦。比如出现了Less、Sass等工具。

更大的好消息是现在(2026年),我们可以使用原生CSS来解决问题,毕竟,用Less、Sass等工具需要额外的转译和配置。

对于中小型项目而言,我认为最需要的是下面几种功能,尤其是嵌套和变量。

嵌套

我们来看一个例子:

<div class="parent">
    <div class="child">child</div>
</div>

上面是一个简单的父子元素,我们来设置它们的样式:

.parent {
    background: #ddd;
    padding: 10px;
}
.parent .child {
    font-weight: bold;
}
.parent .child:hover {
    color: orange;
}
.parent .child::before {
    content: '*';
}

看见没,一个parent需要写4次,一个child需要写3次,并且各自之间的关系也不明确。如果代码量很少的情况下,还可以忍受。但是规模一旦起来,冗余元素就非常多,写起来贼难受,阅读起来也难受。

CSS 在2023年引入了css nesting,这个功能本应该在很早就推出来的。虽迟但到,有这个功能后,我们可以按层级编写样式:

.parent {
  background: #ddd;
  padding: 10px;

  .child {
    font-weight: bold;

    &:hover {
      color: orange;
    }
    &::before {
      content: '*';
    }
  }
}

立马清爽了不少。这个功能解决了层级书写繁琐的问题,可以说是非常刚需。

变量和引入

另外一个就是变量功能,这个功能在动态主题上非常刚需。如果网站要设置Dark模式和Light模式多种主题,如果有变量,会方便不少。

这里以Less为例。比如,在var.less文件中定义一个变量:

@link-color: #04c9d7;

然后,在其他less文件中引入这个var.less文件,就可以使用这个变量了:

@import '../common/var.less'; 

a {
    color: @link-color;
}

用现代CSS来做的话,首先,在var.css文件中定义变量:

:root {
  --link-color: #04c9d7;
}

和Less不同,CSS 变量必须依附在某个选择器上,所以,这里使用了:root,表示最高级别的选择器,代表整个文档的根元素,相当于告诉浏览器"这些变量在整个页面都可以使用"。当然,你也可以将变量定义在其他DOM元素或其他选择器上。

CSS变量的命名--开头。

然后,在其他css文件中引入并使用:

@import '../common/var.css';

a {
  color: var(--link-color);
}

var() 是 CSS 的原生函数,专门用来读取 CSS 变量的值。这么看来,感觉比Less的变量定义更加清晰。

混入

最后一个是混入(Mixins)。

混入是将一组属性从一个规则集混入到另一个规则集的方法。假设我们在less文件中定义一个规则集:

.bordered {
  border-top: dotted 1px black;
  border-bottom: solid 2px black;
}

我们希望在其他规则集中使用这些属性。只需在使用这些属性的类名后面加上类名即可,像这样:

#menu a {
  color: #111;
  .bordered();
}

这种方式也可以减少我们的CSS冗余代码。

可惜,目前CSS无法做到,但是 W3C 草案(CSS Functions and Mixins Module)已经在往这个方向发展了。

但这个功能实际开发用的不多。另外,即便没有这个功能,也可以通过其他方式间接实现。所以,倒没有那么刚需。

参考

最后编辑于: 2026-04-23

评论(0条)

(必填)
复制成功