Mixins can also take arguments, which are variables pass to the block of selectors when it is mixed in.(当使用混合时,可以通过选择器块带变量参数。)
.border-radius(@radius) {
-webkit-border-radius: @radius;
-moz-border-radius: @radius;
border-radius: @radius;
}
.box1 {
background-color: #eee;
.border-radius(10px);
}
Parametric mixins can also have default values for their parameters(带参数的混合也可以设置默认的参数)
.border-radius(@radius:10px) {
-webkit-border-radius: @radius;
-moz-border-radius: @radius;
border-radius: @radius;
}
.box1 {
background-color: #eee;
.border-radius(5px);
}
对于带默认参数的混合,我们也可以像下面这种(不带括号)直接调用
.box1 {
background-color: #eee;
.border-radius;
}
You can also use parametric mixins which don't take parameters. This is useful if you want to hide the ruleset from the CSS output, but want to include its properties in other rulesets:(在使用参数混合模式时,也可以不带参数。这是在想要隐藏css的规则集输出,但是又需要在其他规则集里包含它的属性时非常有效的办法)
.box1() {
color: red;
}
.box2 {
.box1;
}
输出为:
.box2 {
color: red;
}
翻译的太渣了,下面用例子来说明
首先定义三个相同名字,并且包含相同参数的三个混合(注意:第一个混合没有默认值,第二个混合的第一个参数没有默认值,第二个参数有默认值,第三个混合的第一个和第二个参数没有默认值,第三个参数有默认值)
.mixin(@color) {
color-1: @color;
}
.mixin(@color; @padding:2) {
color-2: @color;
padding-2: @padding;
}
.mixin(@color; @padding; @margin: 2) {
color-3: @color;
padding-3: @padding;
margin: @margin @margin @margin @margin;
}
调用混合(只传一个参数):
.some .selector div {
.mixin(#008000);
}
输出为:
.some .selector div {
color-1: #008000;
color-2: #008000;
padding-2: 2;
}
因为在使用混合时,只传了一个参数,所以定义的第一个混合(只有一个参数,并且是强制性参数)的属性被使用,第二个混合(有两个参数,第一个参数没有默认值,是强制性参数,第二个参数有默认值,不是强制性参数。所以也属于只具有一个强制性参数的混合)的属性被使用,第三个混合(有三个参数,第一个和第二个参数都没有默认值,都是强制性参数,第三个参数有默认值,不是强制性参数,所以第三个混合属于有两个强制性参数的混合)的属性不被使用。.mixin(@color) {
color-1: @color;
}
.mixin(@color; @padding:2) {
color-2: @color;
padding-2: @padding;
}
.mixin(@color; @padding:2; @margin: 2) {
color-3: @color;
padding-3: @padding;
margin: @margin @margin @margin @margin;
}
.some .selector div {
.mixin(#008000);
}
输出为:
.some .selector div {
color-1: #008000;
color-2: #008000;
padding-2: 2;
color-3: #008000;
padding-3: 2;
margin: 2 2 2 2;
}
结果很明显, 三个混合的属性都被使用了。
再看下面的例子(第二个混合的两个参数都没有默认值,那么第二个混合变成了有两个强制性参数的混合)
.mixin(@color) {
color-1: @color;
}
.mixin(@color; @padding) {
color-2: @color;
padding-2: @padding;
}
.mixin(@color; @padding; @margin: 2) {
color-3: @color;
padding-3: @padding;
margin: @margin @margin @margin @margin;
}
.some .selector div {
.mixin(#008000);
}
输出为:
.some .selector div {
color-1: #008000;
}
结果只有第一个混合的属性被使用了。
.mixin(@color: black; @margin: 10px; @padding: 20px) {
color: @color;
margin: @margin;
padding: @padding;
}
.box1 {
.mixin(@margin: 20px; @color: #33acfe);
}
.box2 {
.mixin(#efca44; @padding: 40px);
}
输出为:
/* line 17, http://localhost/about-less/styles.less */
.box1 {
color: #33acfe;
margin: 20px;
padding: 20px;
}
/* line 20, http://localhost/about-less/styles.less */
.box2 {
color: #efca44;
margin: 10px;
padding: 40px;
}
注意:当定义混合时,把所有参数的默认值去掉后,如下使用,会有意外情况发生
.mixin(@color; @margin; @padding) {
color: @color;
margin: @margin;
padding: @padding;
}
.box1 {
.mixin(@margin: 20px; @color: #33acfe;20px;);
}
.box2 {
.mixin(@margin: 40px;20px; #efca44);
}
输出为:
/* line 6, http://localhost/about-less/styles.less */
.box1 {
color: #33acfe;
margin: 20px;
padding: 20px;
}
/* line 9, http://localhost/about-less/styles.less */
.box2 {
color: 20px;
margin: 40px;
padding: #efca44;
}
在box2中,color和padding的值是反的,所以,在不适用参数名的情况下,less还是会按照参数位置来提供参数值。
.box-shadow(@x: 0; @y: 0; @blur: 1px; @color: #000) {
-webkit-box-shadow: @arguments;
-moz-box-shadow: @arguments;
box-shadow: @arguments;
}
.big-block {
.box-shadow(2px; 5px);
}
输出为:
.big-block {
-webkit-box-shadow: 2px 5px 1px #000;
-moz-box-shadow: 2px 5px 1px #000;
box-shadow: 2px 5px 1px #000;
}
You can use ... if you want your mixin to take a variable number of arguments. Using this after a variable name will assign those arguments to the variable.(如果想要使混合有不确定数量的参数,那么可以使用...。在一个变量名后使用...将会分配那些参数给这个变量)
.mixin(...) //接受n个参数
.mixin() //接受0个参数
.mixin(@a:1) //接受1个参数
.mixin(@a:1;...) //接受n个参数
.mixin(@a;...) //接受1-n个参数
.mixin(@color;@rest...) {
//@rest 表示@color之后的所有参数
//@arguments 表示所有参数
}
.mixin(dark; @color) {
color: darken(@color, 10%);
}
.mixin(light; @color) {
color: lighten(@color, 10%);
}
.mixin(@_; @color) {
display: block;
}
然后再如下这样调用混合
@switch: light;
.class {
.mixin(@switch; #888);
}
输出结果为:
.class {
color: #a2a2a2;
display: block;
}
也可以像下面这样定义混合
.mixin(@a) {
color: @a;
}
.mixin(@a; @b) {
color: fade(@a; @b);
}
当调用时,传一个参数就调用上面的mixin,传两个参数则调用下面的mixin