less 的 when 守卫仅在编译时静态匹配字面值,不支持运行时响应;必须依附 mixin 或带 & 的嵌套选择器,仅支持字面量比较和有限内置函数,多分支需注意顺序与兜底。

Less 的 when 守卫根本不是“动态生成”,它只在编译时匹配变量字面值,输出固定 CSS;传入未定义值、类型不一致或顺序错乱,规则就直接消失,连警告都没有。
守卫必须依附 mixin 或带 & 的嵌套选择器
单独写 .btn when (@size = "large") { } 会报错——Less 不认这种语法。守卫只能出现在两个位置:
- 定义 mixin 时:
.btn(@size) when (@size = "large") { padding: 16px; },调用时写.btn("large"); - 嵌套选择器内配合
&:.btn { & when (@size = "large") { padding: 16px; } },本质是立即调用匿名 mixin
漏掉 &、把 when 写在属性行里(如 color: when(@dark) #000;),都会编译失败。
守卫条件只支持字面量比较和有限内置函数
when 里不能做算术、不调函数、不转单位,只认编译期能静态判定的值:
- 字符串必须加引号:
when (@mode = "mobile")✅,when (@mode = mobile)❌(会查变量@mobile) - 数字比较要求纯数字:
when (@n > 12)✅,when (@n > 12px)❌(12px是 pixel 类型,不是 number) - 类型判断仅限内置函数:
when (ispixel(@val))、when (isnumber(@n)),但iscolor("red")返回false(字符串 ≠ 颜色值) -
when (@width > calc(100% - 20px))或when (contrast(@c) = #fff)全部非法,直接报错
多分支按顺序匹配,无匹配则静默跳过
Less 不 fallback、不报错、不提示“没匹配到”,写了三段守卫却啥都没输出?大概率是分支顺序或兜底缺失:
- 先写的守卫优先匹配:
when (@n >= 0)放前面会让when (@n > 10)永远执行不到 - 必须显式提供兜底:要么加无守卫版本
.text(@size) { font-size: 14px; },要么用when (default()) - 守卫不控制选择器是否输出——就算
.btn本身写了,守卫不匹配,里面规则照样不出现
真正需要运行时响应时,守卫完全不合适
想根据 class 切换、:hover、@media 或 JS 修改的 data 属性来变样式?when 一点用都没有。它编译完就固化了,页面加载后不会随任何 DOM 变化而更新。
这时候该用:class 切换驱动预编译好的多套规则,或者 CSS 自定义属性 + JS 控制。守卫唯一靠谱的用途,是组件多态(按钮尺寸)、主题分类(light/dark)、单位归一化(px/rem 自动转)——逻辑一复杂,立刻换方案。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











