前面的 “Less 混入基础” 章节介绍了混入的基础用法,混入是支持带参数混入的,下面将详细介绍 Less 的混入参数。
我们直接通过一个简单的例子来说明,下面例子定义了一个混入(.border-radius),并且接收一个参数(@radius),参数默认值为 5px:
// 如果不指定默认参数,语法: // .border-radius(@radius) { ... } .border-radius(@radius: 5px) { -webkit-border-radius: @radius; -moz-border-radius: @radius; border-radius: @radius; }
使用混入:
// 带参数引用混入 #header { .border-radius(4px); } .button { .border-radius(6px); } // 不带参数引用混入,使用混入的默认值 #header { .border-radius(); } .button { .border-radius(); }
注意,如果你想从 CSS 输出中隐藏规则集(即混入),但又想将其属性包含在其他规则集中,可以这样做:
// .wrap() 换入自身是不会输出到 CSS 中的,除非引用混入 .wrap() { text-wrap: wrap; white-space: -moz-pre-wrap; white-space: pre-wrap; word-wrap: break-word; } // 引用混入 pre { .wrap() }
Less 的参数当前以分号或逗号分隔。
最初,参数只用逗号分隔,但后来添加了分号以支持将逗号分隔的列表值传递给单个参数。
注意:从 Less 4.0 开始,你可以使用括号转义 [~()] 来封装列表值,例如 .name(@param1: ~(red, blue)) 这类似于引用转义语法:~"quote",这可能会使你的代码库中不需要分号分隔符。
例子:
两个参数,每个参数都包含逗号分隔列表: .name(1, 2, 3; something, else)
三个参数,每个参数包含一个数字: .name(1, 2, 3)
使用虚拟分号创建一个 mixin 调用,其中一个参数包含一个逗号分隔的 css 列表:.name(1, 2, 3;)。
注意:如果结尾的分号看起来很奇怪,你可能更喜欢: .name(~(1, 2, 3))
编写逗号分隔默认值的方法:
@param-values: red, blue; .name(@param1: @param-values)
.name(@param1: red, blue;)
.name(@param1: ~(red, blue))
定义多个具有相同名称和参数数量的混合是合法的。Less 将使用所有可以应用的属性。如果你使用带有一个参数的混入,例如 .mixin(green);,然后将使用具有一个强制参数的所有混入的属性:
.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); }
编译 less,输出的 CSS 如下:
.some .selector div { // 来自 .mixin(@color) color-1: #008000; // 来自 .mixin(@color, @padding: 2),因为 @padding 参数有默认值,调用合法 color-2: #008000; padding-2: 2; }
注意,.mixin(@color, @padding, @margin: 2) 不能被调用,因为 @padding 没有提供默认值,它是强制参数,引入时值传递了一个参数,不匹配。
混入引用可以通过名称而不是位置来提供参数值。任何参数都可以通过其名称来引用,并且它们不必按任何特殊顺序排列:
// 定义混入,最大接收三个参数 .mixin(@color: black; @margin: 10px; @padding: 20px) { color: @color; margin: @margin; padding: @padding; } // 引入混入 .class1 { // .mixin(@margin: 20px; @color: #33acfe); } .class2 { // #efca44 将传递给 @color,按位置匹配 // 40px 传递给 @padding,通过命名参数匹配 .mixin(#efca44; @padding: 40px); }
编译 less,输出的 CSS 如下:
.class1 { color: #33acfe; margin: 20px; padding: 20px; } .class2 { color: #efca44; margin: 10px; padding: 40px; }
@arguments 变量在混入中有特殊含义,它包含调用混入时传递的所有参数。如果你不想单独处理每一个参数的话就可以像这样写:
// 定义一个混入,接收四个参数,参数均有默认值 .box-shadow (@x: 0, @y: 0, @blur: 1px, @color: #000) { box-shadow: @arguments; -moz-box-shadow: @arguments; -webkit-box-shadow: @arguments; } // 调用混入,传递两个参数 #my { .box-shadow(2px, 5px); }
编译 less,输出的 CSS 如下:
#my { box-shadow: 2px 5px 1px #000; -moz-box-shadow: 2px 5px 1px #000; -webkit-box-shadow: 2px 5px 1px #000; }
如果你希望你的混入可接受可变数量的参数,你可以使用 “...”(三个点)。在变量名之后使用它会将这些参数分配给变量:
.mixin(...) { // 匹配 0-N 个参数 .mixin() { // 匹配 0 个参数 .mixin(@a: 1) { // 匹配 0-1 个参数 .mixin(@a: 1, ...) { // 匹配 0-N 个参数 .mixin(@a, ...) { // 匹配 1-N 个参数
此外:
.mixin(@a, @rest...) { // @rest 绑定到 @a 之后的参数 // @arguments 绑定到所有参数 }