官方文档

什么时候使用 CSS 预处理器,可以参考目录 CSS -> 书籍 -> CSS 揭秘下的 “我们应该使用预处理器吗”。

语法格式

Sass 有两种语法格式

第一种是早期的缩进格式,通常简称 “Sass”,这种格式以 .sass 作为拓展名。

第二种是 Sass3 引入的新语法 SCSS (Sassy CSS),这种格式以 .scss 作为拓展名。

任何一种格式可以直接 导入 (@import) 到另一种格式中使用,或者通过 sass-convert 命令行工具转换成另一种格式:

  1. # Sass 转换成 SCSS
  2. $ sass-convert style.sass style.scss
  3. # SCSS 转换成 sass
  4. $ sass-convert style.scss style.sass

image.png

使用 Sass

安装图文教程

Windows 系统需要先安装 Ruby

安装 Sass

gem install sass

在命令行中运行 Sass:

sass input.scss output.css

监视单个 Sass 文件,每次修改并保存时自动编译:

sass --watch input.scss:output.css

监视整个文件夹:

sass --watch app/sass:public/stylesheets

缓存

Sass 自动缓存编译后的模板与 partials,这样做能够显著提升重新编译的速度。

单独使用 Sass,缓存内容保存在 .sass-cache 文件夹中。

判断语法格式

Sass 命令行工具根据文件的拓展名判断所使用的语法格式,没有文件名时 sass 命令默认编译 .sass 文件,添加 --scss 选项或者使用 scss 命令编译 SCSS 文件。

CSS 功能拓展

嵌套规则

Sass 允许将一套 CSS 样式嵌套进另一套样式中,内层的样式将它外层的选择器作为父选择器,嵌套功能避免了重复输入父选择器。

示 例

#main {
  width: 97%;
  p, div {
    font-size: 2em;
    a { font-weight: bold; }
  }
  pre { font-size: 3em; }
}

编译为

#main {
  width: 97%; }
  #main p, #main div {
    font-size: 2em; }
    #main p a, #main div a {
      font-weight: bold; }
  #main pre {
    font-size: 3em; }

父选择器 &

当给某个元素设定 hover 样式时,或者当 body 元素有某个 classname 时,可以用 & 表示引用父选择器。

& 必须作为选择器的第一个字符,其后可以跟随后缀生成复合的选择器。

示 例

a {
  color: #333;
  &:hover {
     color: #fff;
  }
  /*生成复合的选择器*/
  & &-text {
    font-size: 15px;
  }
}

编译为

a {
  color: #333;
}
a:hover {
  color: #fff;
}
a a-text {
  font-size: 15px;
}

如果没有父选择器,&的值将为null。这意味着你可以在mixin中使用它来检测父选择器是否存在。

@mixin does-parent-exist {
  @if & {
    &:hover {
      color: red;
    }
  } @else {
    a {
      color: red;
    }
  }
}

属性嵌套

有些 CSS 属性遵循相同的命名空间 (namespace),比如 font-family, font-size, font-weight 都以 font 作为属性的命名空间。

避免了重复输入 Sass 允许将属性嵌套在命名空间中

示 例

.funky {
  font: {
    family: fantasy;
    size: 30em;
    weight: bold;
  }
}

编译为

.funky {
  font-family: fantasy;
  font-size: 30em;
  font-weight: bold; }

命名空间也可以包含自己的属性值,例如:

.funky {
  font: 20px/24px {
    family: fantasy;
    weight: bold;
  }
}

/*编译后*/
.funky {
  font: 20px/24px;
  font-family: fantasy;
  font-weight: bold; }

注释

Sass 中有三种注释

单行注释

使用 // 进行注释,注释不会在 expanded 和 compressed 编译格式中显示

多行注释

使用 /* */ 进行注释,注释会在 expanded 编译格式中显示,不会在 compressed 编译格式中显示

强制注释

使用 /*! */ 进行注释,强制注释会在任何编译后的文件中显示,通常用于添加版权信息。

SassScript

Interactive Shell

Interactive Shell 可以在命令行中测试 SassScript 的功能。在命令行中输入 sass -i,然后输入想要测试的 SassScript 查看输出结果:

$ sass -i
>> "Hello, Sassy World!"
"Hello, Sassy World!"
>> 1px + 1px + 1px
3px
>> #777 + #777
#eeeeee
>> #777 + #888
white

变量 $

变量以美元符号开头,赋值方法与 CSS 属性的写法一样:

$width: 5em;

