Less的extends和Mixin
七崽爱吃小饼干2026/02/28阅读 2
extends和Mixin是less中最常用的两种代码复用特性。两者在实现原理上有所不同,最终编译生成的css文件也有所不同。
一、Mixin(混入)
Mixin 是 Less 中最常用的特性之一,可以把它理解成代码片段的复用 —— 你可以定义一段样式(比如一个类、ID 甚至是选择器),然后在其他地方直接“混入”这段样式,避免重复写相同的 CSS 代码。
1. 基础用法
less
// 定义一个Mixin(带括号的Mixin不会被编译成独立的CSS类)
.base-style() {
color: #333;
font-size: 14px;
padding: 10px;
}
// 在其他选择器中混入这个样式
.button {
.base-style(); // 混入base-style的所有样式
background: #007bff;
border: none;
}
.card {
.base-style(); // 复用同一个Mixin
border: 1px solid #eee;
border-radius: 4px;
}
编译后的 CSS:
css
.button {
color: #333;
font-size: 14px;
padding: 10px;
background: #007bff;
border: none;
}
.card {
color: #333;
font-size: 14px;
padding: 10px;
border: 1px solid #eee;
border-radius: 4px;
}
2. 带参数的 Mixin(更灵活)
Mixin 还可以传参数,实现动态样式:
less
// 带默认参数的Mixin
.rounded(@radius: 4px) {
border-radius: @radius;
}
.button {
.rounded(); // 使用默认值4px
}
.card {
.rounded(8px); // 传入自定义值8px
}
编译后的 CSS:
css
.button {
border-radius: 4px;
}
.card {
border-radius: 8px;
}
二、Extends(扩展)
Extends 是 Less 中另一种样式复用方式,核心是选择器的继承 —— 它不会把样式复制到目标选择器中,而是将目标选择器和被继承的选择器合并成一个选择器组,减少 CSS 代码体积。
1. 基础用法
less
// 定义基础样式(普通类选择器)
.base-style {
color: #333;
font-size: 14px;
padding: 10px;
}
// 扩展base-style的样式
.button {
&:extend(.base-style); // 继承base-style的所有样式
background: #007bff;
border: none;
}
.card {
&:extend(.base-style); // 继承base-style的所有样式
border: 1px solid #eee;
border-radius: 4px;
}
编译后的 CSS:
css
.base-style, .button, .card {
color: #333;
font-size: 14px;
padding: 10px;
}
.button {
background: #007bff;
border: none;
}
.card {
border: 1px solid #eee;
border-radius: 4px;
}
2. 扩展的进阶用法
- 扩展所有匹配的选择器:
&:extend(.base-style all);(比如继承.base-style:hover这类嵌套样式) - 全局扩展:
@media screen { .button:extend(.base-style); }(跨媒体查询继承)
三、Mixin vs Extends 核心区别
| 特性 | Mixin(混入) | Extends(扩展) |
|---|---|---|
| 编译后表现 | 把样式复制到目标选择器中 | 合并选择器,样式只保留一份 |
| 代码体积 | 可能冗余(重复样式) | 更精简(复用选择器) |
| 灵活性 | 支持参数、条件判断,灵活度高 | 仅支持选择器继承,无参数功能 |
| 适用场景 | 动态样式(如不同圆角、颜色)、局部样式 | 静态样式复用(如基础布局、通用文本样式) |
四、适用场景建议
-
用 Mixin 的场景:
- 需要动态调整样式(比如不同尺寸的按钮、不同颜色的主题);
- 样式片段较短,且复用次数少(避免少量复用导致的代码冗余);
- 需要结合条件判断、循环等逻辑(Mixin 支持
when条件、for循环)。
-
用 Extends 的场景:
- 通用静态样式(比如页面的基础文本样式、布局容器样式);
- 复用次数多的样式(比如全站通用的
.text-center、.clearfix); - 追求 CSS 代码体积精简(比如生产环境优化)。
总结
- Mixin 是“复制式复用”,支持参数和逻辑,灵活但可能产生冗余代码,适合动态样式;
- Extends 是“合并式复用”,无冗余但不支持动态参数,适合静态通用样式;
- 实际开发中可结合使用:静态基础样式用 Extends 精简体积,动态样式用 Mixin 实现灵活调整。