scss 中 math.div() 报错需先 @use “sass:math” 显式导入并用命名空间调用;/ 是编译期运算符,易受除法上下文影响,math.div() 更安全确定;math.round() 精度问题源于浮点误差与单位处理。

你升级到 Dart Sass 1.33+ 后,直接写 100px / 2 还能用,但一调 math.div(100px, 2) 就报 Function "math.div" not found —— 这不是你装错了,是 Dart Sass 默认禁用了旧式数学函数库。从 1.33 开始,math 模块必须显式加载,且不自动挂载到全局命名空间。
解决方法很简单:
- 在使用前加
@use "sass:math"(注意不是@import) - 调用时必须带命名空间,比如
math.div(\(a, \)b),不能省略math. - 如果多个文件都要用,推荐在主 SCSS 入口(如
_index.scss)里@use "sass:math" as math,然后所有子模块通过@use继承即可
两者行为不同,选错会导致意料之外的单位处理或类型错误。
-
/是编译期运算符,会触发“除法上下文”规则:当左侧不是数字、或右侧不是纯数字时,它可能被当作 CSS 除法(比如font: 10px/2),导致编译失败或静默跳过 -
math.div(\(a, \)b)是确定性函数,只做数值除法,单位自动保留(math.div(100px, 2) → 50px),且支持任意单位组合(只要可除,如math.div(100px, 2em)返回无量纲数) - 安全建议:只要涉及变量参与的除法,一律用
math.div();纯字面量且上下文明确(如line-height: 1.5)才用/
这不是 bug,是浮点精度 + 单位隐式转换共同导致的。Dart Sass 的 math.round() 接收的是数值(number),不关心单位;但如果你传入带单位的值(如 3.75px),它先剥离单位计算,再把单位拼回去 —— 中间过程可能有微小误差。
- 典型现象:
math.round(10.9998px)有时返回10px,有时11px(取决于底层 IEEE 754 表示) - 规避方法:先用
math.floor()或math.ceil()做前置截断,或用math.abs(\(x - round(\)x)) 手动容错 - 更稳做法:对关键尺寸(如栅格列宽)避免依赖
math.round(),改用整数比例设计,或用clamp()+ 固定步长兜底
Dart Sass 已彻底移除全局函数 divide()、round()、floor() 等,它们不再存在于 sass:math 中 —— 全部重命名为 math.div()、math.round()、math.floor()。
- 别指望
@forward "sass:math"能恢复旧名,必须改调用方式 - 正则替换建议(VS Code 或 sed):
divide(([^)]+))→math.div(\(1)round(([^)]+))→math.round(\)1)
注意括号嵌套,简单场景可用,复杂表达式仍需人工核对 - 特别注意:
percentage()未被移入math,它仍在全局,但推荐改用math.percentage()(Dart Sass 1.70+)以保持一致性
最易被忽略的一点:@use 必须出现在文件最顶部,且不能被条件语句包裹;任何在 @use 之前出现的 math.xxx 调用都会直接报错,连 warning 都没有。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/262971.html