直接使用即调用变量:

#main {
  width: $width;
}

嵌套规则内定义的变量是局部变量,不在嵌套规则内定义的变量则是全局变量,将局部变量转换为全局变量可以添加 !global 声明。

#main {
  $width: 5em !global;
  width: $width;
}

#sidebar {
  width: $width;
}

编译为

#main {
  width: 5em;
}

#sidebar {
  width: 5em;
}

数据类型

  • 数字,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, 相当于 JavaScript 的 object,(key1: value1, key2: value2)

字符串(Strings)

SassScript 支持 CSS 的两种字符串类型:有引号字符串,如 "Lucida Grande" 'http://sass-lang.com';与无引号字符串,如 sans-serif bold,在编译 CSS 文件时不会改变其类型。只有使用 #{} (插值语句) 时,有引号字符串将被编译为无引号字符串,这样便于在 mixin 中引用选择器名:

@mixin firefox-message($selector) {
  body.firefox #{$selector}:before {
    content: "Hi, Firefox users!";
  }
}
@include firefox-message(".header");

编译为

body.firefox .header:before {
  content: "Hi, Firefox users!"; }

数组 (Lists)

数组 (lists) 指 Sass 如何处理 CSS 中 margin: 10px 15px 0 0 或者 font-face: Helvetica, Arial, sans-serif 这样通过空格或者逗号分隔的一系列的值。只包含一个值的也被视为数组。

数组中可以包含子数组,比如 padding: 5px 10px, 5px 0 是包含 5px 10px5px 0 两个数组的数组。也可以使用空格分割子数组,如 (5px 10px) (5px 0)

当数组被编译为 CSS 时,Sass 不会添加任何圆括号(CSS 中没有这种写法),所以 (5px 10px) (5px 0)5px 10px, 5px 0 在编译后的 CSS 文件中是完全一样的,但是它们在 Sass 文件中却有不同的意义,前者是包含两个数组的数组,而后者是包含四个值的数组。

() 表示不包含任何值的空数组(在 Sass 3.3 版之后也视为空的 map)。空数组不可以直接编译成 CSS,比如编译 font-family: () Sass 将会报错。如果数组中包含空数组或空值,编译时将被清除,比如 1px 2px () 3px1px 2px null 3px

基于逗号分隔的数组允许保留结尾的逗号,这样做的意义是强调数组的结构关系,尤其是需要声明只包含单个值的数组时。例如 (1,) 表示只包含 1 的数组,而 (1 2 3,) 表示包含 1 2 3 这个以空格分隔的数组的数组。

Maps

Maps 可视为键值对的集合(类似 js 中的对象), 和 Lists 不同 Maps 必须被圆括号包围 。 语法格式为 $map: (key1: value1, key2: value2) ,能用在列表上的函数同样适用 map 类型的数据类型。

运算

所有数据类型均支持相等运算 == 或不相等运算 !=,此外,每种数据类型也有其各自支持的运算方式。

数字运算

SassScript 支持数字的加减乘除、取整等运算 (+, -, *, /, %)。

当使用 / 进行除法运算时,Sass 会原样输入,因为有些 css 属性会用到这种方式。例如 font: 16px/1.8 serif 以下三种情况 / 将被视为除法运算符号:

  • 如果值,或值的一部分,是变量或者函数的返回值
  • 如果值被圆括号包裹
  • 如果值是算数表达式的一部分

    示 例

p {
  font: 10px/8px;             // 纯 css 不能使用除法
  $width: 1000px;
  width: $width/2;            // 使用一个变量
  width: round(1.5)/2;        // 使用一个函数
  height: (500px/2);          // 使用括号
  margin-left: 5px + 8px/2px; // 使用了 + 是算数表达式的一部分
}

编译为

p {
  font: 10px/8px;
  width: 500px;
  height: 250px;
  margin-left: 9px; }

如果需要使用变量,同时又要确保 / 不做除法运算而是完整地编译到 CSS 文件中,只需要用 #{} 插值语句将变量包裹。

p {
  $font-size: 12px;
  $line-height: 30px;
  font: #{$font-size}/#{$line-height};
}

编译为

p {
  font: 12px/30px; }

颜色值运算

颜色值的运算是分段计算进行的,也就是分别计算红色,绿色,以及蓝色的值:

p {
  color: #010203 + #040506;
}

计算 01 + 04 = 05 02 + 05 = 07 03 + 06 = 09,然后编译为

