Sass 为样式书写引入了结构化编程方案,允许我们在 CSS 原有的顺序结构之外书写判断和循环结构。
判断
在 Sass 中,我们可以使用 @if、@else if、@else 来书写条件语句。
代码语言:javascript复制$bool1: true;
$bool2: false;
.inner {
@if ($bool1) { // true
font-size: 14px;
}
@if ($bool1 and $bool2) { // false
color: red;
} @else if ($bool1 or $bool2) { // true
color: green;
} @else {
color: blue;
}
}
编译后
代码语言:javascript复制.inner {
font-size: 14px;
color: green;
}
在布尔运算中,关键字 and 表示“且”,or 表示 “或”。
循环
与 JS 一样,Sass 中有多个用于书写循环结构的指令,如 @for、@while、@each。
@for
@for循环,有两种写法:
代码语言:javascript复制// @for 控制变量 from 起始值 through 终止值
@for $i from 1 through 3 {
.through-#{$i} {
width: 2em * $i;
}
}
// @for 控制变量 from 起始值 to 终止值
@for $i from 1 to 3 {
.to-#{$i} {
width: 2em * $i;
}
}
在循环中,控制变量将从起始值加到终止值。
through 和 to 的区别: through 包含终止值;to 不包含终止值。
编译后
代码语言:javascript复制.through-1 {
width: 2em;
}
.through-2 {
width: 4em;
}
.through-3 {
width: 6em;
}
.to-1 {
width: 2em;
}
.to-2 {
width: 4em;
}
@while
@while 需要一个控制表达式,表达式的值为 true 时,循环继续;值为 false 时,循环结束。
代码语言:javascript复制$i: 1;
@while $i < 5 { // 表示式值为 true,循环继续
.while-#{$i} {
width: 2em * $i;
}
$i: $i 2;
}
编译后
代码语言:javascript复制.while-1 {
width: 2em;
}
.while-3 {
width: 6em;
}
@each
@each 可用于循环遍历一个值列表,list 或 map。
map 在遍历将被转化为 list 的形式,如 (key1: value1, key2: value2) 将被转化为 (key1 value1) (key2 value2)。
代码语言:javascript复制$list-border: (width 2px) (style dotted) (color green);
@each $prop, $value in $list-border {
.list {
border-#{$prop}: $value;
}
}
$map-border: (width: 1px, style: dashed, color: blue);
@each $prop, $value in $map-border {
.map {
border-#{$prop}: $value;
}
}
编译后
代码语言:javascript复制.list {
border-width: 2px;
}
.list {
border-style: dotted;
}
.list {
border-color: green;
}
.map {
border-width: 1px;
}
.map {
border-style: dashed;
}
.map {
border-color: blue;
}