Sass 是一个具有语法改进的 CSS 预处理器。
Sass文件就是普通的文本文件,里面可以直接使用CSS语法。文件后缀名是.scss,意思为Sassy CSS。
Sass 有四种语法解析器:scss、sass、CSS 和 less。
父选择器 &
在嵌套 CSS 规则时,有时也需要直接使用嵌套外层的父选择器,例如,当给某个元素设定 hover 样式时,或者当 body 元素有某个 classname 时,可以用 &
代表嵌套规则外层的父选择器。
编译后的 CSS 文件中 &
将被替换成嵌套外层的父选择器,如果含有多层嵌套,最外层的父选择器会一层一层向下传递。
&
必须作为选择器的第一个字符,其后可以跟随后缀生成复合的选择器。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| .main { color: black; &-sidebar { border: 1px solid; } &:hover { color: red; } }
.main { color: black; } .main-sidebar { border: 1px solid; } .main:hover { color: red; }
|
嵌套属性
很多 CSS 属性都有同样的前缀,例如:font-family, font-size 和 font-weight , text-align, text-transform 和 text-overflow。
在 Sass 中,我们可以使用嵌套属性来编写它们
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| .box { border: { radius: 5px; color:red; } font: { family:'YaHei'; size:18px; weight:600; } margin: auto { bottom: 10px; top: 10px; }; }
.box { border-radius: 5px; border-color: red; font-family: "YaHei"; font-size: 18px; font-weight: 600; margin: auto; margin-bottom: 10px; margin-top: 10px; }
|
变量 $
变量以美元符号开头,赋值方法与 CSS 属性的写法一样。
1 2 3 4 5 6
| $color: red; $font-size: 16px;
.foo { color: $color; }
|
变量支持块级作用域,嵌套规则内定义的变量只能在嵌套规则内使用(局部变量),不在嵌套规则内定义的变量则可在任何地方使用(全局变量)。将局部变量转换为全局变量可以添加 !global
声明。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| .main { $width: 5em !global; width: $width; }
.sidebar { width: $width; }
.main { width: 5em; }
.sidebar { width: 5em; }
|
#{} 插值语句
标签名或者属性也可以定义为变量,用 #{}
包裹
1 2 3 4 5 6 7 8 9 10 11 12
| // scss $ipt: input; $btm: bottom;
. padding- }
// css .input { padding-bottom: 5rem; }
|
1 2 3 4 5 6 7 8 9 10 11 12
| // scss $name: foo; $attr: border;
p. }
// css p.foo { border-color: blue; }
|
@extend 继承
在设计网页的时候常常遇到这种情况:一个元素使用的样式与另一个元素完全相同,但又添加了额外的样式。通常会在 HTML 中给元素定义两个 class,一个通用样式,一个特殊样式。假设现在要设计一个普通错误样式与一个严重错误样式,一般会这样写
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| .error { border: 1px #f00; background-color: #fdd; } .seriousError { @extend .error; border-width: 3px; }
.error, .seriousError { border: 1px #f00; background-color: #fdd; }
.seriousError { border-width: 3px; }
|
混合指令 @mixin
混合指令(Mixin)用于定义可重复使用的样式,避免了使用无语意的 class。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| @mixin large-text { font: { family: Arial; size: 20px; weight: bold; } color: #ff0000; }
.heading { @include large-text; padding: 4px; margin-top: 10px; }
|
参数用于给混合指令中的样式设定变量,并且赋值使用。
1 2 3 4 5 6 7 8 9 10 11
| @mixin sexy-border($color, $width) { border: { color: $color; width: $width; style: dashed; } }
p { @include sexy-border(blue, 1in); }
|
函数指令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| // scss $grid-width: 40px; $gutter-width: 10px;
@function grid-width($n) { @return $n * $grid-width + ($n - 1) * $gutter-width; }
width: grid-width(5); }
// css
width: 240px; }
|
@for 循环
@for 指令可以在限制的范围内重复输出格式。
有两种写法@for $var from <start> through <end>
和@for $var from <start> to <end>
。
当使用 through
时,条件范围包含 <start>
与 <end>
的值,而使用 to
时条件范围只包含 <start>
的值不包含 <end>
的值*。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| @for $i from 1 through 3 { .item-#{$i} { width: 2em * $i; } }
.item-1 { width: 2em; }
.item-2 { width: 4em; }
.item-3 { width: 6em; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| @for $i from 1 to 3 { .item-#{$i} { width: 2em * $i; } }
.item-1 { width: 2em; }
.item-2 { width: 4em; }
|
一些代码片段
自动添加前缀
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| $namespace: 'el';
@mixin b($block) {
$B: $namespace + '-' + $block !global; .#{$B} { @content; } }
@include b(container) { display: flex; flex-direction: row; }
.el-container { display: flex; flex-direction: row; }
|
参考资料:
scss转css
scss官方文档