p {
  color: #050709; }

使用 color functions(看不懂) 比计算颜色值更方便一些。

数字与颜色值之间也可以进行算数运算,同样也是分段计算的,比如:

p {
  color: #010203 * 2;
}

计算 01 * 2 = 02 02 * 2 = 04 03 * 2 = 06,然后编译为

p {
  color: #020406; }

需要注意的是,如果颜色值包含透明通道(rgba 或 hsla 两种颜色值),必须拥有相等的 alpha 值才能进行运算,因为算术运算不会作用于 alpha 值。

p {
  color: rgba(255, 0, 0, 0.75) + rgba(0, 255, 0, 0.75);
}

编译为

p {
  color: rgba(255, 255, 0, 0.75); }

颜色值的透明通道 可以通过 opacifytransparentize 两个函数进行调整。

IE 滤镜要求所有的颜色值包含 alpha 层,而且格式必须固定 #AABBCCDD,使用 ie_hex_str 函数可以很容易地将颜色转化为 IE 滤镜要求的格式。此处涉及 CSS3 filter 属性。

$translucent-red: rgba(255, 0, 0, 0.5);
$green: #00ff00;
div {
  filter: progid:DXImageTransform.Microsoft.gradient(enabled='false', startColorstr='#{ie-hex-str($green)}', endColorstr='#{ie-hex-str($translucent-red)}');
}

编译为

div {
  filter: progid:DXImageTransform.Microsoft.gradient(enabled='false', startColorstr=#FF00FF00, endColorstr=#80FF0000);
}

字符串运算

+ 可用于连接字符串

注意,如果有引号字符串(位于 + 左侧)连接无引号字符串,运算结果是有引号的,相反,无引号字符串(位于 + 左侧)连接有引号字符串,运算结果则没有引号

p:before {
  content: "Foo " + Bar;
  font-family: sans- + "serif";
  cursor: e + -resize;
}

编译为

p:before {
  content: "Foo Bar";
  font-family: sans-serif;
    cursor: e-resize;
}

在有引号的文本字符串中使用 #{} 插值语句可以添加动态的值:

p:before {
  content: "I ate #{5 + 10} pies!";
}

编译为

p:before {
  content: "I ate 15 pies!"; }

布尔运算

SassScript 支持布尔型的 and or 以及 not 运算。

and

>> (5px > 3px) and (5px > 10px)
false
>> (5px > 3px) and (5px < 10px)
true

or

>> (5px > 3px) or (5px > 10px)
true
>> (5px > 3px) and (5px < 10px)
true

not

相当于取反

>> not(5px > 3px)
false
>> not(5px > 3px)
true

函数

SassScript 定义了多种函数

关键词参数

Sass 函数允许使用关键词参数

虽然不够简明,但是阅读起来会更方便。关键词参数给函数提供了更灵活的接口,以及容易调用的参数。关键词参数可以打乱顺序使用,如果使用默认值也可以省缺,另外,参数名被视为变量名,下划线、短横线可以互换使用。

p {
  color: hsl($hue: 0, $saturation: 100%, $lightness: 50%);
}

插值语句 #{}

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

$name: foo;
$attr: border;
p.#{$name} {
  #{$attr}-color: blue;
}

编译为

p.foo {
  border-color: blue; }

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

变量定义 !default

可以在变量的结尾添加 !default 给一个未通过 !default 声明赋值的变量赋值。如果变量已经被赋值,不会再被重新赋值,但是如果变量还没有被赋值,则会被赋予新的值。

变量是 null 空值时将视为未被赋值。

$content: "First content";
$content: "Second content?" !default;

#main {
  content: $content;
}

编译为

#main {
  content: "First content"; }

@-Rules 与指令

Sass 支持所有的 CSS3 @-Rules,以及 Sass 特有的 “指令”(directives)。

@import

Sass 拓展了 @import 的功能,允许其导入 SCSS 或 Sass 文件。被导入的文件将合并编译到同一个 CSS 文件中,另外,被导入的文件中所包含的变量或者混合指令 (mixin) 都可以在导入的文件中使用。

通常,@import 寻找 Sass 文件并将其导入,但在以下情况下,@import 仅作为普通的 CSS 语句,不会导入任何 Sass 文件。

  • 文件拓展名是 .css
  • 文件名以 http:// 开头;
  • 文件名是 url()
  • @import 包含 media queries。

如果不在上述情况内,文件的拓展名是 .scss.sass,则导入成功。没有指定拓展名,Sass 将会试着寻找文件名相同,拓展名为 .scss.sass 的文件并将其导入。

