参数混合(Parametric Mixins)
上一个小节中我们介绍了 Mixins 作为一个样式继承类实现了样式的复用功能,从这个小节开始我们来介绍下 Mixins 作为一个函数的用法,说到函数那么参数是必不可少的,所以我们这个小节先进行参数的介绍。
1. 什么是参数混合?
慕课解释: 含有传入参数的 Mixins 。
在 Less 中传入参数的 Mixins 就叫做参数混合,我们可将其理解为含有参数的函数。参数的传入有多种方式,大体上与 ES6 函数中参数较为类似,大家如果有 JS 基础的话可以对比着进行理解。
2. 方法详情
在 Mixins 中属性值是固定的,但是我们可以通过传入参数的 Mixins 使属性值作为一个变量,类似于 JS 函数中的参数。
比如下面定义的这个 Mixins :
.border-radius(@radius) {
border-radius: @radius;
}
border-radius
的值是未知的,是由传入的 @radius
变量所决定的。请看下面的代码例子:
- 输入代码
.border-radius(@radius) {
border-radius: @radius;
}
button {
.border-radius(5px);
}
代码解释:第 6 行:当使用这个 Mixins 时(.border-radius(5px))只需要把 @radius
这个变量的数值(5)传入即可。
- 输出代码
button {
border-radius: 5px;
}
3. 使用场景
含有参数的 Mixins 主要应用于复用的属性“值”不定的场景下,例如 color 、 font-size 属性,同时参数也拓展了 Mixins 的使用场景。
4. 设置默认参数
设置默认参数后如果使用 Mixins 未传入参数,将取参数的默认值。
TIPS:未设置默认参数且使用 Mixins 时未传入参数编译会报错
- 输入代码
.circle(@radius: 5px) {
border-radius: @radius;
}
button {
.circle();
}
- 输出代码
button {
border-radius: 5px;
}
5. 设置多个参数
5.1 定义多个参数
当 Mixins 同时包含多个参数时,多个参数之间使用 ;
或者 ,
分隔。建议使用 ;
,因为在 Less 中逗号有两种含义:代表 Mixins 参数分隔符或 CSS 列表分隔符。
如果使用 ,
作为分隔符,就不能使用含有 ,
的属性值作为参数。此外,如果参数之间有一个 ;
作为分隔符,编译器则会认为 ,
属于属性值的一部分。
- 输入代码
.primary(@color; @padding; @margin: 2px) {
color: @color;
padding: @padding;
margin-top: @margin;
}
button {
.primary(#ffffff; 5px);
}
- 输出代码
button {
color: #ffffff;
padding: 5px;
margin-top: 5px;
}
5.2 参数顺序
Mixins 中的参数可以不按照特定的顺序定义,可以直接使用其参数名称进行定义。
- 输入代码
.mixin(@color: black; @margin: 10px; @padding: 20px) {
color: @color;
margin: @margin;
padding: @padding;
}
.primary {
.mixin(@margin: 20px; @color: #33acfe);
}
.success {
// 第一个参数未填写参数名称,所以代表的是 @color
// 第二个参数名称为 @padding ,所以说 @margin 参数未传入会取默认值
.mixin(#efca44; @padding: 40px);
}
- 输出代码
.primary {
color: #33acfe;
margin: 20px;
padding: 20px;
}
.success {
color: #efca44;
margin: 10px;
padding: 40px;
}
5.3 @argument 变量
@argument 代表调用 Mixins 时传入的所有参数。
如果我们想要同时处理所有参数,可以使用 @argument 变量。
- 输入代码
.box-shadow(@x: 0; @y: 0; @z: 1px; @color: #000) {
box-shadow: @arguments;
}
button {
.box-shadow(2px; 5px);
}
- 输出代码
button {
box-shadow: 2px 5px 1px #000;
}
5.4 剩余参数
如果想要接收可变数量的参数,我们可以使用 ...
代表其余的参数。
.mixin(...) // 匹配第 0-N 个参数
.mixin(@a: 1; ...) // 匹配第 0-N 个参数
.mixin(@a; ...) // 匹配第 1-N 个参数
.mixin(@a; @rest...) {
// @rest 表示在 @a 后的所有参数
// @arguments 表示所有参数
}
- 示例代码
.box-shadow(...) {
box-shadow: @rest;
}
button {
.box-shadow(2px; 5px; 1px; #000);
}
- 输出代码
button {
box-shadow: 2px 5px 1px #000;
}
5.5 经验分享
同时定义多个名称和参数相同的 Mixins 是可行的,编译时将会使用所有可以应用的属性。
- 输入代码
.img(@color) {
bgckground: @color;
}
.img(@color; @padding: 2px) {
color: @color;
padding: @padding;
}
div {
.img(#000);
}
- 输出代码
div {
backgroundcolor: #000;
color: #000;
padding: 2px;
}
当多个相同名称的 Mixins 存在时,调用时将会选择最符合的那个 Mixins 。
所以我们可以定义一个标识,以便于引用正确的 Mixins 。 比如:
- 输入代码
@postion: right;
.margin(left; @size) {
margin-left: @size;
}
.margin(right; @size) {
margin-right: @size;
}
button {
.margim(@postion; 20px);
}
- 输出代码
button {
margin-right: 20px;
}
6. 总结
本章节主要学习了 Mixins 参数使用的几种方式,这几种方式与 ES6 中函数的参数思想较为类似,有默认参数、@argument、剩余参数等,熟练应用可以使你的 Mixins 灵活性更强,但是一定要注意两个同名 Mixins 之间的覆盖问题,为 Mixins 加上命名空间可以防止类似的问题发生。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论