309 字
2 分钟
CSS 原生嵌套:可以扔掉预处理器了
CSS 嵌套从新奇特性变成 Baseline 已经两年多,这次重构我把一个老项目的 Sass 全部拆掉了,构建链少一个依赖,样式行为零变化。
基本语法
.card { padding: 1rem;
& .title { font-size: 1.25rem; }
&:hover { background: var(--bg-hover); }
@media (width >= 768px) { padding: 2rem; }}和 Sass 最大的区别是元素选择器必须带 &。Sass 里可以直接写 .card { h2 {} },原生语法要求写成 & h2,否则浏览器不认。迁移时脚本批量替换这一处就能跑通大半。
真正的好处
- 少一层编译,样式调试时 Sources 面板里看到的行号就是源文件行号
- 媒体查询可以写在选择器内部,响应式样式不再割裂在文件两头
- 和
:has()、层叠层(@layer)这些新能力组合使用,选择器权重问题好控多了
兼容性处理
老项目还要照顾旧浏览器的话,PostCSS 一行配置就能垫平:
postcssPresetEnv({ features: { 'nesting-rules': true } })新项目我建议直接裸写,不做任何转译。不支持嵌套的浏览器如今和不支持 flexbox 的占比差不多,为它们多养一个构建步骤不划算。
CSS 原生嵌套:可以扔掉预处理器了
https://oliver6868686.tech/posts/css-nesting/