@import "foo.scss";

@import "foo";

Sass 允许同时导入多个文件,例如同时导入 rounded-corners 与 text-shadow 两个文件:

@import "rounded-corners", "text-shadow";

分音

有些样式作为共同样式被提取出来,使用 _ 进行区分。使用 _ 开头的 sass 文件不会被编译成 css 文件,该文件称为局部文件(partials)

使用 _ 开头的文件导入时不需要加上 _

注意,不可以同时存在添加下划线与未添加下划线的同名文件,添加下划线的文件将会被忽略。

例如,将文件命名为 _colors.scss,便不会编译 _colours.css 文件。

@import "colors";

嵌套 @import

大多数情况下,一般在文件的最外层(不在嵌套规则内)使用 @import,其实,也可以将 @import 嵌套进 CSS 样式或者 @media 中,与平

时的用法效果相同,只是这样导入的样式只能出现在嵌套的层中。

假设 example.scss 文件包含以下样式:

.example {
  color: red;
}

然后导入到 #main 样式内

#main {
  @import "example";
}

将会被编译为

#main .example {
  color: red;
}

不可以在混合指令 (mixin) 或控制指令 (control directives) 中嵌套 @import

@media

Sass 中 @media 指令与 CSS 中用法一样,只是增加了一点额外的功能:允许其在 CSS 规则中嵌套。如果 @media 嵌套在 CSS 规则内,编译时,@media 将被编译到文件的最外层,包含嵌套的父选择器。这个功能让 @media 用起来更方便,不需要重复使用选择器,也不会打乱 CSS 的书写流程。

.sidebar {
  width: 300px;
  @media screen and (orientation: landscape) {
    width: 500px;
  }
}

编译为

.sidebar {
  width: 300px; }
  @media screen and (orientation: landscape) {
    .sidebar {
      width: 500px; } }

@media 的查询允许互相嵌套使用,编译时,Sass 自动添加 and

@media screen {
  .sidebar {
    @media (orientation: landscape) {
      width: 500px;
    }
  }
}

编译为

@media screen and (orientation: landscape) {
  .sidebar {
    width: 500px; } }

@media 甚至可以使用 SassScript(比如变量,函数,以及运算符)代替条件的名称或者值:

$media: screen;
$feature: -webkit-min-device-pixel-ratio;
$value: 1.5;
@media #{$media} and ($feature: $value) {
  .sidebar {
    width: 500px;
  }
}

编译为

@media screen and (-webkit-min-device-pixel-ratio: 1.5) {
  .sidebar {
    width: 500px; } }

@extend

在设计网页的时候常常遇到这种情况:一个元素使用的样式与另一个元素完全相同,但又添加了额外的样式。通常会在 HTML 中给元素定义两个 class,一个通用样式一个特殊样式,这样做带来了很多不便。

@extend 也会继承到使用到该选择器的样式(个人理解:被继承的选择器之后的选择器也同样会继承,下面示例的 .error.intrusion 就体现了该性质,如果被继承的选择器之前还有其它选择器,那么继承了该选择器样式的选择器也会加上同样的选择器…)

示 例

.error {
  border: 1px #f00;
  background-color: #fdd;
}
.error.intrusion {
  background-image: url("/image/hacked.png");
}
.seriousError {
  @extend .error;
  border-width: 3px;
}

编译为

