1.背景
如果你的网站中有几处样式相同的话,比如一些颜色和字体,那么可以使用变量来处理这个问题.但是当你的样式越来越多,需要复用大段的样式,独立变量就显得有点吃力了,这时候你可以通过sass中的混合器来进行复用(当然也可以用占位符或者继承,下面会讨论这三者之间的区别).
2.混合器@mixin
特点:可传参
缺点:如果在样式文件中调用同一个混合宏,会产生多个对应的样式代码,造成代码的冗余.
不传参数使用方法:
@mixin cont{
color: red;
font-size: 14px;
}
调用:
body{
@include cont;
}
这个看上去好像跟占位符的用法一样,是的,两者几乎没有很大区别,唯一不同的是当一个页面中多次调用的话,@mixin不会将样式相同的代码进行合并,而使用占位符多次调用的话则会处理这个问题.下面先进行代码演示这个问题的存在,再来接着讨论@mixin混合器.
scss:
@mixin my-color{
color: red;
}
.div1{
@include my-color;
}
.div2{
@include my-color;
}
生成之后的css:
/* line 5, ../sass/mixin2.scss */
.div1 {
color: red;
}
/* line 9, ../sass/mixin2.scss */
.div2 {
color: red;
}
但是我想要的结果是这样的:
/* line 13, ../sass/mixin2.scss */
.div1, .div2 {
color: green;
}
而使用占位符后:
%my-color{
color: green;
}
.div3{
@extend %my-color;
}
.div4{
@extend %my-color;
}
生成代码:
/* line 13, ../sass/mixin2.scss */
.div3, .div4 {
color: green;
}
相比之下显然是这个代码比较友好一点.
混合器@mixin好处在于它能够传参数进行操作...
多值参数:
调用时可不传参数,则使用默认值,也可直接传入值,如@include传入参数的个数小于@mixin定义参数的个数,则按照顺序表示,后面不足的使用默认值,如不足的没有默认值则报错。除此之外还可以选择性的传入参数,使用参数名与值同时传入。
@mixin cont($color:red,$fontSize:14px){
color: $color;
font-size: $fontSize;
}
body{
@include cont();
}
生成代码:
/* line 8, ../sass/mixin.scss */
body {
color: red;
font-size: 14px;
}
多组参数:
如果一个参数可以有多组值,如box-shadow、transition等,那么参数则需要在变量后加三个点表示,如$variables...。
scss:
@mixin box-shadow($shadow...) {
-webkit-box-shadow:$shadow;
box-shadow:$shadow;
}
.box{
border:1px solid #ccc;
@include box-shadow(0 2px 2px rgba(0,0,0,.3),0 3px 3px rgba(0,0,0,.3),0 4px 4px rgba(0,0,0,.3));
}
css:
.box {
border: 1px solid #ccc;
-webkit-box-shadow: 0 2px 2px rgba(0, 0, 0, 0.3), 0 3px 3px rgba(0, 0, 0, 0.3), 0 4px 4px rgba(0, 0, 0, 0.3);
box-shadow: 0 2px 2px rgba(0, 0, 0, 0.3), 0 3px 3px rgba(0, 0, 0, 0.3), 0 4px 4px rgba(0, 0, 0, 0.3);
}
如果不写这三个点,就会报错:混合器只带一个参数,却传入了3个参数
以上小结:当大量复用样式中需要使用到变量的时候可以使用混合器@mixin进行重写,例如圆角的兼容性,处理浏览器前缀等问题,否则使用继承@extend进行重写.如有不足,希望大神可以留言指点一丢丢,有问题也可以一起讨论.