一、基本使用
1. 使用变量$
先说明下载css中定义变量的写法
:root {
--color:#f00;
}
body {
--border-color:#f2f2f2;
}
.header {
--background-color:#f8f8f8;
}
p {
color: var(--color);
border-color: var(--border-color);
}
.header {
background-color: var(--background-color);
}
在scss中定义变量有如下规则:
- 变量名以美元 $ 开头,后面跟变量名;
- 变量名是不以数字开头的可包含字母、数字、下划线、横线(连接符);
- 写法同 css,即变量名与值之间用 : 分隔;
- 变量一定要先定义,后使用;
注意,在定义变量时,$font-B
和$font_B
是一样的含义,写在后面的会覆盖前面的变量。可用于配置颜色、字体,或全局配置图片路径等。
2. 默认变量值 !default
!default
可以给变量赋予默认值。该变量假如已经赋值,那么它不会被重新赋值,但是,如果它尚未赋值,那么它会被赋予新的给定值。
3. 局部变量和全局变量
局部变量: 在选择器内定义的变量,只能在选择器范围内使用,相当于块作用域;
全局变量:定义后能全局使用的变量,有两种定义方式,一种是在选择器外面的最前面定义的变量;另一种是使用 !global
标志定义全局变量。
4. 变量值类型
变量值的类型可以有很多种,SASS支持7种主要的数据类型:
- 数字 (例如:
1.2
,13
,10px
) - 文本字符串,带引号字符串和不带引号字符串(例如:
"foo"
,'bar'
,baz
) - 颜色 (例如:
blue
,#04a3f9
,rgba(255, 0, 0, 0.5)
) - 布尔值 (例如:
true
,false
) - 空值 (例如:
null
) - 值列表 (list),用空格或逗号分隔 (例如:
1.5em 1em 0 2em
,Helvetica, Arial, sans-serif
) - maps ,从一个值映射到另一个 (例如:
(key1: value1, key2: value2)
)
注意,用 () 表示不包含任何值的空数组(在 Sass 3.3 版之后也视为空的 map)
$layer-index:10;
$border-width:3px;
$font-base-family:'Open Sans', Helvetica, Sans-Serif;
$top-bg-color:rgba(255,147,29,0.6);
$block-base-padding:6px 10px 6px 10px;
$blank-mode:true;
$var:null; // 值null是其类型的唯一值。它表示缺少值,通常由函数返回以指示缺少结果。
$color-map: (color1: #fa0000, color2: #fbe200, color3: #95d7eb);
$fonts: (serif: "Helvetica Neue",monospace: "Consolas");
5. 语法嵌套规则
选择器嵌套
Sass 允许将一个 CSS 样式嵌套进另一个样式中,内层样式仅适用于外层样式的选择器范围内(可以理解为层级选择器),这有助于避免父选择器重复,相对于复杂的CSS布局中多层嵌套的选择器 要简单得多,例如
#main p {
color: #00ff00;
width: 97%;
.redbox {
background-color: #ff0000;
color: #000000;
}
}
父选择器 &
有些时候需要直接使用嵌套外层的父选择器,这个就很有用了,例如,你可能喜欢给选择器指定 hover
样式,或者当body
元素具有某个样式时,在这些情况下,你可以 &
字符来明确地表示插入指定父选择器。 例如:
a {
font-weight: bold;
text-decoration: none;
&:hover { text-decoration: underline; }
body.firefox & { font-weight: normal; }
}
&
必须出现在的选择器的开头位置(也就是作为选择器的第一个字符),但可以跟随后缀,将被添加到父选择的后面。 例如:
#main {
color: black;
&-sidebar { border: 1px solid; }
}
注意,父选择器 &
被作为一个后缀的时候,Sass 将抛出一个错误。
嵌套属性
CSS中有一些属性遵循相同的“命名空间”;比如,font-family
, font-size
, 和 font-weight
都在font
命名空间中。在CSS中,如果你想在同一个命名空间中设置一串属性,你必须每次都输出来。Sass为此提供了一个快捷方式:只需要输入一次命名空间,然后在其内部嵌套子属性。例如:
.funky {
font: {
family: fantasy;
size: 30em;
weight: bold;
}
}
命名空间也可以有自己的属性值。例如:
// scss
.funky {
font: 20px/24px fantasy {
weight: bold;
}
}
// 编译为
.funky {
font: 20px/24px fatasy;
font-weight: bold;
}
补充,font 属性的定义
font 属性是(按顺序): "font-style font-variant font-weight font-size/line-height font-family"
,font-size
和 font-family
的值是必需的。如果缺少了其他值,默认值将被插入,如果有默认值的话。
占位符选择器 %xxx
有时,需要定义一套样式并不是给某个元素用,而是只通过 @extend
指令使用,尤其是在制作 Sass 样式库的时候,希望 Sass 能够忽略用不到的样式。例如:
.button%base {
display: inline-block;
margin-bottom: 0;
font-weight: normal;
font-size: 14px;
// ...
user-select: none;
}
如果没有通过@extend
指令使用这个样式,这个样式在编译成css时是会被忽略的。
通过 @extend
指令使用
// scss
.btn-default {
@extend %base;
color: #333;
background-color: #fff;
border-color: #ccc;
}
.btn-success {
@extend %base;
color: #fff;
background-color: #5cb85c;
border-color: #4cae4c;
}
// 编译为
.button.btn-danger, .button.btn-success {
display: inline-block;
margin-bottom: 0;
font-weight: normal;
font-size: 14px;
// ...
user-select: none;
}
.btn-default {
color: #333;
background-color: #fff;
border-color: #ccc;
}
.btn-success {
color: #fff;
background-color: #5cb85c;
border-color: #4cae4c;
}
6. 注释
Sass支持两种注释
- 标准的css多行注释 /* ... */ 会编译到.css文件中
- 单行注释 // 不会编译到.css文件
7. SASS导入@import
@import
Sass 拓展了 @import
的功能,允许其导入 SCSS 或 Sass 文件。被导入的文件将合并编译到同一个 CSS 文件中,另外,被导入的文件中所包含的变量或者混合指令 (mixin) 都可以在导入的文件中使用。
// public.scss
$font-base-color: #333;
// index.scss
@import "public"
.container {
color: $font-base-color;
}
如下几种方式,都将作为普通的css语句,不会导入任何sass文件
- 文件拓展名是 .css;
- 文件名以 http:// 开头;
- 文件名是 url();
- @import 包含 media queries
@import "public.css";
@import url(public);
@import "http://xxx.com/xxx";
@import 'landscape' screen and (orientation:landscape);
局部文件
Sass源文件中可以通过@import
指令导入其他Sass源文件,被导入的文件就是局部文件,局部文件让Sass模块化编写更加容易。
如果一个目录正在被Sass程序监测,目录下的所有scss/sass源文件都会被编译,但通常不希望局部文件被编译,因为局部文件是用来被导入到其他文件的。如果不想局部文件被编译,文件名可以以下划线 (_)开头
嵌套 @import
虽然在大部分情况下,一般都是在文档的顶层使用 @import
,但是也可以在CSS 规则和@media
规则中包含@import
语句。就像一个基层的 @import
,这里会包含 @import
导入文件的内容。但是,只是这样导入的样式只能出现在嵌套的层中。例如
// _base.scss
.example {
color: red;
}
// index.scss
.container {
@import "example";
}
// 编译为
.container .example {
color: red;
}
注意:@import不能使用在控制指令或混入中。
二、指令
1. 混合指令 (@mixin)
混入(mixin)允许您定义可以在整个样式表中重复使用的样式,而避免了使用无语意的类(class),比如 .float-left
。混入(mixin)还可以包含所有的CSS规则,以及任何其他在Sass文档中被允许使用的东西。
他们甚至可以带arguments
,引入变量,只需少量的混入(mixin)代码就能输出多样化的样式。
基础定义与使用
混入(mixin)通过 @mixin
指令定义。在它后面跟混入的名称和任选的arguments
,以及混入的内容块。例如,large-text
混入定义如下:
@mixin large-text {
font: {
family: Arial;
size: 20px;
weight: bold;
}
color: #ff0000;
}
混入也可以包含选择器和属性的混合体,选择器中甚至可以包含父选择器。例如:
@mixin clearfix {
display: inline-block;
&:after {
content: ".";
display: block;
height: 0;
clear: both;
visibility: hidden;
}
* html & { height: 1px }
}
注意,由于历史原因,混入(mixin)的名字(和所有其他 Sass 标识符)可以互换连字符和下划线。例如,如果你定义了一个名为add-column
的混入,你可以把它作为add_column
,反之亦然。
使用 @include
指令可以将混入(mixin)引入到文档中。这需要一个混入的名称和可选的参数传递给它,并包括由混入定义的当前规则的样式。 例如:
.page-title {
@include large-text;
padding: 4px;
margin-top: 10px;
}
混入(mixin)定义也可以包含其他的混入。例如:
@mixin highlighted-background { background-color: #fc0; }
@mixin header-text { font-size: 20px; }
@mixin compound {
@include highlighted-background;
@include header-text;
}
带参数混入
混入可以用SassScript 值作为参数,给定的参数被包括在混入中并且作为变量提供给混入。
当定义一个混入(mixin)的时候,参数被作为变量名,写到混入(mixin)名字后面的括号内,多个参数可以用逗号分隔。然后,当调用混入的时候,值通过对应的参数顺序被传递。 例如
@mixin sexy-border($color, $width) {
border: {
color: $color;
width: $width;
style: dashed;
}
}
p {
@include sexy-border(blue, 1in);
}
当然也可以给参数赋默认值 ($color, $width: 1in)
如果在使用 @include
指令时明确使用关键字参数,那么命名的参数可以按照任意顺序传递
h1 { @include sexy-border( $width: 2in, $color: blue ); }
如果不确定参数个数的话,可以使用可变参数来定义参数,参数看起来就像普通参数一样,但后面跟随着...。例如:
@mixin box-shadow($shadows...) {
-moz-box-shadow: $shadows;
-webkit-box-shadow: $shadows;
box-shadow: $shadows;
}
.shadows {
@include box-shadow(0px 4px 5px #666, 2px 6px 10px #999);
}
混入样式中使用插槽
在引用混合样式的时候,可以先将一段代码带入到混合指令中,然后再输出混合样式,额外导入的部分将 @content
标志占位:
$color: white;
@mixin colors($color: blue) {
background-color: $color;
@content;
border-color: $color;
}
.colors {
@include colors { color: $color; }
}
// 编译为
.colors {
background-color: blue;
color: white;
border-color: blue;
}
总结
- mixin是可以重复使用的一组CSS声明
- mixin有助于减少重复代码,只需声明一次,就可在文件中引用
- 混合指令可以包含所有的 CSS 规则,绝大部分 Sass 规则,甚至通过参数功能引入变量,输出多样化的样式。
- 使用参数时建议加上默认值
2. 函数指令(@function)
Sass 支持自定义函数,并能在任何值或脚本上下文中使用。例如:
$grid-width: 40px;
$gutter-width: 10px;
@function grid-width($n) {
@return $n * $grid-width + ($n - 1) * $gutter-width;
}
#sidebar { width: grid-width(5); }
// 编译后
#sidebar { width: 240px; }
函数可以访问任何全局定义的变量,以及接受参数,就像一个混入。函数可以包含语句,并且你必须调用@return
来设置函数的返回值。当然,可以像关键字混入一样,传入参数名来调用函数,也支持可变参数。
3. 继承指令 (@extend)
在没有继承指令前,以警告框为例,通常会在HTML中定义两个class,一个是通用警告框样式,一个是不同颜色的警告框样式
使用继承@extend改进
可以使用 @extend
继承通用样式,使用时就无需在html中写两个class了
.alert{
padding: 15px;
// ...
border: 1px solid transparent;
}
.alert-info {
@extend .alert;
color: #31708f;
// ...
}
.alert-success {
@extend .alert;
color: #3c763d;
// ...
}
使用多个@extend
当然可以使用多个 @extend
.alert-success {
@extend .alert;
@extend .important;
color: #3c763d;
// ...
}
@extend多层继承
一个选择器可以扩展另一个选择器,另一个选择器又扩展的第三选择器选择。 例如:
.error {
border: 1px #f00;
background-color: #fdd;
}
.seriousError {
@extend .error;
border-width: 3px;
}
.criticalError {
@extend .seriousError;
position: fixed;
top: 10%;
bottom: 10%;
left: 10%;
right: 10%;
}
占位符%
被继承的css父类并没有被实际应用,对于该类,可能不希望被编译输出到最终的css文件中,它只会增加CSS文件的大小,永远不会被使用。
这时候可以使用占位符%,在Sass文件中使用占位符选择器时,它可以用于扩展其他选择器,但不会被编译成最终的CSS。
%alert {
padding: 15px;
margin-bottom: 20px;
border: 1px solid transparent;
border-radius: 4px;
font-size: 12px;
}
.alert-info {
@extend %alert;
color: #31708f;
background-color: #d9edf7;
border-color: #bce8f1;
}
4. @use指令
@use
可以从其他 sass 样式表加载 mixin, funcition 和变量,并将来自多个样式表的css组合在一起。
通过 @use "module"
使用模块时,可以不需要写扩展名,程序会自动查找。
语法:@use "Address" as spacename
;
Adress: scss 文件路径
spacename:命名空间(防止加载多个文件导致引用混淆)
@use "_base.scss" as base;
.button {
@include base.borderColor;
color: base.$color;
}
重要的是,通过@use
加载的模块不管被引用多少次,都会在编译后输出一次到css中。但使用@import
多次引入同一模块,会反复输出到css中。
注意,@use
的前面只能出现@forward
或变量声明,其它的所有代码只能出现在 @use
之后。
5. @forward指令
当使用@use
加载文件A时,当前文件中可以使用@forward
来使A文件中的 mixin,函数和变量可以暴露出去。通常用于跨多个文件组织 sass 库。
通过 @forward
加载一个模块的成员,这些成员并不能在当前文件内访问,而仅仅是将这些成员当作自己的成员对外暴露出去。例如:
//a.scss
$color:red;
.a{
color: $color;
font-size: 16px;
}
//b.scss
@forward 'a.scss'; // 转发a中的变量,并引入普通样式代码
.b{
// 虽然没有使用 @use 不能访问模块 a.scss 的变量,但可以继承它的样式
@extend .a;
// 如果写 color: a.$red 会报错,因为没有使用 @use "a.scss"
}
//css.scss
@use 'b.scss';
.index{
@extend .a;
background-color: b.$color;
}
通过 @forward "module" as xxx-*
可以给同一个模块中的成员统一添加前缀。
假设有 a.scss
, b.scss
, c.scss
三个模块中都有一个名叫 $color
的变量:
// bus.scss
@forward 'a.scss' as a-*;
@forward 'b.scss' as b-*;
@forward 'c.scss' as c-*;
// index.scss
@use 'bus.scss';
.index {
background-color: bus.$a-color;
color: bus.$b-color;
border: 1px solid bus.$c-color;
在转发其他模块的成员时,可以对成员进行配置,修改默认值,或者指定一个确定的值均可。
// a.scss
$red: #f00 !default;
$black: #000 !default;
$green: #0f0 !default;
// b.scss
// 转发成员时进行配置,修改默认值,或修改为固定的值
@forward 'a.scss' with (
$red: #f55 !default,
$black: #333,
);
// index.scss
@use 'b.scss' with (
$red: #f11,
);
.div {
color: b.$red; // #f11
background-color: b.$black; // #333
border-color: b.$green; // #0f0
}
默认情况下,@forward
会将一个模块中所有成员都转发,如果只想转发某些成员,或不想转发某些成员,可以这样书写:
-
@forward "module" hide $var, mixinName, fnName
禁止转发某些成员 -
@forward "module" show $var, mixinName, fnName
只转发某些成员
各个成员通过逗号 ,
分隔开,如果成员是变量,不能省略 $
符号。
三、SassScript
1. SASS 运算 (Operations)符的基本使用
等号操作符
所有的数据都支持等号运算符:
符号 | 说明 |
---|---|
== | 等于 |
!= | 不等于 |
例1:数字比较
$theme:1;
.container {
@if $theme==1 {
background-color: red;
}
@else {
background-color: blue;
}
}
例2:字符串比较
$theme:"blue";
.container {
@if $theme !="blue" {
background-color: red;
}
@else {
background-color: blue;
}
}
关系(比较)运算符
关系运算符只能用于整数比较
符号 | 说明 |
---|---|
<(lt) | 小于 |
>(gt) | 大于 |
<=(lte) | 小于等于 |
>=(gte) | 大于等于 |
例子
$theme:3;
.container {
@if $theme >= 5 {
background-color: red;
}
@else {
background-color: blue;
}
}
逻辑运行符
符号 | 说明 |
---|---|
and | 逻辑与 |
or | 逻辑或 |
not | 逻辑非 |
+ 运算符
width: 50 + 20; // 70
width: 50 + 20%; // 70%
width: 50% + 20%; // 70%
width: 20 + 10px; // 30px
width: 10px + 20px; // 30px
width: 10px + 10pt; // 23.3333333333px
// width: 20% + 10px; // Error have incompatible units.
// width: 10px * 2pt; // Error 20px*pt isn't a valid CSS value.
- 运算符
width: 50 - 30; // 20
width: 50 - 30%; // 20%
width: 60% - 30%; // 30%
width: 20px - 10px; // 10px
width: 50px - 20pt; // 23.3333333333px
width: 50px - 20; // 30px
// width: 50px - 20%; // Error have incompatible units.
*运算符
width: 20 * 10; // 200
width: 5 * 20%; // 100
// width: 10% * 20%; //Error 出现了两个百分号
// width: 10px * 20px //Error 出现了两个单位
width: 10px * 2; // 20px
/运算符
/
在 CSS 中通常起到分隔数字的用途,SassScript 作为 CSS 语言的拓展当然也支持这个功能,同时也赋予了 /
除法运算的功能。也就是说,如果/
在 SassScript 中把两个数字分隔,编译后的 CSS 文件中也是同样的作用。
width: 10 / 5; // 此时的/没有被当作运算符,原样输出 10 / 5
width: (10 / 5); // 2
以下三种情况 /
将被视为除法运算符号:
- 如果值或值的一部分,是变量或者函数的返回值
- 如果值被圆括号包裹
- 如果值是算数表达式的一部分
$width: 1000px;
div {
width: ($width/2); // 使用变量与括号
z-index: round(10)/2; // 使用了函数
height: (500px/2); // 使用了括号
margin-left: 5px + 8px/2px; // 使用了+表达式
}
%运算符
width: 10 % 3; // 1
width: 50 % 3px; // 2px
width: 50px % 3px; // 2px
width: 50% % 7; // 1%
width: 50px % 7; // 1px
width: 50% % 9%; // 5%
// width: 50% % 2px; // Error have incompatible units.
width: 50px % 10pt; // 10pt == 13.33333px 50px % 10pt=> 10px
字符串运算
+
可用于连接字符串
注意:如果有引号字符串(位于 + 左侧)连接无引号字符串,运算结果是有引号的,相反,无引号字符串(位于 + 左侧)连接有引号字符串,运算结果则没有引号。(如果有一个值是函数返回的,情况可能不一样)
.container {
content: "Foo" + Bar; // "FooBar"
content: Foo + Bar; // FooBar
content: "Foo" + "Bar"; // "FooBar"
font-family: sans- + "serif"; // sans-serif
}
2. 插值语句#{}
使用插值语句#{}
,可以确保 /
不做除法运算而是完整地编译到 CSS 文件中
p {
$font-size: 12px;
$line-height: 30px;
font: #{$font-size}/#{$line-height} Helvetica,sans-serif;
// font: 16px/30px Arial, Helvetica, sans-serif;
}
通过 #{}
插值语句可以在选择器、属性名、注释中使用变量:
$class-name:danger;
$attr:color;
$author:"zzz";
/*
这是文件说明部分
@author:#{$author}
*/
a .#{$class-name} {
border-#{$attr}: #F00;
}
3. 常见函数的基本使用
这里介绍常见函数使用,更多函数移步官网
Color(颜色函数)
sass包含很多操作颜色的函数。例如:lighten()
与 darken()
函数可用于调亮或调暗颜色,opacify()
函数使颜色透明度减少,transparent()
函数使颜色透明度增加,mix()
函数可用来混合两种颜色。
String(字符串函数)
Sass有许多处理字符串的函数,比如向字符串添加引号的quote()
、获取字符串长度的string-length()
和将内容插入字符串给定位置的string-insert()
。
p{
&:after{
content: quote(这是里面的内容);
content: str-insert($string: "abce", $insert:"d" , $index: 4);
}
background-color: unquote($string: "#f00");
z-index: str-length("sass学习");
}
Math(数值函数)
数值函数处理数值计算,例如:percentage()
将无单元的数值转换为百分比,round()
将数字四舍五入为最接近的整数,min()
和max()
获取几个数字中的最小值或最大值,random()
返回一个随机数。
p {
z-index: abs($number: -15); // 15
z-index: ceil(5.8); //6
z-index: max(5, 1, 6, 8, 3); //8
opacity: random(); // 随机 0-1
}
List
List函数操作List,length()
返回列表长度,nth()
返回列表中的特定项,join()
将两个列表连接在一起,append()
在列表末尾添加一个值。
p {
z-index: length(12px); //1
z-index: length(12px 5px 8px); //3
z-index: index(a b c d, c); //3
padding: append(10px 20px, 30px); // 10px 20px 30px
color: nth($list: red blue green, $n: 2); // blue
}
Map函数
Map函数操作Map,map-get()
根据键值获取map中的对应值,map-merge()
来将两个map合并成一个新的map,map-values()
映射中的所有值。
$font-sizes:("small":12px,"normal":18px,"large":24px);
$padding:(top:10px,right:20px,bottom:10px,left:30px);
p{
font-size: map-get($map: $font-sizes, $key: "normal"); // 18px
@if map-has-key($padding, "right"){
padding-right: map-get($padding, "right"); // 20px
}
&:after{
// '"small", "normal", "large" 10px, 20px, 10px, 30px';
content: map-keys($font-sizes) + " "+ map-values($padding) + "";
}
}
selector选择器函数
选择符相关函数可对CSS选择进行一些相应的操作,例如:selector-append()
可以把一个选择符附加到另一个选择符,selector-unify()
将两组选择器合成一个复合选择器。
.header{
background-color: #000;
content: selector-append(".a",".b",".c") + ''; // ".a.b.c"
content: selector-unify("a",".diasbled") + ''; // "a.diasbled"
}
自检函数
自检相关函数,例如:feature-exists()
检查当前Sass版本是否存在某个特性,variable-exists()
检查当前作用域中是否存在某个变量,mixin-exists()
检查某个mixin是否存在。
$color:#F00;
@mixin padding($left:0, $top:0, $right:0, $bottom:0) {
padding: $top $right $bottom $left;
}
.container {
@if variable-exists(color) {
color: $color;
}
@else {
content: "$color不存在";
}
@if mixin-exists(padding) {
@include padding($left: 10px, $right: 10px);
}
}
4. 流程控制指令@if、@for、@each、@while
@if 控制指令
@if()
函数允许您根据条件进行分支,并仅返回两种可能结果中的一种。
语法方式同js的if....else if ...else
$theme:"green";
.container {
@if $theme=="red" {
color: red;
}
@else if $theme=="blue" {
color: blue;
}
@else if $theme=="green" {
color: green;
}
@else {
color: darkgray;
}
}
@for指令
@for 指令可以在限制的范围内重复输出格式,每次按要求(变量的值)对输出结果做出变动。这个指令包含两种格式:@for $var from through
,或者 @for $var from to
,区别在于 through
与 to
的含义:
- 当使用
through
时,条件范围包含<start>与<end>的值。 - 而使用
to
时条件范围只包含<start>的值不包含<end>的值。 - 另外,
$var
可以是任何变量,比如$i
<start> 和<end> 必须是整数值。
@for $i from 1 to 4 {
.p#{$i} {
width: 10px * $i;
height: 30px;
background-color: red;
}
}
@for $i from 1 through 3 {
.p#{$i} {
width: 10px * $i;
height: 30px;
background-color: red;
}
}
@each指令
有这样一个例子,普通CSS写法
p{
display:inline-block;
width:10px;
height:10px;
margin:10px;
}
p:nth-child(1){
background:red;
}
p:nth-child(2){
background:green;
}
p:nth-child(3){
background:blue;
}
p:nth-child(4){
background:orange;
}
p:nth-child(5){
background:pink;
}
使用@each
指令改写,@each
指令的格式是 $var in <list>
, $var
可以是任何变量名,比如 $length
或者 $name
,而<list>
是一连串的值,也就是值列表。
p{
width:10px;
height:10px;
margin:10px;
display:inline-block;
}
$color-list:red green blue orange pink;
@each $color in $color-list{
/*使用index()获取当前颜色在列表的所属位置*/
$index:index($color-list,$color);
p:nth-child(#{$index}){
background:$color;
}
}
@while 指令
@while
指令重复输出格式直到表达式返回结果为 false
。这样可以实现比 @for
更复杂的循环。
用sass实现bootstrap中css的这么一段代码:
.col-sm-12 {
width: 100%;
}
.col-sm-11 {
width: 91.66666667%;
}
.col-sm-10 {
width: 83.33333333%;
}
.col-sm-9 {
width: 75%;
}
.col-sm-8 {
width: 66.66666667%;
}
.col-sm-7 {
width: 58.33333333%;
}
.col-sm-6 {
width: 50%;
}
.col-sm-5 {
width: 41.66666667%;
}
.col-sm-4 {
width: 33.33333333%;
}
.col-sm-3 {
width: 25%;
}
.col-sm-2 {
width: 16.66666667%;
}
.col-sm-1 {
width: 8.33333333%;
}
用@while
改写:
$column:12;
@while $column > 0 {
.col-sm-#{$column}{
// width:$column / 12*100%;
// width: calc($column / 12) * 100%;
width: unquote($string: $column / 12 * 100 + '%');
}
$column:$column - 1;
}