.error, .seriousError {
  border: 1px #f00;
  background-color: #fdd; }

.error.intrusion, .seriousError.intrusion {
  background-image: url("/image/hacked.png"); }

.seriousError {
  border-width: 3px; }

延伸复杂的选择器

Class 选择器并不是唯一可以被延伸 (extend) 的,Sass 允许延伸任何定义给单个元素的选择器,比如 .special.coola:hover 或者 a.user[href^="http://"] 等,例如:

.hoverlink {
  @extend a:hover;
}
a:hover {
  text-decoration: underline;
}

编译为

a:hover, .hoverlink {
  text-decoration: underline; }

所有 a:hover 的样式将继承给 .hoverlink,包括其他使用到 a:hover 的样式,例如:

.hoverlink {
  @extend a:hover;
}
.comment a.user:hover {
  font-weight: bold;
}

编译为

.comment a.user:hover, .comment .user.hoverlink {
  font-weight: bold; }

多重延伸

同一个选择器可以延伸给多个选择器,它所包含的属性将继承给所有被延伸的选择器:

.error {
  border: 1px #f00;
  background-color: #fdd;
}
.attention {
  font-size: 3em;
  background-color: #ff0;
}
.seriousError {
  @extend .error;
  @extend .attention;
  border-width: 3px;
}

编译为

.error, .seriousError {
  border: 1px #f00;
  background-color: #fdd; }
.attention, .seriousError {
  font-size: 3em;
  background-color: #ff0; }
.seriousError {
  border-width: 3px; }

多重延伸可以使用逗号分隔选择器名,比如 @extend .error, .attention;@extend .error; @extend.attention 有相同的效果。

继续延伸

当一个选择器延伸给第二个后,可以继续将第二个选择器延伸给第三个,例如:

.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%;
}

现在,每个 .seriousError 选择器将包含 .error 的样式,而 .criticalError 不仅包含 .seriousError 的样式也会同时包含 .error 的所有样式,上面的代码编译为:

.error, .seriousError, .criticalError {
  border: 1px #f00;
  background-color: #fdd; }
.seriousError, .criticalError {
  border-width: 3px; }
.criticalError {
  position: fixed;
  top: 10%;
  bottom: 10%;
  left: 10%;
  right: 10%; }

选择器列

暂时不可以将选择器列 (Selector Sequences),比如 .foo .bar.foo + .bar,延伸给其他元素,但是,却可以将其他元素延伸给选择器列:

#fake-links .link {
  @extend a;
}
a {
  color: blue;
  &:hover {
    text-decoration: underline;
  }
}

编译为

a, #fake-links .link {
  color: blue; }
  a:hover, #fake-links .link:hover {
    text-decoration: underline; }

编译格式

语法:

sass —watch [被监视目录]:[编译文件目录] —style [格式名]

ul {
  font-size: 15px;
  li {
    list-style: none;
  }
}

nested 嵌套(默认)

ul {
  font-size: 15px; }
  ul li {
    list-style: none; }

compact 紧凑

sass —watch sass:css —style compact

ul { font-size: 15px; }
ul li { list-style: none; }

expanded 扩展

sass —watch sass:css —style expanded

ul {
  font-size: 15px;
}
ul li {
  list-style: none;
}

compressed 压缩

sass —watch sass:css —style compressed

ul{font-size:15px}ul li{list-style:none}

mixin(混合)

语法:

也可以省略参数

@mixin 名字 (参数1, 参数2) {
   ··· 
}

示例:

image.png

函数

darken()

改变颜色的明度(加深颜色)
css 输出结果会换算成 16 进制

