Sass 简介与安装
Sass(Syntactically Awesome Style Sheets)是 CSS 预处理器:在 CSS 语法上增加变量、嵌套、混合、模块、控制指令等能力,最终编译为标准 CSS 供浏览器使用。不能在浏览器中直接运行 .scss / .sass 文件,必须先编译。
一、Sass 是什么
Sass 是预处理器的产品名,而不是某一种具体的文件格式。它的价值在于弥补原生 CSS 早期缺乏变量、嵌套、逻辑控制等能力的短板,让样式代码更易维护、更易复用。随着原生 CSS 陆续引入自定义属性、原生嵌套等特性,Sass 与 CSS 的边界有所重叠,但在跨文件变量主题、带参数的 Mixin、编译期循环生成样式等场景,Sass 仍然是主流选择。
.scss / .sass 源文件 → Dart Sass 编译 → .css → 在 HTML 中引用
二、两种语法:SCSS 与缩进语法
Sass 提供两种源码语法,编译目标相同,选择其一即可,不能在同一文件内混用:
| 语法 | 扩展名 | 特点 |
|---|---|---|
| SCSS | .scss | 使用 {} 与 ;,合法 CSS 即合法 SCSS;当前绝对主流 |
| 缩进语法 | .sass | 无 {}、无 ;,靠缩进表达层级;历史上更早出现 |
对比维度
| 对比维度 | SCSS | 缩进语法(Sass) |
|---|---|---|
| 文件扩展名 | .scss | .sass |
| 语法风格 | 大括号 {} 表示嵌套层级,分号 ; 分隔属性 | 缩进(通常两个空格)表示嵌套层级,无大括号、无分号 |
| 与 CSS 的关系 | CSS 的超集——任何合法 CSS 代码都是合法 SCSS 代码 | 完全不同的语法,CSS 代码不能直接复制到 .sass 文件中 |
| 学习曲线 | 平缓,CSS 开发者零成本上手 | 较陡,需适应基于缩进的书写方式 |
| 可读性 | 清晰易读,尤其是较长的样式文件 | 简洁干净,适合习惯 Python 缩进风格的人 |
| 社区流行度 | 绝对主流,绝大多数项目使用 .scss | 小众,多用于个人偏好或老项目 |
代码示例对比
SCSS(.scss):
$primary-color: #3498db;
.nav {
ul {
margin: 0;
li {
display: inline-block;
a {
color: $primary-color;
&:hover {
text-decoration: underline;
}
}
}
}
}
缩进语法(.sass):
$primary-color: #3498db
.nav
ul
margin: 0
li
display: inline-block
a
color: $primary-color
&:hover
text-decoration: underline
可以看出:SCSS 保留了 {} 和 ;,符合传统 CSS 习惯;缩进语法用换行与缩进替代大括号和分号。
历史背景
- 2006 年:最初的 Sass 语法就是缩进语法(
.sass),设计灵感来自 Haml,旨在减少符号噪音。 - 2010 年:Sass 3 引入了 SCSS(
.scss),目的是降低 CSS 开发者的入门门槛。此后 SCSS 迅速成为主流,原缩进语法被很多人称为“老式 Sass”。
实际项目中如何选择
| 场景 | 推荐 |
|---|---|
| 新项目、团队协作、大多数日常工作 | SCSS —— 生态系统全面,IDE 支持好,易于迁移和维护 |
| 个人极简主义偏好,希望代码更精简 | 缩进语法(.sass)—— 但不建议团队使用 |
维护已有 .sass 的老项目 | 保持原样,或逐步迁移到 SCSS(可混用不同文件) |
结论:二者是同一预处理器的不同语法;新项目与团队协作请默认 SCSS(.scss)。日常说「用 Sass」多数场景下指的就是 SCSS。
三、核心能力速览
| 特性 | 说明 |
|---|---|
| 变量、嵌套、运算 | $name: value、选择器嵌套、数学/颜色运算 → 详见 语法基础 |
| Mixin、继承 | @mixin / @include、@extend、%placeholder → 详见 复用机制 |
| 模块、内置函数、控制指令 | @use 替代 @import、sass:* 内置模块、@if/@for/@each → 详见 模块与控制流 |
四、安装与使用
安装 Dart Sass(官方实现)
npm install -D sass
npx sass --version
也可用 Homebrew 安装独立 CLI(见 Sass 安装)。现代工作流不需要 Ruby。
| 实现 | 状态 |
|---|---|
| Ruby Sass | 已停止维护 |
LibSass / node-sass | 已弃用,勿用于新项目 |
| Dart Sass | 官方唯一推荐实现 |
常用 CLI
| 命令 | 说明 |
|---|---|
sass input.scss output.css | 单文件编译 |
sass --watch scss:css | 监听目录 |
sass --style=compressed in.scss out.css | 压缩输出 |
sass --source-map ... | 生成 source map |
除法运算请使用 sass:math 的 math.div()(见 运算)。
在构建工具中使用
| 工具 | 说明 |
|---|---|
| Vite | 安装 sass 后即可直接 import './x.scss' |
| Webpack | sass-loader + sass |
| Vue / React | 单文件组件 lang="scss" + 项目依赖 sass |
五、常见错误
| 现象 | 处理 |
|---|---|
| 变量未定义 | 检查 $、作用域、@use 命名空间是否正确 |
/ 被当除法警告 | 使用 math.div() 或原生 calc() |
.sass 缩进错误 | 统一 2 空格缩进,勿混用 Tab |
SCSS 与 .sass 混用报错 | 两种语法不能在同一文件内混写,需分文件维护 |
参考文献
| 资料 | 说明 |
|---|---|
| Sass 官方文档 | 语法与 API |
| Sass 安装 | Dart Sass 安装方式 |
| Sass:Syntax | SCSS 与缩进语法 |
| Sass:@use | 模块系统 |
相关文章
模块与控制流:@use、内置函数、@if/@for/@each
Dart Sass 推荐用 @use/@forward 替代已弃用的 @import;内置 sass:* 模块提供颜色、字符串、列表、Map、数学等函数;@if/@for/@each/@while 用于条件与循环生成样式。
复用机制:Mixin 与继承
Mixin(@mixin/@include)支持参数与 @content,适合动态样式;@extend 与 %placeholder 通过合并选择器复用完全相同的静态样式,减少 CSS 体积。
语法基础:变量、嵌套与运算
Sass 语法基础:$ 变量与插值、选择器嵌套与 & 父选择器引用、数学/颜色/字符串运算、三种注释语法及与原生 CSS 嵌套的关系。
Less 基础与核心语法
Less 是 JavaScript 实现的 CSS 预处理器,在 CSS 语法上扩展变量(@)、嵌套、混合、运算与函数,编译为普通 CSS 后由浏览器加载;本文覆盖安装、CLI、构建工具集成与全部核心语法。
颜色与背景
color 设置前景(多为文字)色;background-* 设置元素背景(颜色、图像、渐变)。二者共同决定对比度与视觉层次,直接影响 无障碍 阅读体验。排版中的文本颜色用法见 排版与文本。
工程化集成与扩展
Less 可集成到 Vite、Webpack、Vue CLI 等工具链,实现编译、全局变量注入与路径处理。
Series
sass
1 / 4