旧版浏览器完全不支持@layer和&嵌套语法,Chrome≤115、Firefox≤124、Safari≤17.3及所有IE版本会静默忽略嵌套块,必须用postcss-nesting等插件在构建时展开为扁平CSS才能兼容。
CSS 嵌套(Nested CSS)是 W3C 在 CSS Nesting Module Level 1 中标准化的语法,但它是近年才被主流引擎逐步实现的功能。Chrome 116+、Firefox 125+、Safari 17.4+ 才开始稳定支持;而所有 IE 版本、Chrome ≤115、Firefox ≤124、Safari ≤17.3 都直接忽略嵌套块,连报错都不会有——整段样式被跳过,子选择器失效,样式“凭空消失”。
典型现象:.card { color: red; .title { font-size: 1.2em; } } 在 Safari 17.2 中,.card 的 color 生效,但 .title 完全没渲染,控制台也无警告。
像 postcss-nesting 这类工具,并不会让旧浏览器“运行时理解嵌套”,它是在构建阶段把嵌套结构展开成扁平 CSS:
.card {color: red;& .title {font-size: 1.2em;}}
→ 编译后变成:
.card { color: red; }.card .title { font-size: 1.2em; }
所以必须确保:
postcss.config.js 并启用 postcss-nesting
postcss 版本 ≥8.4,且插件版本与 PostCSS 主版本兼容(如 [email protected] 要求 PostCSS ≥8.4)css.postcss)不同嵌套语法被不同插件支持,混用会出问题:
& 是 postcss-nesting 的传统写法,兼容性好,但不支持复杂嵌套(如跨层级 & + &)@nest 是标准语法,需 postcss-nesting@13+ 或 postcss-preset-env 启用,但旧版插件直接报错 Unknown word
&)和原生嵌套(@nest),PostCSS 可能只处理其中一种,另一部分被丢弃检查方法:在编译后 CSS 文件里搜索 .card .title 是否存在;如果不存在,说明嵌套语句根本没被插件识别。
某些嵌套写法依赖父容器的渲染行为,比如:
article {display: contents;> h2 { margin-top: 0; }}
但 display: contents 在 Firefox ≤62、Safari ≤15.4、所有 IE 中不可用——此时 > h2 的父级上下文丢失,选择器退化为无效或匹配错误节点。
这类问题不会报错,但布局错乱。建议:
display: contents、contain 等新特性caniuse 查目标浏览器对 display: contents 的支持率,再决定是否保留该嵌套分支嵌套语法本身简洁,但它的“失效”往往不是语法错,而是构建链路断了、插件没生效、或底层 CSS 特性不支撑——先查编译输出,再看运行时 DOM 结构,比调样式优先级更管用。