注释

  • CSS 中的注释 /* */ 在 Sass 中依旧可用,编译为 CSS 依然保留
  • Sass 也支持 // 单行注释,编译为 CSS 会被删除

如果是压缩输出模式,所有注释都会被删除。可以在多行注释的第一个字符书写一个 !,此时即便是在压缩模式,这条注释也会被保留,通常用于添加版权信息:

/*!
  该注释即使是在压缩模式,也会被保留,通常用于添加版权信息
*/
 
.test {
  width: 300px;
}

变量

这是当初 Sass 推出时一个极大的亮点,支持变量的声明,声明方式很简单,通过 $ 开头来进行声明,赋值方法和 CSS 属性的写法是一致的:

// 声明变量
$width: 1600px;
$pen-size: 3em;
 
div {
  width: $width;
  font-size: $pen-size;
}

变量声明支持块级作用域,如果是在一个嵌套规则内部定义的变量,就只能在嵌套规则内部使用(局部变量),如果不是在嵌套规则内定义的变量那就是全局变量:

// 全局变量
$width: 1600px;
 
div {
  // 局部变量
  $width: 800px;
  $color: red;
 
  p.one {
	// 变量查找:就近原则
    width: $width; /* 800px */
    color: $color; /* red */
  }
  
}
 
p.two {
  width: $width; /* 1600px */
  color: $color; /* 报错,因为 $color 是一个局部变量 */
}

可以通过 !global 将一个局部变量转换为全局变量:

div {
  // 局部变量转换为全局变量
  $color: red !global;
}

数据类型

CSS 预处理器就是将编程语言的特性融入到 CSS 中,自然会有数据类型。

在 Sass 中支持 7 种数据类型:

  • 数值类型
  • 字符串类型
  • 布尔类型
  • 空值
  • 数组(list)
  • 字典(map)
  • 颜色类型

数值类型

可以带单位,数字可以是正数、负数、浮点数,如 121310px

字符串类型

可以使用单引号、双引号或不使用引号,如 "foo"'bar'baz

布尔类型

该类型就两个值:truefalse,可以进行逻辑运算,支持 andornot 来做逻辑运算

$a: 1>0 and 0>5; // false
$b: "a" == a; // true
$c: false; // false
$d: not $c; // true

空值类型

就一个值:null,表示空,不能和其他类型进行算术运算

数组类型

可以通过空格来间隔,也可以通过逗号来间隔。

数组里可以包含子数组,如 1px 2px, 5px 6px 就是包含了两个数组,1px 2px 是一个数组,5px 6px 又是一个数组。如果内外数组的分隔方式相同,可以使用小括号来分隔,如 (1px 2px) (5px 6px)

添加了小括号的内容被编译为 CSS 时,会被去掉小括号,如 (1px 2px) (5px 6px) -> 1px 2px 5px 6px

$list0: 1px 2px 5px 6px;
$list1: 1px 2px, 5px 6px;
$list2: (1px 2px) (5px 6px);
 
div {
  padding: $list2; // 1px 2px 5px 6px
}

小括号如果为空,则表示是一个空数组,空数组不可以直接编译为 CSS:

$list3: ();
 
div {
  padding: $list3; // 报错
}

数组里包含空数组或 null,编译能够成功,空数组和 null 会被去除:

$list4: 1px 2px null 3px;
$list5: 1px 2px () 3px;
 
div {
  padding: $list4; // 1px 2px 3px
}
 
.div2 {
  padding: $list5; // 1px 2px 3px
}

可以使用 nth 函数去访问数组里面的值,注意数组的下标是从 1 开始的:

$font-sizes: 12px 14px 16px 18px 24px;
 
// 通过索引访问 List 中的值
$base-font-size: nth($font-sizes, 3); // 16px

数组可以用在循环中:

$sizes: 40px 50px 60px;
 
@each $s in $sizes {
  .icon-#{$s} {
    font-size: $s;
    width: $s;
    height: $s;
  }
}

字典类型

必须用小括号扩起来,小括号里面是一对一对的键值对,键值对用 , 分割:

$a: (
  $key1: value1,
  $key2: value2
)

可以通过 map-get 函数获取字典值:

$colors: (
  "primary": #4caf50,
  "secondary": #ff9800,
  "accent": #2196f3,
);
 
$primary: map-get($colors, "primary"); // #4caf50

字典也可以用在循环中:

$icons: (
  "eye": "\f112",
  "start": "\f12e",
  "stop": "\f12f",
);
 
@each $k, $v in $icons {
  .icon-#{$k}:before {
    display: inline-block;
    font-family: "Open Sans";
    content: $v;
  }
}

颜色类型

支持原生 CSS 中各种颜色的表示方式:十六进制、RGB、RGBA、HSL、HSLA、颜色英语单词。

Sass 还提供了内置的 Colors 相关函数,可以方便对颜色进行调整和操作。

调整亮度

  • lighten:增加亮度
  • darken:减少亮度
$color: red;
 
.div1 {
  // 亮度增加 10%
  background-color: lighten($color, 10%); // #ff3333
}
 
.div2 {
  // 亮度减少 10%
  background-color: darken($color, 10%); // #cc0000
}

调整饱和度

  • saturate:增加饱和度
  • desaturate:减少饱和度
$color: #4caf50;
 
.div1 {
  background-color: saturate($color, 10%); // 饱和度增加 10%
}
 
.div2 {
  background-color: desaturate($color, 10%); // 饱和度减少 10%
}

调整色相

  • adjust-hue:调整色相
$color: #4caf50;
$new-hue: adjust-hue($color, 30); // 色相增加 30 度

添加透明度

  • rgba:为颜色添加透明度
$color: #4caf50;
$transparent: rgba($color, 0.5); // 添加 50% 透明度

混合颜色

  • mix:混合两种颜色
$color1: #4caf50;
$color2: #2196f3;
$mixed: mix($color1, $color2, 50%); // 混合两种颜色,权重 50%