Note 2
使用 sass 实现主题切换
scss
@use 'sass:map';
$themes: (
'light': (
textColor: '#333',
bgColor: '#fff'
),
'dark': (
textColor: '#fff',
bgColor: '#333'
),
'gray': (
textColor: '#666',
bgColor: '#eee'
)
);
$curTheme: '';
@mixin useTheme {
@each $key, $value in $themes {
$curTheme: $key !global;
html[data-theme='#{$key}'] & {
@content;
}
}
}
@function getVar($key) {
$themeMap: map.get($themes, $curTheme);
@return map.get($themeMap, $key);
}
.container {
font-size: 12px;
@include useTheme {
color: getVar('textColor');
background-color: getVar('bgColor');
}
}生成的 CSS 如下:
css
.container {
font-size: 12px;
}
html[data-theme=light] .container {
color: "#333";
background-color: "#fff";
}
html[data-theme=dark] .container {
color: "#fff";
background-color: "#333";
}
html[data-theme=gray] .container {
color: "#666";
background-color: "#eee";
}.sass & .scss
它们的主要区别在于书写风格。
- SCSS(Sassy CSS):是
Sass的新语法,写法与原生CSS几乎完全一样,使用花括号{}和分号;。 - Sass(缩进语法):是
Sass的原始语法,使用缩进和换行来代替花括号和分号,更加简洁。
详细对比
1. SCSS (.scss 后缀)
SCSS 是 CSS 的超集,这意味着任何合法的 CSS 代码也同样是合法的 SCSS 代码。如果你直接把一个 CSS 文件的后缀改为 .scss,它可以直接被编译。
特点:
- 使用花括号
{}来包裹代码块。 - 使用分号
;来分隔语句。 - 写法与
CSS、Less等非常相似,学习成本低,易于上手。
示例:
scss
// style.scss
$primary-color: #3498db;
.container {
padding: 20px;
.title {
color: $primary-color;
font-size: 24px;
&:hover {
text-decoration: underline;
}
}
}2. Sass (.sass 后缀)
Sass 的缩进语法更偏向于 Ruby、Python 等语言的简洁风格。它通过严格的缩进来规定代码的层级结构。
特点:
- 没有花括号
{}。 - 没有分号
;。 - 使用缩进(通常是
2个空格)来嵌套规则。 - 更加简洁,代码量更少。
示例:(实现与上面 SCSS 代码完全一样的功能)
sass
// style.sass
$primary-color: #3498db
.container
padding: 20px
.title
color: $primary-color
font-size: 24px
&:hover
text-decoration: underline核心区别总结表
| 特性 | SCSS (.scss) | Sass (.sass) |
|---|---|---|
| 语法风格 | 类似 CSS,使用 {} 和 ; | 简洁,使用缩进 |
| 文件后缀 | .scss | .sass |
| 学习成本 | 低,尤其对 CSS 开发者 | 稍高,需要适应新规则 |
| 兼容性 | 极高,完全兼容 CSS 语法 | 不直接兼容 CSS |
| 社区流行度 | 主流,绝大多数项目和框架使用 | 相对较少 |
| 可读性 | 对熟悉 CSS 的开发者更友好 | 代码更紧凑,部分人认为更优雅 |
应该如何选择?
对于绝大多数开发者和项目,强烈推荐使用 SCSS。
理由如下:
- 平滑过渡:如果你已经会
CSS,那么你几乎已经会写SCSS了,只需要学习变量、嵌套、混合等特性即可。 - 无缝迁移:你可以轻松地将现有的
CSS代码粘贴到SCSS文件中,然后逐步用Sass的特性进行重构。 - 社区标准:目前主流的
UI框架(如 Bootstrap)、构建工具和社区教程,默认使用的都是SCSS语法。这使得协作和查找资源更加方便。 - 容错性更高:缩进语法虽然简洁,但如果缩进不一致,很容易导致编译错误。
SCSS的括号结构在视觉上更清晰,不容易出错。
结论
- SCSS 是 Sass 3 之后引入的主流和推荐语法。它功能强大且易于接受。
- 原始的 Sass 缩进语法更像是一种“方言”,如果你特别喜欢这种简洁的风格,或者你在维护一个老项目,否则没有必要特意去使用它。