<p>Less中无法直接用calc()定义带运算的CSS变量,需用插值~""将编译期计算结果或显式calc()字符串注入CSS变量,如--width: ~"calc(100% - @{gap})";单位混用须在Less中统一,calc()才负责运行时跨单位运算。</p>
calc()定义带运算的CSS变量Less编译时会把calc(100% - 2rem)这类表达式原样输出,不会提前计算;而CSS自定义属性(--foo: 100% - 2rem)本身不支持运行时数学运算——浏览器只当它是字符串。所谓“在Less中定义带运算逻辑的CSS变量”,本质是利用Less的变量+插值机制,在编译期完成计算,再注入到CSS变量中。
@variable配合插值~""生成带计算结果的CSS变量Less变量支持加减乘除和括号,但要让结果作为CSS变量值生效,必须用插值语法~""包裹,否则会被当作字面量字符串处理。
@spacing-base: 1rem; → 基础单位@header-height: (@spacing-base * 4) + 1px; → 编译期算出4rem + 1px
--header-height: ~"@{header-height}"; → 输出--header-height: 4rem + 1px;(注意:这里+未被转义,会导致CSS无效)--header-height: ~"@{header-height}";仅适用于纯数值+单位组合;含运算符时得提前拼成合法CSS值,例如:@header-height-value: (4rem + 1px);不行,应改用字符串拼接:@header-height-value: "4rem + 1px";再插值写(100% - 2rem)和100% - 2rem在Less里完全等价,括号不会让结果变成可被CSS解析的calc()表达式。想让浏览器运行时计算,必须显式写calc(),且确保它出现在最终CSS中:
--width: @{(100% - 2rem)}; → Less报错,括号不能这样嵌套--width: (100% - 2rem); → 输出--width: 100% - 2rem;,CSS无效--width: ~"calc(100% - 2rem)"; → 输出--width: calc(100% - 2rem);,浏览器可执行@gap: 2rem; → --width: ~"calc(100% - @{gap})";
calc()最实用多数场景不需要纯Less计算结果,而是需要动态响应容器变化——这时候calc()不可替代。Less的作用是减少硬编码、提升可维护性:
立即学习“前端免费学习笔记(深入)”;
@sidebar-width: 240px;
--main-width: ~"calc(100% - @{sidebar-width})";
width: var(--main-width);
@sidebar-width后期改为22rem,所有引用处自动更新,且仍保持calc()语义var(--x)不能直接参与Less运算,比如width: var(--x) * 2非法;如需进一步计算,得靠CSS clamp()或JS真正容易被忽略的是单位混用:Less里1rem + 10px会报错,必须统一单位(如全转为px再算),而calc()天然支持跨单位运算——所以别试图让Less替calc()干活,让它做好参数组装就行。