/*编译前*/
a {
  color: darken(#ffe5e5, 10%);
}

/*编译后*/
a {
  color: #ffb2b2;
}

lighten

改变颜色的明度(增亮颜色)
css 输出结果会换算成 16 进制

/*编译前*/
a {
  color: darken(hsl(222, 100%, 50%), 10%);
}

/*编译后*/
a {
  color: #003dcc;
}

saturate

增加颜色的饱和度

/*编译前*/
a {
  color: saturate(#ffe5e5, 10%);
}

/*编译后*/
a {
  color: #ffe5e5;
}

desaturate

降低颜色的饱和度

/*编译前*/
a {
  color: desaturate(hsl(221, 50%, 50%), 10%);
}

/*编译后*/
a {
  color: #4d6db3;
}

transparentize

减少颜色的透明度

原本的透明度减去设置的值

/*编译前*/
a {
  color: transparentize(hsla(221, 50%, 50%, 0.5), 0.3);
}

/*编译后*/
a {
  color: rgba(64, 104, 191, 0.2);
}

opacify

增加颜色的透明度

原本的透明度加上设置的值

/*编译前*/
a {
  color: opacify(hsla(221, 50%, 50%, 0.5), 0.3);
}

/*编译后*/
a {
  color: rgba(64, 104, 191, 0.8);
}

adjust-hue

调整颜色的色相

css 最后会生成 16 进制的颜色

第二个参数是需要调整的颜色,第二个参数是调整色相的度数(deg)
即可以使用 hsl 也可以使用 16 进制

$base-color: #ff0000;
$base-color-hsl: hsl(0, 100%, 50%);

/*编译前*/
body {
  background-color: adjust-hue($base-color, 137deg);
  color: adjust-hue($base-color-hsl, 137deg);
}

/*编译后*/
body {
  background-color: #00ff48;
  color: #00ff48;
}

abs()

返回一个数的绝对值

>> abs(-10)
10
>> abs(10px)
10px

round()

四舍五入

>> round(3.5)
4
>> round(3.2)
3

ceil()

向上进位

>> ceil(3.2)
4
>> ceil(3.5)
4

floor()

向下进位

>> ceil(3.6)
3
>> ceil(3.1)
3

percentage()

转换为百分比类型

>> percentage(65 / 100)
65%
>> percentage(65px / 100px)
65%

注意:单位不相同会报错,例如 percentage(65px / 100)

min()

返回一组数据中的最小数据

max()

返回一组数据中的最大数据

to-upper-case

将字符串全部转换为大写

>> to-upper-case("hello")
"HELLO"

to-lower-case

将字符串全部转换为小写

>> to-lower-case("HELLO")
"hello"

str-length

返回字符串的长度

>> str-length("hello")
5                                                                                             "hello"

str-index

查找字符串的位置(从 1 开始)

第二个参数是被查的的字符串,第二个参数是需要查找的字符串

>> str-index("hello", e)
2

str-insert

在字符串指定位置插入新字符

第一个参数是被插入的字符串
第二个参数是需要插入的字符串
第三个参数是插入的位置

>> str-insert("hello", "word", 6)
"helloword"

列表函数

length

返回一个列表数据的长度(项目数)

>> length(5px 10px)
2

nth

获取列表里面的项

第一个参数是列表,第二个参数是下标(Sass 里面的下标第一个是 [1])

>> nth(10px 5px, 1)
10px
>> nth(10px 5px, 2)
5px

index

获取列表里面项目的下标

第一个参数是一个列表,第二个参数是想要查找的项目
第三个参数可以指定返回的列表的项目分割符(可选)

  • space(空格)
  • comma(逗号)
  • auto(自动)
>> index(1px solid red, solid)
2

append

向列表中添加新的项目

第一个参数是需要插入新项目的列表,第二个参数是插入的新项目

>> append(5px 10px, 5px)
(5px 10px 5px)

join

将两个列表合并成一个列表

第三个参数可以指定返回的列表的项目分割符(可选)

  • space(空格)
  • comma(逗号)
  • auto(自动)
>> join(5px 10px, 5px 0)
(5px 10px 5px 0)
>> join(5px 10px, 5px 0, comma)
(5px,10px,5px,0)

map 函数

map-get

可以通过 key 获取 value

第一个参数是需要查找的 map 数据, 第二个参数是项目名 key

>> $colors:(light: #ffffff, dark: #000000)
>> map-get($colors, dark)
#000000

map-keys

获取所有项目的 Key,并返回一个列表

>> $colors:(light: #ffffff, dark: #000000)
>> map-keys($colors)
("light", "dark")

map-values

获取所有项目的 value,并返回一个列表

>> $colors:(light: #ffffff, dark: #000000)
>> map-values($colors)
(#ffffff, #000000)

map-haskey

判断 map 数据里是否有指定的 key

第一个参数是需要判断的 map 数据,第二个参数是 key

>> $colors:(light: #ffffff, dark: #000000)
>> map-haskey($colors, light)
true
>> map-haskey($colors, gray)
false

map-merge

把两个 map 数据合并

>> $colors:(light: #ffffff, dark: #000000)
>> map-merge($colors, (light-gray: #e5e5e5))
(light: #ffffff, dark: #000000, light-gray: #e5e5e5)

map-remove

移除 map 数据中的项目

第一个参数是需要移除的 map 数据, 第二个参数是 map 中项目的 key

>> $colors:(light: #ffffff, dark: #000000)
>> map-remove($colors, light)
(dark: #000000)

数据类型

列表(list)

例:

border: 1px solid #000;

font-family: Courier, “Lucida Console”, monospace;

padding: 5px 10px, 5px 0;

map

名值对的一个列表

能用在列表上的函数同样适用 map 类型的数据类型

$map: (key1: value1, key2: value2, key3: value3)

interpolation

可以把一个值插入到另一个值里面

image.png

控制指令

@if

语法:

@if 条件 {
  ...
}

image.png

@for

语法:

@for $var form <开始值> through <结束值> {
 ... 
}

@for $var form <开始值> to <结束值> {
 ... 
}

示例:

through 比 to 多循环一次,to 不包含最后一次循环
image.png
image.png

@each

循环遍历一个列表(list)

语法:

@each $var in $list {
 ... 
}

示例:

image.png

@while

语法:

@while 条件 {
 ... 
}

image.png

@warn

显示的错误信息会在命令行中显示

image.png

@error

image.png

function

语法:

@function 名称 (参数1, 参数2) {
 ... 
}

image.png