应控制嵌套层级在2层以内,用&拼接伪类(如&:hover)和BEM修饰符(如&__item),避免无空格误写或跨层引用,防止生成高特异性冗长选择器。
直接用 & 嵌套会生成冗长的选择器链,比如 .header .nav .item:hover,这种写法容易被其他样式覆盖,尤其在组件复用时。Sass 的 & 是安全的,它只拼接父选择器;Less 的嵌套默认行为也类似,但没 & 时容易误写成独立类名。
&:hover 表示 “当前选择器 hover 状态”,&__content 表示 BEM 子元素,不会额外加空格&:hover,但若漏掉 & 写成 .item,就会变成新选择器,编译后脱离上下文0,1,3,0 级别规则变量不能直接插进选择器名里——$name 或 @name 放在选择器中间会被当作文本字面量,不是动态拼接。想实现 .btn-primary、.btn-danger 这类变体,得靠 @each(Sass)或 .each()(Less)循环,而不是字符串拼接。
@each $type, $color in (primary: #007bff, danger: #dc3545) { .btn-#{$type} { background-color: $color; } }
~".btn-@{type}" 只在属性值里有效),必须用 .each() 配合 extract() 拆数组#{} 或 ~"" 拼选择器,Webpack 构建时可能报 Invalid CSS after "...": expected "}", was "."
Mixin 本身不带作用域,@include 或 .mixin-name() 插入的位置决定嵌套上下文。错放在顶层,& 就失效;放在嵌套块内,才能继承父级选择器。
.card { @include hover-state; } 要求 hover-state 里写 &:hover { ... },否则编译后是 :hover(无父级).card { .hover-state(); } 同样依赖 mixin 内部是否用了 &:hover
.btn:hover——这会让它脱离调用上下文,失去复用价值看起来嵌套写对了,但生成的 CSS 里要么多出一堆重复规则,要么某条样式完全没出现,大概率是预处理器解析顺序或作用域问题。
立即学习“前端免费学习笔记(深入)”;
@import 和 Less 的 @import 行为不同:Sass @import 是合并文件再编译,Less 默认是单独编译再拼接,@import (multiple) 才能模拟 Sass 行为$color: red; .a { $color: blue; color: $color; }),Sass 会按块作用域生效,Less 则全局覆盖——这是 Less 里最常导致样式错乱的原因--no-cache:旧缓存可能导致嵌套变更不生效,尤其在 VS Code + Live Sass Compiler 插件中