less守卫必须依附mixin或嵌套(用&),不可单独写在选择器上;类型检测需用isxxx()函数且严格区分字面量与变量;多条件分支须显式兜底default()或无守卫默认版。

Guard必须依附mixin或&嵌套,不能单独写在选择器上
你写 .btn when (@size = "large") { padding: 16px; } 会直接编译失败。Less不接受这种“裸守卫”语法。守卫只能出现在两个位置:定义 .mixin() 时,或嵌套规则中配合 & 使用。
正确写法是:
.btn(@size) when (@size = "large") { padding: 16px; }
.btn("large");
或者用 & 语法糖(本质仍是立即调用匿名 mixin):
.btn {
& when (@size = "large") { padding: 16px; }
}
- 漏掉
&就报错 - 把
when写在属性行里,比如padding: when(@size = "large") 16px;,也报错 - 守卫不匹配时,整段规则不会输出——不是隐藏,是根本不存在
类型检测要用 isxxx() 函数,但注意它只认原始值
iscolor(@c)、ispixel(@n) 这类函数不是 JS 的 typeof,它们在编译期做静态分析,且对输入极其敏感。
常见陷阱:
-
iscolor("red")返回false—— 字符串"red"不是颜色值,#f00或red(不带引号)才返回true -
ispixel(12px)返回true,但ispixel(12)返回false;isnumber(12px)也返回false - 不能在守卫里调用自定义函数或做单位转换,
when (ispixel(unit(@val, px)))是非法的
稳妥做法是提前规范参数类型,比如要求传入 @height 必须是带单位的值,再用 ispixel(@height) 判断。
多条件分支必须显式兜底,default() 不是可选的
Less 守卫按顺序匹配,遇到第一个为真就停止,后面分支不执行。没匹配到任何守卫,就静默跳过——不会警告,也不会 fallback。
例如:
.text(@size) when (@size = "small") { font-size: 12px; }
.text(@size) when (@size = "large") { font-size: 18px; }
.text("medium"); // 输出:空
解决方式只有两种:
- 加一个无守卫的默认版本:
.text(@size) { font-size: 14px; } - 用
default()显式兜底:.text(@size) when (default()) { font-size: 14px; }
注意:default() 只在前面所有守卫都不满足时触发,它不参与比较逻辑,也不能带参数。
字符串比较必须带引号,关键词和变量名别混用
when (@mode = dark) 和 when (@mode = "dark") 完全是两回事。
前者表示“@mode 的值等于变量 dark 当前的值”,后者才是“字面量字符串匹配”。如果你本意是匹配字符串 "dark",却漏了引号,Less 会去找名为 dark 的变量——如果它不存在,整个守卫就永远不成立。
其他易错点:
-
when (@dir = top)→ 错误:试图读取未定义变量top -
when (@dir = "top")→ 正确:字面量匹配 -
when (iskeyword(@dir)) and (@dir = "top")→ 更稳妥:先确认是关键词,再比值
真正难处理的是混合输入:用户可能传 "top"、top(变量)、90deg。这时候得靠多个守卫分支 + 类型判断组合覆盖,不能只依赖一个 =。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











