Skip to content

参考:Sass 速查与对照表

基于 Dart Sass 1.101.0 · 核于 2026-07

速查

  • 定位:CSS 预处理器,编译成 CSS。两种语法:SCSS(.scss,CSS 超集,最流行)/ 缩进语法(.sass)。当前实现 Dart Sass 1.101.0;LibSass/Ruby Sass 已 EOL。
  • 变量$x,编译期消除;!default(未定义才赋)、!global(改已声明的全局)。
  • 嵌套& 父选择器(&:hover/&__el/&--mod/[dir] &),只能放复合选择器开头;嵌套属性 font: { family; weight }
  • 复用@mixin/@include/@content(出样式)、@function/@return(算值)、@extend + %(并选择器)。
  • 控制流@if/@else if/@else@each(列表/map 解构)、@forthrough 含终点/to 不含)、@while
  • 模块系统@use(命名空间加载、只加载一次、as/as */with)、@forward(转发、show/hide/as prefix-*/with !default);私有成员 -/_ 前缀。
  • @import 弃用:1.80.0 弃用、计划 3.0.0 移除,改用 @use;官方 sass-migrator 自动迁移。
  • 内置模块sass:math/color/string/list/map/selector/meta@use 'sass:xxx' 加载。
  • 两大迁移/ 除法(1.33.0 弃用)→ math.div()darken/lighten 等(1.79.0 弃用)→ color.adjust/color.scale

一、核心 at-rule 速查

at-rule作用
@use带命名空间加载模块(推荐,取代 @import
@forward转发模块公共成员给下游,搭库入口
@import引入文件(已弃用,1.80.0 起,3.0.0 移除)
@mixin / @include定义 / 引入可复用样式块
@contentmixin 内占位,接收 @include 传入的样式块
@function / @return定义 / 返回计算值
@extend继承并合并选择器
@if / @else if / @else条件分支
@each遍历列表 / map
@for按数值范围循环
@while条件循环
@at-root把嵌套规则提升到根层输出
@debug / @warn / @error调试输出 / 告警 / 报错

二、变量标志速查

标志含义约束
!default仅当变量未定义或为 null 时才赋值库给默认值、允许 with 覆盖
!global在局部作用域修改全局变量只能改已在顶层声明的变量,不能新建

局部块内同名赋值默认是遮蔽(不改全局);@if/循环块不创建新作用域

三、& 父选择器速查

写法编译结果用途
&:hover.parent:hover伪类
&__title.parent__titleBEM 元素
&--active.parent--activeBEM 修饰符
[dir=rtl] &[dir=rtl] .parent反转上下文
&.is-open.parent.is-open与其它选择器组合

& 只能放在复合选择器开头span& 非法);样式规则外 &null

四、模块系统速查

语法作用
@use 'file'加载,命名空间 = 文件名,file.$x / file.fn()
@use 'file' as x自定义命名空间 x
@use 'file' as *并入全局(慎用,仅限自己的文件)
@use 'file' with ($x: 1)加载并配置带 !default 的变量(as 须在 with 前)
@forward 'file'转发公共成员给下游
@forward 'file' show a, $b白名单转发
@forward 'file' hide a黑名单转发
@forward 'file' as p-*转发时批量加前缀
@forward 'file' with ($x: 1 !default)改上游默认、留下游可覆盖
$-name / %-name私有成员 / 私有占位符(仅本文件)

每个模块只加载一次;@use 须在文件开头;模块只在首次加载时接受配置。

五、内置模块速查

模块代表函数
sass:mathmath.divmath.round/ceil/floormath.percentagemath.absmath.min/maxmath.pow/sqrtmath.$pi/math.$e
sass:colorcolor.adjustcolor.scalecolor.changecolor.mixcolor.complementcolor.invertcolor.grayscale
sass:stringstring.lengthstring.slicestring.indexstring.insertstring.to-upper-casestring.unquote/quote
sass:listlist.lengthlist.nthlist.appendlist.joinlist.indexlist.zip(不可变、1-based)
sass:mapmap.getmap.has-keymap.setmap.mergemap.keysmap.values
sass:selectorselector.nestselector.unifyselector.appendselector.is-superselector
sass:metameta.keywordsmeta.load-cssmeta.type-ofmeta.inspectmeta.module-variablesmeta.call

全局别名逐步弃用、改走命名空间;例外:颜色构造器 rgb()/hsl()/hwb() 仍仅全局。

六、破坏性变更 / 弃用时间线(节选)

特性Dart Sass 版本迁移
@import1.80.0 弃用 → 3.0.0 移除@use/@forwardsass-migrator
旧全局颜色函数(darken/lighten 等)1.79.0 弃用color.adjust/color.scale
/ 作除法运算符1.33.0 弃用math.div()
-- 开头的函数/mixin 名1.76.0改名
声明与嵌套规则混排1.77.7调整顺序

完整清单见官方 Breaking Changes

七、@use vs @import 对照

维度@use(推荐)@import(已弃用)
成员可见性命名空间隔离、可私有全部全局
加载次数每模块一次每次引入都执行输出
@extend 范围限上游模块、可控全局、不可预测
配置库with + !default先改全局变量再 import(脆弱)
私有成员支持(-/_不支持
书写位置文件开头任意位置
状态官方主推1.80.0 弃用、计划 3.0.0 移除

八、@extend vs @mixin 对照

维度@extend@mixin
机制合并选择器(.a, .b { }复制展开样式
参数不支持支持(默认/关键字/可变参数)
语义「A 是一种 B」「复用一段样式模式」
@media❌ 不能✅ 可以
隐式牵连会影响所有出现被继承选择器处无,独立
产物体积更紧凑有重复(现代压缩可消化)

九、选型对比:Sass vs Less vs PostCSS vs CSS 自定义属性

维度SassLessPostCSSCSS 自定义属性
类型预处理器预处理器后处理/转换平台浏览器原生运行时
变量$x,编译期@x,编译期靠插件--x,运行时可变
逻辑能力强(mixin/函数/控制流/模块)取决于插件
需构建
运行时动态无(编译期消除)有(随元素/主题变)
典型定位成熟工程化样式抽象轻量、JS 生态加前缀/降级新语法/原子化管线主题换肤、运行时可变值

选型速记:要成熟全能的样式工程化 → Sass;更轻或在 Less 生态 → Less;按标准做转换(Autoprefixer、未来语法降级)→ PostCSS(常与 Sass 叠用);运行时随主题动态变化的值 → CSS 自定义属性(与 Sass 互补)。

十、常见坑对照

现象根因解法
/ 除法告警/结果异常/ 作除法已弃用math.div($a, $b)
darken() 告警旧全局颜色函数弃用color.scale/color.adjust
@import 告警1.80.0 起弃用@use/@forward,或跑 sass-migrator
@use ... with 报错as 写在了 with 后 / 重复配置同一模块as 在前;配置只在首次加载
@extend 报错@media 或扩展了复合选择器改用 mixin,或只扩展简单选择器
拼错函数名不报错未知函数被当普通 CSS 输出对产物跑 CSS lint
span& 报错& 只能放复合选择器开头换写法(如 & span 或调整结构)
用了 node-sass 却缺特性LibSass/node-sass 已 EOL换 Dart Sass(sass 包)

十一、权威链接