在mixins中,多个属性被视为单独的参数

时间:2011-04-01 07:57:08

标签: less less-mixins

我正在尝试编写一个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;  
}

有什么想法吗?

4 个答案:

答案 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有两个转换,其中未指定的值默认为其初始值:

  1. color 0s ease 0s
  2. opacity .5s ease-in-out 0s
  3. 这可能不是你想要的。 (看起来你想要color .5s ease-in-out 0sopacity .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有两个转换:

    1. color 0s ease 0s
    2. opacity 1s ease-in-out 0s