Less 4.x 不支持自定义单位参与运算或作为合法单位字面量,非白名单单位(如 myu、fr)会被剥离单位仅留数值,导致计算丢失语义或报错;唯一可行方式是用 ~"" 或 replace() 字符串拼接输出。

Less 4.x 不支持自定义单位(如 rem、vh 以外的任意单位)参与数学运算或作为合法单位字面量直接参与编译;你写的 10myunit 会被当作无效语法报错,或者被当作纯字符串处理,无法参与计算或类型推导。
Less 4.x 中单位必须是内置白名单里的才可参与运算
Less 的单位系统硬编码了常见 CSS 单位(px、em、rem、vh、vmin 等),所有非白名单单位(比如 fr、cap、ic 或自造的 myu)在解析阶段就会被剥离单位信息,只保留数值,后续运算会丢失语义,生成的 CSS 也不带单位。
-
10myu * 2→ 编译结果是20(无单位),不是20myu -
10px + 5myu→ 报错:Operation on an invalid type,因为5myu被识别为数字5,但单位不匹配无法加 - 即使绕过解析(如用字符串拼接
@{val}myu),也无法参与变量计算或函数参数校验
想输出自定义单位,只能靠字符串拼接 + ~"" 或 replace()
这是唯一可行路径:放弃“单位参与运算”的幻想,把数值和单位拆开,用字符串方式组合。Less 4.x 提供了 ~""(转义字符串)和 replace() 函数来辅助拼接。
- 基础拼接:
@val: 12; @{val}myu→ 输出12myu(注意:这不是单位,是纯文本) - 安全拼接(防空值):
~"@{val}myu",确保不被转义成其他内容 - 动态替换(如从
12px提取数值再换单位):replace(12px, "px", "myu")→12myu - 注意:
replace()返回字符串,不能用于后续算术,只能最终输出到属性值中
为什么不能像 Sass 那样扩展单位系统?
Less 的单位解析发生在 AST 构建早期,由正则硬匹配(见其源码 less/lib/less/parser/parser.js 中 unit token 定义),不像 Sass 在运行时提供 unit()、unitless() 和自定义单位注册机制。这意味着:
- 无法通过插件或配置添加新单位识别规则
- 第三方函数(如
unit())在 Less 4.x 中仅用于提取已有单位,不能注入新单位 - 试图用
unit(12, "myu")会报错:unit() expects a unit as second argument,因为"myu"不在单位白名单里
真正需要自定义单位参与计算的场景(比如设计系统里统一用 1sp = 4px 并希望 2sp + 1sp 自动转成 12px),得靠预处理脚本或构建时 PostCSS 插件实现——Less 本身做不到。别在变量里写 10myu 期待它能算,它连解析都过不了。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











