对于这种情况,可以使用以下任何一种选项来避免多余的 mixin 代码。
选项 1:(最简单的解决方案 - 感谢 7phases-max突出显示未命中)
我们可以使用分号作为参数的分隔符/定界符,当我们在指定所有需要转换的属性(以逗号分隔的格式)后在末尾添加分号时,它之前的整个部分将被视为一个单一的论点。
来自Less官方网站的摘录:
使用逗号作为 mixin 分隔符使得无法创建逗号分隔的列表作为参数。另一方面,如果编译器在 mixin 调用或声明中看到至少一个分号,则假定参数用分号分隔,并且所有逗号都属于 css 列表
.transition(@1) {
-webkit-transition: @1;
-moz-transition: @1;
}
div{
.transition(border-color .5s, background .3s, color .3s;);
}
所以上面的代码在编译时会导致
div {
-webkit-transition: border-color 0.5s, background 0.3s, color 0.3s;
-moz-transition: border-color 0.5s, background 0.3s, color 0.3s;
}
选项 2:
在引号内将输入值传递给 mixin(需要转换多少特定属性)。在 mixin 中,使用~
或e()
内置函数去除引号。
.transition(@1) {
-webkit-transition: ~"@{1}";
-moz-transition: ~"@{1}";
}
div {
.transition("border-color .5s, background .3s");
}
div#sample2 {
.transition("border-color .3s, background .3s, color .3s");
}
编译时将生成以下 CSS
div {
-webkit-transition: border-color .5s, background .3s;
-moz-transition: border-color .5s, background .3s;
}
div#sample2 {
-webkit-transition: border-color .3s, background .3s, color .3s;
-moz-transition: border-color .3s, background .3s, color .3s;
}
选项 3:
Less 确实允许使用该...
选项创建允许/接受可变数量的输入的 mixin。因此,您可以使用与原始代码中相同的 mixin,方法是...
向输入变量添加 并按照您最初想要的方式调用它。
.transition(@args...) {
-webkit-transition: @args;
-moz-transition: @args;
}
div {
.transition(border-color .5s, background .3s);
}
以上将成功编译,但唯一的问题是编译时会产生以下输出。如您所见,问题在于参数值是空格分隔的,而不是逗号分隔的(因为它们应该是 CSS 正常工作的原因)。
div {
-webkit-transition: border-color 0.5s background 0.3s;
-moz-transition: border-color 0.5s background 0.3s;
}
当然,我们可以使用正则表达式编写复杂replace
的函数,但这确实会使代码变得混乱。相反,我们可以使用循环和一些内置函数来实现所需的输出(如下所示)。
.transition(@args...) {
.loop-args(@argCount) when (@argCount > 0) {
.loop-args(@argCount - 1);
@arg: extract(@args, @argCount);
-webkit-transition+: @arg;
-moz-transition+: @arg;
}
.loop-args(length(@args));
}
div {
.transition(border-color .5s, background .3s, color .3s);
}
基本上我们所做的是使用...
接受多个参数作为 mixin 的输入,然后遍历每个参数并将其添加到 CSS 属性的值中。(Less v1.5.0 中引入的+:
合并函数) 用于生成逗号分隔的输出。
编译后,它将产生以下输出:
div {
-webkit-transition: border-color 0.5s, background 0.3s, color 0.3s;
-moz-transition: border-color 0.5s, background 0.3s, color 0.3s;
}