dart sass 1.33.0+ 将/降级为纯css分隔符以消除语义冲突,必须用@use "sass:math"后调用math.div()显式计算,参数需同单位且命名空间不可省略,calc()内/仍安全。

因为 Dart Sass 1.33.0+ 主动将 / 从运算符降级为纯 CSS 分隔符,不再尝试“猜”你是想做除法还是写 font 简写——这种语义冲突会让解析器不可靠,所以必须用 math.div() 显式表达计算意图。
为什么 / 突然不认除法了
旧版 Sass(如 LibSass / Node Sass)把所有 / 都当运算符处理,结果和 CSS 原生语法打架:font: 14px/1.5 被误算成 9.333px,grid-template-columns: 1fr/2fr 直接报错。Dart Sass 改用分层解析:CSS 值里的 / 交标准 parser 处理,Sass 层只保留确定性计算。
-
100px / 2→ 不再计算,原样输出或报Invalid CSS after "100px" -
font: 14px/1.5 sans-serif→ 正常通过,不进 Sass 计算流程 -
calc(100% / 3)→ 仍合法,因为属于 CSS runtime 上下文,Sass 不插手
math.div() 必须带 @use 且不能省略命名空间
这不是可选语法糖,是模块作用域硬约束:即使你在入口文件写了 @use "sass:math",@mixin 或 @function 内部也得单独导入,否则编译直接失败。
- ✅ 正确:
@use "sass:math"; .foo { width: math.div(100%, $cols); } - ❌ 错误:
div(100%, $cols)(未定义函数)、sass.div()(无此命名空间)、@import "sass:math"(@import已废弃,不支持模块路径) - ⚠️ 注意:uniapp 等封闭环境若卡在
sass@1.77.8,@use可能不识别,需确认版本 ≥1.33.0
单位不一致会直接编译报错,不是运行时问题
math.div() 是编译期函数,不做隐式转换。传 1rem 和 16px 进去,它不会帮你换算成相同基准——而是立刻抛 Cannot divide 1rem by 16px。
- ✅
math.div(100px, 2)、math.div(1.5rem, 1rem)、math.div(100, 3) - ❌
math.div(100px, 1rem)、math.div(1.5rem, 16)(后者结果是0.09375rem,不是你要的无单位比值) - ? 常见漏点:响应式断点计算中写
math.div($breakpoint, 16px),其实该先转成math.div($breakpoint, 1rem)
真正难的不是写 math.div(),而是意识到所有散落在 @mixin、@function、甚至注释旁边的 /,只要不在 calc() 或白名单属性里,都得人工定位替换——IDE 的全局搜索容易漏掉字符串内或被注释包裹的除法。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











