续接上回。
混合指令mixin
混合指令(Mixin)用于定义可重复使用的样式,避免了使用无语意的 class,比如 .float-left。混合指令可以包含所有的 CSS 规则,绝大部分 Sass 规则,甚至通过参数功能引入变量,输出多样化的样式。
定义混合指令
混合指令的用法是在 @mixin 后添加名称与样式,比如名为 large-text 的混合通过下面的代码定义:
1 2 3 4 5 6 7 8
| @mixin large-text { font: { family: Arial; size: 20px; weight: bold; } color: #ff0000; }
|
混合也需要包含选择器和属性,甚至可以用 & 引用父选择器:
1 2 3 4 5 6 7 8 9 10 11
| @mixin clearfix { display: inline-block; &:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } * html & { height: 1px } }
|
引用混合指令
使用 @include 指令引用混合样式,格式是在其后添加混合名称,以及需要的参数(可选):
1 2 3 4 5
| .page-title { @include large-text; padding: 4px; margin-top: 10px; }
|
编译为
1 2 3 4 5 6 7
| .page-title { font-family: Arial; font-size: 20px; font-weight: bold; color: #ff0000; padding: 4px; margin-top: 10px; }
|
也可以在最外层引用混合样式,不会直接定义属性,也不可以使用父选择器。
1 2 3 4 5 6 7
| @mixin silly-links { a { color: blue; background-color: red; } } @include silly-links;
|
编译为
1 2 3 4
| a { color: blue; background-color: red; }
|
参数
参数用于给混合指令中的样式设定变量,并且赋值使用。在定义混合指令的时候,按照变量的格式,通过逗号分隔,将参数写进圆括号里。引用指令时,按照参数的顺序,再将所赋的值对应写进括号:
1 2 3 4 5 6 7 8
| @mixin sexy-border($color, $width) { border: { color: $color; width: $width; style: dashed; } } p { @include sexy-border(blue, 1in); }
|
编译为
1 2 3 4
| p { border-color: blue; border-width: 1in; border-style: dashed; }
|
混合指令也可以使用给变量赋值的方法给参数设定默认值,然后,当这个指令被引用的时候,如果没有给参数赋值,则自动使用默认值:
1 2 3 4 5 6 7 8 9
| @mixin sexy-border($color, $width: 1in) { border: { color: $color; width: $width; style: dashed; } } p { @include sexy-border(blue); } h1 { @include sexy-border(blue, 2in); }
|
编译为
1 2 3 4 5 6 7 8 9 10 11
| p { border-color: blue; border-width: 1in; border-style: dashed; }
h1 { border-color: blue; border-width: 2in; border-style: dashed; }
|
混合指令也可以使用关键词参数,上面的例子也可以写成:
1 2
| p { @include sexy-border($color: blue); } h1 { @include sexy-border($color: blue, $width: 2in); }
|
向混合样式中导入内容
在引用混合样式的时候,可以先将一段代码导入到混合指令中,然后再输出混合样式,额外导入的部分将出现在 @content 标志的地方:
1 2 3 4 5 6 7 8 9 10
| @mixin apply-to-ie6-only { * html { @content; } } @include apply-to-ie6-only { #logo { background-image: url(/logo.gif); } }
|
编译为
1 2 3
| * html #logo { background-image: url(/logo.gif); }
|
使用插值语句
1 2 3 4 5 6
| @mixin firefox-message($selector) { body.firefox #{$selector}:before { content: "Hi, Firefox users!"; } } @include firefox-message(".header");
|
编译为
1 2 3
| body.firefox .header:before { content: "Hi, Firefox users!"; }
|
为便于书写,@mixin 可以用 = 表示,而 @include 可以用 + 表示,但是一般不会使用简写形式。
函数指令
Sass 支持自定义函数,并能在任何属性值或 Sass script 中使用:
1 2 3 4 5 6 7 8
| $grid-width: 40px; $gutter-width: 10px;
@function grid-width($n) { @return $n * $grid-width + ($n - 1) * $gutter-width; }
#sidebar { width: grid-width(5); }
|
编译为
1 2
| #sidebar { width: 240px; }
|
与 mixin 相同,也可以传递若干个全局变量给函数作为参数。一个函数可以含有多条语句,需要调用 @return 输出结果。
自定义的函数也可以使用关键词参数,上面的例子还可以这样写:
1
| #sidebar { width: grid-width($n: 5); }
|
建议在自定义函数前添加前缀避免命名冲突,其他人阅读代码时也会知道这不是 Sass 或者 CSS 的自带功能。
自定义函数与 mixin 相同,都支持 variable arguments