SASS用了很久但是有些特性没注意, 完整过一遍SASS语法, 作此小结.

通常使用的文件后缀为 scss, 即有大括号的样子; 还可以省略大括号使用 sass 后缀.

文件命名和导入

文件组织结构

.
|-- init.css         # 普通 css 文件
|-- main.scss        # 主scss, 用来import各个模块
|-- module_a         # 以模块或功能划分目录
|   `-- _a.scss      # 被引入的文件以下划线开头, 不会生成对应的css文件
`-- module_b
   `-- _b.scss

运行监控, 监控该目录, 输出 style.css .

sass --watch .:style.css
@import "init.css";             # 按照 CSS 本来的模式引入, 不能省略文件扩展名, init.css 不合并进 style.css
@import "module_a/_a.scss";     # 被引入的文件. 该文件有修改, 自动更新 style.css
@import "module_b/b";           # 可以省略前导下划线或文件扩展名

注释

/**/ CSS 标准注释, 会输出到最终 CSS 中

// 该注释为 SASS 注释, 不会输出到最终 CSS 中

默认不支持中文注释, 务必在文件顶部使用 @charset "utf-8";

变量

变量需要先定义再使用;

SCSS 文件从头到尾顺序解析, 变量可以重复定义, 后定义的覆盖先定义的;

$var: 10px;
$var: 20px;

div {
  padding: $var;
}

/*
$ sass main.scss
div {
  padding: 20px; }
*/

新版SASS的变量有了作用域.

@charset "utf-8";
$var: 1px; //全局可用

.l1 {
  $var: 2px; // 仅在嵌套内可用
  $gv: 999px !global; // 对下文全局可用

  .l2 {
    margin: $var;
  }
}

.others {
  width: $gv;
}

/*
$ sass main.scss
.l1 .l2 {
  margin: 2px; }

.others {
  width: 999px; }
*/

可以使用 !default 关键字, 降低变量的优先级:

$var: 10px;
$var: 20px !default;

div {
  padding: $var;
}

/*
$ sass main.scss
div {
  padding: 10px; }
*/

如果重复定义 !default, 则后出现的 !default 优先级更高, 即使用前值:

$var: 10px !default;
$var: 20px !default;


div {
  padding: $var;
}

/*
$ sass main.scss
div {
  padding: 10px; }
*/

变量的值也可以插入到选择器中, 或用于其他文本插值的地方, 需要包裹 #{}

$var: light;

data-#{$var} {
  padding: 0;
}

/*
$ sass main.scss
data-light {
  padding: 0; }
*/

数组变量, 索引从1开始

$arr: 11px 13px 15px;

.smail {
  font-size: nth($arr, 1);
}

.middle {
  font-size: nth($arr, 2);
}

.big {
  font-size: nth($arr, 3);
}

/*
.smail {
  font-size: 11px; }

.middle {
  font-size: 13px; }

.big {
  font-size: 15px; }
*/

数组变量中包含元组, 使用 ,() 分隔

$arr_padding: 11px 13px, 21px 23px;
$arr_margin: (6px 8px) (7px 9px);

.thin {
  padding: nth($arr_padding, 1);
  margin: nth($arr_margin, 1);
}

.wide {
  padding: nth($arr_padding, 2);
  margin: nth($arr_margin, 2);
}

/*
$ sass main.scss
.thin {
  padding: 11px 13px;
  margin: 6px 8px; }

.wide {
  padding: 21px 23px;
  margin: 7px 9px; }

*/

hash变量, 注意特殊位置变量用 #{} 包裹

$map: (level1: #333, level2: #555, level3: #777);

@each $k, $v in $map {
  .class-#{$k} {
    color: $v;
  }
}

#l3 {
  color: map-get($map, 'level3');
}

/*
$ sass main.scss
.class-level1 {
  color: #333; }

.class-level2 {
  color: #555; }

.class-level3 {
  color: #777; }

#l3 {
  color: #777; }

*/

嵌套

除了选择器嵌套, SASS 还支持属性嵌套.

#topic {
  background-color: antiquewhite;
  h2 {
    font-size: large;
  }


  &:hover {
    background-color: darkgray;
  }

  border: {
    left: {
      width: 5px;
      color: red;
    }

    bottom: {
      left-radius: 10px;
    }
  }
}

/*
$ sass main.scss
#topic {
  background-color: antiquewhite;
  border-left-width: 5px;
  border-left-color: red;
  border-bottom-left-radius: 10px; }
  #topic h2 {
    font-size: large; }
  #topic:hover {
    background-color: darkgray; }

*/

混入

混入可以带参数, 甚至多个参数

@mixin width-control {
  width: 100%;
  max-width: 1000px;
}

@mixin img-control($img-width: 100px, $img-height: 100%) {
  width: 100%;
  max-width: $img-width;
  height: $img-height;
}

.page {
  @include width-control;

  background-color: red;

  img {
    @include img-control();
  }

  img.special1 {
    @include img-control(200px);
  }

  img.special2 {
    @include img-control($img-height: 200px);
  }
}

/*
$ sass main.scss
.page {
  width: 100%;
  max-width: 1000px;
  background-color: red; }
  .page img {
    width: 100%;
    max-width: 100px;
    height: 100%; }
  .page img.special1 {
    width: 100%;
    max-width: 200px;
    height: 100%; }
  .page img.special2 {
    width: 100%;
    max-width: 100px;
    height: 200px; }
*/

混入与模板

适用于: 往固定的媒体检查模板中注入样式.

@mixin max-screen($res){
  @media only screen and ( max-width: $res )
  {
    @content;
  }
}

@include max-screen(480px) {
  body { color: red }
}

/*
$ sass main.scss
@media only screen and (max-width: 480px) {
  body {
    color: red; } }
*/

继承

把继承目标的样式拷贝到当前位置

#target {
  color: red;
}

#current {
  @extend #target;
}

/*
$ sass main.scss
#target, #current {
  color: red; }
*/

占位

和继承操作类似, 但是并不需要继承目标输出

%target {
  color: red;
}

#current {
  @extend %target;
}

/*
$ sass main.scss
#current {
  color: red; }
*/

复杂逻辑

SASS 支持一些逻辑流程, 支持自定义方法, 支持条件判断和循环遍历.

$lte7: true;
$type: monster;
.ib{
    display:inline-block;
    @if $lte7 {
        *display:inline;
        *zoom:1;
    }
}
p {
  @if $type == ocean {
    color: blue;
  } @else if $type == matador {
    color: red;
  } @else if $type == monster {
    color: green;
  } @else {
    color: black;
  }
}


@for $i from 1 through 3 {
  .item-#{$i} { width: 2em * $i; }
}


@each $animal in $animal-list {
  .#{$animal}-icon {
    background-image: url('/images/#{$animal}.png');
  }
}

参考

http://sass-lang.com/guide

http://sass-lang.com/documentation/Sass/Script/Functions.html

https://www.w3cplus.com/sassguide/syntax.html