Sass 继承机制详解
@extend 继承规则
@extend 是 Sass 中强大的功能,允许一个选择器继承另一个选择器的样式。
基本用法
1 | .error { |
编译结果为:
1 | .error, .serious-error { |
继承嵌套选择器
1 | .button { |
多重继承
1 | .alert { |
%placeholder 占位符选择器
占位符选择器以 % 开头,只用于被继承,不会被编译到最终 CSS 中。
基本用法
1 | %button-base { |
编译结果为:
1 | .primary-button, .secondary-button { |
占位符的优势
- 不会生成多余的 CSS 代码
- 提供清晰的抽象层
- 使代码结构更清晰
继承与混合的适用场景对比
适用继承(@extend)的场景:
共享基础样式:当多个选择器需要共享完全相同的样式时
1
2
3
4
5
6
7
8%form-control {
padding: 8px;
border: 1px solid #ddd;
}
.text-input, .select-input, .textarea-input {
@extend %form-control;
}语义化关系:当选择器之间有明显的”是一种”关系时
1
2
3
4
5
6
7
8.animal {
color: black;
}
.cat {
@extend .animal;
sound: "meow";
}减少重复代码:当需要减少生成的 CSS 体积时
适用混合(@mixin)的场景:
需要参数化样式:当样式需要根据不同参数变化时
1
2
3
4
5
6
7@mixin box-shadow($x, $y, $blur, $color) {
box-shadow: $x $y $blur $color;
}
.card {
@include box-shadow(0, 2px, 4px, rgba(0,0,0,0.1));
}生成动态样式:当需要基于计算生成样式时
1
2
3@mixin responsive-font($min-size, $max-size) {
font-size: clamp(#{$min-size}, 2vw, #{$max-size});
}需要厂商前缀:当需要生成带前缀的样式时
1
2
3
4
5@mixin transform($property) {
-webkit-transform: $property;
-ms-transform: $property;
transform: $property;
}
对比总结
| 特性 | @extend | @mixin |
|---|---|---|
| 编译结果 | 合并选择器 | 复制样式到每个调用处 |
| 参数支持 | 不支持 | 支持 |
| 代码输出 | 更紧凑 | 可能更冗长 |
| 适用场景 | 静态样式共享 | 动态样式生成 |
| 选择器关系 | 建立选择器之间的关系 | 不建立选择器关系 |
| 性能考虑 | 可能生成复杂的选择器组 | 可能导致代码重复 |
最佳实践建议
- 优先使用占位符:当不需要单独使用基础样式时,使用
%placeholder而不是普通类名 - 混合用于动态样式:当样式需要参数化或计算时使用
@mixin - 避免过度继承:深度继承链会使 CSS 难以维护
- 注意选择器顺序:
@extend受 CSS 层叠规则影响 - 考虑输出大小:对于大量重复的静态样式,
@extend通常能生成更小的 CSS