Less 4.x 默认不执行除法运算,因编译器硬编码变更:/ 在属性值中一律视为 CSS 字面量,仅 (100px / 4) 或 100px ./ 4 才触发计算,否则输出无效 CSS 导致浏览器静默丢弃。

Less 4.x 默认不执行除法运算,不是配置漏了、也不是工具链问题,而是编译器硬编码的行为变更——/ 在属性值中一律视为 CSS 字符,仅当显式用括号包裹或写成 ./ 时才触发计算。
为什么100px / 4编译后还是100px / 4
Less 4.x 彻底移除了“宽松除法”逻辑。它不再尝试解析 font: 12px/1.5 这类简写中的 / 是否该算数,而是统一将所有未包裹的 / 当作字面量输出。浏览器收到 width: 100px / 4; 会直接丢弃该声明,控制台无报错,DevTools 里能看到非法 CSS。
-
(100px / 4)→ 编译为width: 25px;(推荐,语义明确) -
100px ./ 4→ 编译为width: 25px;(注意./前后必须有空格) -
100px / 4→ 输出原样,CSS 无效 -
(100 / 4)px→ 报错:Operation on an invalid type(单位位置错误)
math: 1 和 math: 2 真的还能用吗
能,但只在构建层起作用,且仅影响“是否允许无括号除法被当作表达式解析”,不改变底层规则。它们不是开关,而是兼容策略提示:
-
math: 1:告诉编译器“接受100px / 4是合法表达式”,然后按新规则求值 → 实际仍需括号或./才真算,所以这个配置在 4.x 中已形同虚设 -
math: 2:强制要求所有除法必须显式标记 →100px / 4直接报错,倒逼你改写为(100px / 4)或100px ./ 4 -
math: "always"、math: 0等旧值会被静默忽略,等价于没配,最终走math: 2
真正生效的位置必须精准:Webpack 中是 less-loader 的 options.math;Vite 中是 css.preprocessorOptions.less.math;命令行是 lessc --math=2。
strictMath 和除法根本没关系
strictMath: true 控制的是“无单位数值能否参与运算”,比如 10px + 5 在非严格模式下会自动转成 10px + 5px,开启后则直接报错。但它对 / 的行为零影响:
-
strictMath: true+100px / 4→ 依然输出原样,不计算 -
strictMath: false+(100px / 4)→ 正常计算为25px -
calc(100% - 20px)会被strictMath: false提前计算掉,这不是除法问题,是calc()被 Less 当作表达式吃了
想保留 calc(),得用转义:width: ~"calc(100% / 12)";。
最容易被忽略的点
所有除法都必须手动加括号或写 ./,没有例外。这个规则由 Less 4.x 编译器底层硬编码,不经过任何配置层,也不随构建工具变化。VS Code 插件、CI 日志、甚至 lessc 命令行都不会警告你漏了括号——你只能靠检查生成的 CSS 文件,或用 CSS 验证工具扫出 / 出现在非 font/background 属性里的地方。

















