Scss语法三混入和函数

续接上回。

混合指令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

作者

胡兆磊

发布于

2022-06-30

更新于

2022-10-23

许可协议