在 Less 4.1 中,默认不会自动执行除法运算。这并不是配置错误,而是编译器的内置硬编码规则:所有未加括号的 / 都会被当作 CSS 字面量输出。那么,Less 4.1 除法计算到底该怎么写才有效?实际上只有两种方式:一种是 (100px / 4),另一种是 100px ./ 4。这里还要特别注意,在这种场景下,math 配置通常会被静默忽略。

Less 4.1 默认不处理除法计算,这不是因为配置遗漏,也不是构建工具设置有误,而是编译器的硬编码机制导致:所有未加括号的 / 都会原样保留并输出为 CSS 字面量,最终浏览器会静默忽略整条无效声明。
为什么 100px / 4 编译后仍然是 100px / 4
在 Less 4.1 版本中,“宽松除法”解析逻辑已经被彻底移除。编译器不再尝试判断这个 / 到底是数学运算符,还是 CSS 分隔符(例如 font: 12px/1.5 里的斜杠),而是统一按普通字面量处理。
width: 100px / 4;→ 输出结果仍然是width: 100px / 4;,浏览器会忽略这一行样式line-height: 20px / 16px;→ 同样不会参与计算,也不会得到1.25@gap: 1rem / 2;→@gap会被当成字符串"1rem / 2",后续引用时也会全部失效
Less 4.1 中唯一有效的两种除法写法
如果你想让编译器明确知道“这里需要执行数学运算”,那么只能使用下面两种语法,这也是 Less 4.1 除法规则变化后真正可用的标准写法:
(100px / 4)—— 推荐使用,语义明确,可读性好,单位兼容性也更稳定,同时支持嵌套写法,例如(2rem / 2)100px ./ 4—— 注意./前后**必须保留空格**;像100px./4或100px ./4这样的写法都会直接报错
反例:(100 / 4)px 会报 Operation on an invalid type;而 100 / 4px 则是单位位置错误,结果不可预测,也不建议使用。
math 配置在 Less 4.1 中基本不起作用
很多人搜索到的 math: "always"、math: "parens"、math: 0 等配置,在 Less 4.1 里基本都会被静默忽略,等同于没有设置,最终仍然会按照默认的 math: 2(严格模式)执行。
- 真正有效的只有整数形式的
math: 1或math: 2,但它们**并不能决定是否执行除法计算**,只会影响“是否允许无括号除法被识别为表达式” math: 1:虽然接受100px / 4作为合法表达式,但依旧不会计算,最终输出的还是原始字面量math: 2:会直接让100px / 4报错,从而强制你改写成(100px / 4)或100px ./ 4- 如果你使用 Vite,需要配置为
css.preprocessorOptions.less.math = 1;如果是 Webpack 的less-loader,则应写在options.math下;命令行方式可使用lessc --math=1
Less 4.1 除法规则里最容易忽视的静默陷阱
很多开发者容易忽略的一点是:无论你使用的是 VS Code Easy Less 插件(1.7.0+)、CI 构建日志,还是本地执行的 lessc 命令行工具,通常都不会提示你“少写了括号”。也就是说,即使编译过程成功、没有报错、也没有 warning,最终生成的 CSS 中仍然可能存在大量非法的 /。
- 因此只能通过检查最终生成的 CSS 文件,或者借助 CSS 验证工具,扫描
/是否出现在width、margin、background等非font属性中 - 如果 UI 框架(例如 view-ui-plus)出现样式异常,90% 的情况都是因为源码里存在未加括号的 Less 除法,而不是因为配置写错
calc()中的表达式依然可能被 Less 提前当作数学运算处理,因此必须使用~"calc(100% - @{gap})"进行转义
总结来说,Less 4.1 中所有除法运算都必须手动加括号,或者改写成 ./ 形式,没有例外。这一规则由 Less 4.1 编译器底层硬编码决定,不依赖任何外部配置,也不会因为构建工具不同而发生变化。
