Less 编译时保留0的单位是设计使然,因其单位敏感运算需维持语义一致性,如0px与0在line-height等属性中行为不同;须手动用unit()或类型守卫处理。

Less 编译时不会自动把 0px、0rem、0em 简化为 0,这是设计使然,不是 bug。CSS 规范允许带单位的 0(如 0px),浏览器完全兼容,但视觉和压缩效果上确实冗余。
Less 为什么保留 0 的单位
Less 的数学运算是编译期单位敏感运算,所有数值操作都尽量保留原始单位上下文。比如:@gap: 8px;,那么 @gap - @gap 得到的是 0px,不是 0;0 * 1rem 也会得 0rem。它不执行“单位归零优化”,因为:
- 单位是值的一部分,剥离可能破坏语义(例如 line-height: 0px 和 line-height: 0 在部分场景行为不同)
- 没有统一规则判断哪些属性能安全省略单位(margin: 0 可以,line-height: 0 有时会触发特殊渲染)
- 编译器不分析 CSS 属性名,只做表达式求值
如何让 0 不带单位
必须手动干预,常见可靠方式有:
- 用
unit()剥离再拼接:margin: unit(0px, '') 0;→margin: 0 0; - 对变量做守卫处理:
.pad(@v) when (isnumber(@v)) { padding: @v; },这样传0进去就输出padding: 0;;若传0px,则需额外分支或提前 normalize - 避免在运算中引入单位:
@base: 8;(无单位)比@base: 8px;更利于生成干净的0,再用unit(@base, px)显式加单位
容易踩的坑:看似省事实则翻车
这些写法看着简洁,但实际无效或危险:
-
0px + 0→ 还是0px(加法继承左操作数单位) -
0 / 1→0(纯数字除法得无单位 0),但0px / 1→0px,不可混用 - 依赖
--clean-css自动清理:它默认不处理0px → 0转换,需额外插件或自定义 postcss 插件 - 在 mixin 中直接写
padding: @val;却没判断@val类型,导致0rem直接透出
最稳妥的路径是:从源头控制变量类型(优先用无单位数值),再按需加单位;对已带单位的输入,用 isunit() + unit() 组合做归一化。别指望 Less 自己“懂语义”。
立即学习“前端免费学习笔记(深入)”;


















