Scss语法一嵌套语法和SassScript

最近在看Element UI的源码,发现源码中写的很多样式都用到了Scss的各种语法,虽然可读性不高但是看着是真帅啊。为了方便阅读Element的源码,花点时间把Scss文档上的常用语法大概过一遍吧。

嵌套规则

1
2
3
4
5
6
7
// 嵌套规则
#main{
width: 100%;
.box{
width: 100%;
}
}

父选择器&

1
2
3
4
5
6
7
// 嵌套规则
#main{
width: 100%;
&:hover{
cursor: pointer;
}
}

属性嵌套

1
2
3
4
5
6
7
.text-box{
// 属性嵌套
font: {
family: "fantasy";
size: 30px;
}
}

编译为:

1
2
3
4
.text-box{
font-family: "fantasy";
font-size: 30px;
}

占位符选择器%foo

Sass 额外提供了一种特殊类型的选择器:占位符选择器 (placeholder selector)。与常用的 id 与 class 选择器写法相似,只是 #. 替换成了 %。必须通过 @extend指令调用

当占位符选择器单独使用时(未通过 @extend 调用),不会编译到 CSS 文件中

有时,需要定义一套样式并不是给某个元素用,而是只通过 @extend 指令使用,尤其是在制作 Sass 样式库的时候,希望 Sass 能够忽略用不到的样式。

如果使用普通的 CSS 规则,最后会编译出很多用不到的样式,也容易与其他样式名冲突,所以,Sass 引入了“占位符选择器” (placeholder selectors),看起来很像普通的 idclass 选择器,只是 #. 被替换成了 %。可以像 class 或者 id 选择器那样使用,当它们单独使用时,不会被编译到 CSS 文件中。

1
2
3
4
5
6
// 单独使用不会被编译
#context a%extreme {
color: blue;
font-weight: bold;
font-size: 2em;
}

占位符选择器需要通过延伸指令使用,用法与 class 或者 id 选择器一样,被延伸后,占位符选择器本身不会被编译。

1
2
3
.notice {
@extend %extreme;
}

编译为

1
2
3
4
5
#context a.notice {
color: blue;
font-weight: bold;
font-size: 2em;
}

SassScript

在 CSS 属性的基础上 Sass 提供了一些名为 SassScript 的新功能。 SassScript 可作用于任何属性,允许属性使用变量、算数运算等额外功能。

通过 interpolation,SassScript 甚至可以生成选择器或属性名,这一点对编写 mixin 有很大帮助。

变量$

SassScript 最普遍的用法就是变量,变量以美元符号开头,赋值方法与 CSS 属性的写法一样:

1
$width: 5em;

直接使用即调用变量:

1
2
3
#main {
width: $width;
}

变量支持块级作用域,嵌套规则内定义的变量只能在嵌套规则内使用(局部变量),不在嵌套规则内定义的变量则可在任何地方使用(全局变量)。将局部变量转换为全局变量可以添加 !global 声明:

1
2
3
4
5
6
7
8
#main {
$width: 5em !global;
width: $width;
}

#sidebar {
width: $width;
}

编译为

1
2
3
4
5
6
7
#main {
width: 5em;
}

#sidebar {
width: 5em;
}
圆括号

圆括号可以用来影响运算的顺序:

1
2
3
p {
width: 1em + (2em * 3);
}

编译为

1
2
3
p {
width: 7em;
}
插值语句#{}

通过 #{} 插值语句可以在选择器或属性名中使用变量:

1
2
3
4
5
$name: foo;
$attr: border;
p.#{$name} {
#{$attr}-color: blue;
}

编译为

1
2
3
p.foo {
border-color: blue;
}

#{} 插值语句也可以在属性值中插入 SassScript,大多数情况下,这样可能还不如使用变量方便,但是使用 #{} 可以避免 Sass 运行运算表达式,直接编译 CSS。

1
2
3
4
5
p {
$font-size: 12px;
$line-height: 30px;
font: #{$font-size}/#{$line-height};
}

编译为

1
2
p {
font: 12px/30px; }

插值语句在mixin中根据参数来动态的给标签设置样式会更常用,该用法在mixin中在标注。

作者

胡兆磊

发布于

2022-06-30

更新于

2022-10-23

许可协议