sass:math模块是必须的,因为sass 3.5+废弃全局数学运算符,10px / 2可能被错误编译为10px/2而非5px;必须用@use "sass:math"引入,运算需调用math.div()等函数,单位不自动转换,需手动统一。

为什么 sass:math 模块是必须的
因为 Sass 3.5+ 已废弃全局数学运算符(如 +、/ 在某些上下文中会触发 CSS 除法解析),直接写 10px / 2 可能被编译成 10px/2 而非 5px,尤其在 @media 或属性值中极易出错。引入 sass:math 是唯一稳定、可预测的替代方案。
如何正确引入并使用 sass:math
必须用 @use(不能用已废弃的 @import),且路径为 "sass:math" —— 注意引号和冒号,漏掉引号或写成 sass/math 会报错 Can't find stylesheet to import。
常见写法:
@use "sass:math";
之后所有运算都需显式调用模块函数,例如:
-
math.div(10px, 2)→5px -
math.mul(1.5, 100%)→150% -
math.max($a, $b)和math.min($a, $b)支持单位混合比较(如math.max(1rem, 16px))
哪些传统写法必须立刻替换
以下写法在 Dart Sass 中已不可靠,尤其在嵌套、循环或计算变量时:
-
$width / 2→ 改为math.div($width, 2) -
$base * 1.2→ 改为math.mul($base, 1.2) -
calc(#{$a} + #{$b})中的+不受影响,但若$a或$b是带单位的 Sass 变量,先用math.add()合并再插值更安全 -
100vw - 20px这类纯 CSS calc 保留原样;但涉及 Sass 变量参与的减法,如100vw - $sidebar-width,需写成calc(100vw - #{math.to-string($sidebar-width)})或提前算好:math.sub(100vw, $sidebar-width)
单位混算与精度陷阱
sass:math 不自动转换单位(比如 1rem + 16px 会报错 Incompatible units rem and px),也不能隐式转换单位类型。必须手动统一:
- 用
math.convert-length()(仅 Dart Sass 1.70+)处理rem/em/px间转换,但需已知基准值(如1rem = 16px) - 更稳妥做法是全程用同一单位定义基础变量(如全用
px或全用rem),避免运行时单位冲突 -
math.div(1, 3)默认返回0.3333333333(10 位小数),如需控制精度,得配合math.round()或字符串截断,Sass 本身不提供toFixed类函数
真正麻烦的不是写法变多,而是单位一致性必须在设计系统层就约束死——模块本身不替你做决策。











