我正在尝试编写一个mixin,但我似乎无法按照我想要的方式获取参数:多个属性被视为一个单独的参数。
.transition(@property: all, @time: 1s, @timing: ease-in-out) {
-moz-transition: @property @time @timing;
-webkit-transition: @property @time @timing;
-o-transition: @property @time @timing;
transition: @property @time @timing;
}
a {
.transition(color, opacity, .5s);
}
a {
-moz-transition: color, opacity .5s ease-in-out;
-webkit-transition: color, opacity .5s ease-in-out;
-o-transition: color, opacity .5s ease-in-out;
transition: color, opacity .5s ease-in-out;
}
a {
-moz-transition: color opacity .5s;
-webkit-transition: color opacity .5s;
-o-transition: color opacity .5s;
transition: color opacity .5s;
}
有什么想法吗?
答案 0 :(得分:37)
我建议使用LESS的转义函数,即:
a:link, a:visited {
color: green;
opacity: .5;
font-size: 1em;
}
a:hover {
color: red;
opacity: 1;
font-size: 2em;
.transition(e("font-size, color"));
}
虽然LESS似乎接受了这一点,但它只会为您发送的逗号分隔字符串中的最后一个属性设置动画。可惜。
答案 1 :(得分:25)
使用找到的解决方案here适用于一个 AND 多个参数:
.transition (@value1,@value2:X,...)
{
@value: ~`"@{arguments}".replace(/[\[\]]|\,\sX/g, '')`;
-webkit-transition: @value;
-moz-transition: @value;
-ms-transition: @value;
-o-transition: @value;
transition: @value;
}
以这种方式使用它:
.transition(color, opacity .5s ease-in-out);
的产率:
-webkit-transition: color, opacity .5s ease-in-out;
-moz-transition: color, opacity .5s ease-in-out;
-ms-transition: color, opacity .5s ease-in-out;
-o-transition: color, opacity .5s ease-in-outt;
transition: color, opacity .5s ease-in-out;
答案 2 :(得分:7)
如果您想将逗号分隔列表作为参数传递给mixin,您只需使用分号分隔参数。
以下代码根据您定义的mixin工作:
a {
.transition(color, opacity; .5s);
}
答案 3 :(得分:2)
Less mixins能够使用以分号分隔的参数(以及逗号分隔)。 They recommend you always use semicolons
如果在调用mixin时参数列表中存在分号,则分号之间的所有内容都将被视为参数,即使这些内容中包含逗号。这允许您将逗号分隔的列表作为 ONE 参数传递。如果分号是 NOT ,它会将逗号视为参数分隔符。
.transition(@property: all; @time: 1s; @timing: ease-in-out) { // NOTE THE SEMICOLONS
transition: @property @time @timing;
}
a {
.transition(color,opacity; .5s); // SEMICOLON AFTER 'opacity'
}
b {
.transition(color,opacity, .5s); // COMMA INSTEAD
}
输出:
a {
transition: color,opacity .5s ease-in-out;
}
b {
transition: color opacity .5s; // invalid syntax
}
请注意,速记transition
属性的syntax必须是以逗号分隔的单个转换列表。因此b
的值无效,而a
有两个转换,其中未指定的值默认为其初始值:
color 0s ease 0s
opacity .5s ease-in-out 0s
这可能不是你想要的。 (看起来你想要color .5s ease-in-out 0s
和opacity .5s ease-in-out 0s
。)
现在您可能想知道,"当没有其他参数时,如何将逗号分隔的列表作为单个参数传递?"只需在列表末尾添加一个虚拟分号。
.transition(@property: all; @time: 1s; @timing: ease-in-out) {
transition: @property @time @timing;
}
b {
.transition(color,opacity;); // DUMMY SEMICOLON AFTER ARGUMENT
}
i {
.transition(color,opacity); // MISSING SEMICOLON
}
输出:
b {
transition: color,opacity 1s ease-in-out; // 'color,opacity' is the first argument
}
i {
transition: color opacity ease-in-out; // 'color' is 1st arg, 'opacity' is 2nd arg
}
同样,i
的语法无效,b
有两个转换:
color 0s ease 0s
opacity 1s ease-in-out 0s