能,Extend在Less中可复用已声明的选择器(如.btn),但不支持未定义类、变量或纯属性块;%占位符更安全,因不输出CSS,避免冗余和覆盖风险。

Extend在Less中到底能不能复用选择器?
能,但必须是已存在的、带名字的选择器(比如 .btn 或 #header),不能 extend 一个纯属性块或未定义的占位符(除非你显式声明为 %placeholder)。很多人写 &:extend(.undefined) 结果编译报错,就是因为目标选择器根本没出现过。
为什么用%placeholder比直接.class更安全?
因为 %placeholder 不会输出 CSS,只作为 extend 的“靶子”,避免意外生成无用样式。而直接 extend 普通 class,如果那个 class 本身有样式,就会被复制两遍——一次是原定义,一次是 extend 引入的,造成冗余甚至覆盖风险。
推荐做法:
- 抽象公共样式时,优先定义
%clearfix、%text-center这类占位符 - 需要真实输出的 class(如
.btn)再单独定义,并可被其他规则 extend - 不要在 extend 中跨文件依赖,确保被 extend 的目标已在当前作用域或已
@import
&:extend() 的写法和常见错误
extend 必须写在选择器末尾,紧跟 { 前,不能放在属性里,也不能嵌套在 media query 内部(Less 3.5+ 支持部分嵌套 extend,但兼容性差,不建议)。
立即学习“前端免费学习笔记(深入)”;
典型错误示例:
.card {
&:extend(.shadow); // ✅ 正确:写在选择器内
color: #333;
}
.card:hover {
&:extend(.shadow); // ✅ 可以多次 extend 同一个目标
}
.card {
.shadow; // ❌ 错误:这是 mixin 调用,不是 extend
}
注意:&:extend() 不继承伪类、属性选择器等复杂匹配,比如 .btn:hover 无法被 .btn 的 extend 捕获。
Extend 和 Mixin 选哪个?
看是否需要参数和逻辑分支:需要传参、条件判断、计算,就用 .mixin();只要静态样式复用、追求最终 CSS 更紧凑,就用 %placeholder + &:extend()。后者生成的 CSS 更扁平,但灵活性归零——改一个占位符,所有 extend 它的地方全变,没有中间层缓冲。
容易被忽略的一点:extend 无法穿透嵌套层级做“向上匹配”。比如你在 .modal .body 里写 &:extend(.text-small),它不会去匹配 .modal .text-small,只找顶层定义的 .text-small 或 %text-small。


















