原文链接 http://sass-lang.com/documentation/file.SASS_REFERENCE.html#defining_a_mixin
定义一个Mixin: @mixin
@mixin large-text {
font: {
family: Arial; //会编译成font-family...
size: 20px;
weight: bold;
}
color: #ff0000;
}
因为一些历史遗留问题,Mixin的命名可以连字符与下划线互换的,也就是说,large-text这个mixin也可以这样引入:include large_text
,反之亦然。个人还是建议使用连字符来命名以及使用变量
引入一个Mixin: @include
.page-title {
@include large-text;
padding: 4px;
margin-top: 10px;
}
最后被编译成:
.page-title {
font-family: Arial;
font-size: 20px;
font-weight: bold;
color: #ff0000;
padding: 4px;
margin-top: 10px; }
Mixin中也可以包含其它mixin,例如:
@mixin compound {
@include highlighted-background;
@include header-text;
}
@mixin highlighted-background { background-color: #fc0; }
@mixin header-text { font-size: 20px; }
Mixin的参数
Mixin可以传递SassScript值作为参数,这个值就是在include的时候指定的。
@mixin sexy-border($color, $width) {
border: {
color: $color;
width: $width;
style: dashed;
}
}
p { @include sexy-border(blue, 1in); }
被编译成:
p {
border-color: blue;
border-width: 1in; //1in代表1英尺
border-style: dashed; }
Mixin也能够指定参数的默认值,当你在include mixin的时候,如果没有传递参数,那么将使用默认值;如果重新传递了参数,那么就会覆盖默认值。
@mixin sexy-border($color, $width: 1in) {
border: {
color: $color;
width: $width;
style: dashed;
}
}
p { @include sexy-border(blue); } //使用了默认宽度
h1 { @include sexy-border(blue, 2in); } //覆盖了默认宽度值
被编译成:
p {
border-color: blue;
border-width: 1in;
border-style: dashed; }
h1 {
border-color: blue;
border-width: 2in;
border-style: dashed; }
关键字参数
显式关键字参数方式引入
p { @include sexy-border($color: blue); }
h1 { @include sexy-border($color: blue, $width: 2in); }
虽然这样看上去并不简洁,但是它的可读性更高了。
最大的优点是允许以任何顺序进行传参。
可变参数
对于一个s允许有不确定个数的参数是非常有意义的,比如说box-shadow属性,它允许定义多个阴影,可能有时候你也无法确定你需要的阴影个数,这时候你就需要Variable Arguments
。
@mixin box-shadow($shadows...) {
-moz-box-shadow: $shadows;
-webkit-box-shadow: $shadows;
box-shadow: $shadows;
}
.shadows {
@include box-shadow(0px 4px 5px #666, 2px 6px 10px #999);
}
被编译成:
.shadows {
-moz-box-shadow: 0px 4px 5px #666, 2px 6px 10px #999;
-webkit-box-shadow: 0px 4px 5px #666, 2px 6px 10px #999;
box-shadow: 0px 4px 5px #666, 2px 6px 10px #999;
}
可变参数也可以以关键字方式传入:
@mixin colors($text, $background, $border) {
color: $text;
background-color: $background;
border-color: $border;
}
$values: #ff0000, #00ff00, #0000ff;
.primary {
@include colors($values...);
}
$value-map: (text: #00ff00, background: #0000ff, border: #ff0000); //使用了keywords($args)的方法,
.secondary {
@include colors($value-map...);
}
被编译成:
.primary {
color: #ff0000;
background-color: #00ff00;
border-color: #0000ff;
}
.secondary {
color: #00ff00;
background-color: #0000ff;
border-color: #ff0000;
}
还可以在s中引入其它:
@mixin wrapped-stylish-($args...) {
font-weight: bold;
@include stylish-($args...);
}
.stylish {
// $width参数将作为关键字传入"stylish-"
@include wrapped-stylish-(#00ff00, $width: 100px);
}
传递内容块给一个mixin
通过@content来传递内容块
@mixin apply-to-ie6-only {
* html {
@content;
}
}
@include apply-to-ie6-only {
#logo {
background-image: url(/logo.gif);
}
}
被编译成:
* html #logo {
background-image: url(/logo.gif);
}
变量范围与内容块
在mixin外部申明的内容块的变量作用域无法指向mixin内部参数,例如下面的列子所示,$color指向全局作用域
$color: white;
@mixin colors($color: blue) {
background-color: $color;
@content;
border-color: $color;
}
.colors {
@include colors { color: $color; }
}
被编译成:
.colors {
background-color: blue;
color: white;
border-color: blue;
}