sass 常见功能基本用法

244 阅读3分钟

sass

开头先引用一下官网对sass的说明;Sass 是一款强化 CSS 的辅助工具,它在 CSS 语法的基础上增加了变量 (variables)、嵌套 (nested rules)、混合 (mixins)、导入 (inline imports) 等高级功能,这些拓展令 CSS 更加强大与优雅。使用 Sass 以及 Sass 的样式库(如 Compass)有助于更好地组织管理样式文件,以及更高效地开发项目。

1. 特色功能 (Features)

  • 完全兼容 CSS3
  • 在 CSS 基础上增加变量、嵌套 (nesting)、混合 (mixins) 等功能
  • 通过函数进行颜色值与属性值的运算
  • 提供控制指令 (control directives)等高级功能
  • 自定义输出格式

2. 语法格式 (Syntax)

Sass 有两种语法格式。首先是 SCSS (Sassy CSS) —— 也是本文示例所使用的格式 —— 这种格式仅在 CSS3 语法的基础上进行拓展,所有 CSS3 语法在 SCSS 中都是通用的,同时加入 Sass 的特色功能。此外,SCSS 也支持大多数 CSS hacks 写法以及浏览器前缀写法 (vendor-specific syntax),以及早期的 IE 滤镜写法。这种格式以 .scss 作为拓展名。

变量$ (Variables: $)

SassScript 最普遍的用法就是变量,变量以美元符号开头,赋值方法与 CSS 属性的写法一样:

$width: 5em

直接使用即调用变量:

#main {
  width: $width;
}

变量支持块级作用域,嵌套规则内定义的变量只能在嵌套规则内使用(局部变量),不在嵌套规则内定义的变量则可在任何地方使用(全局变量)。将局部变量转换为全局变量可以添加 !global 声明:

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

#sidebar {
  width: $width;
}

编译为

#main {
  width: 5em;
}

#sidebar {
  width: 5em;
}

插值语句 #{} (Interpolation: #{})

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

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

编译为

p.foo {
  border-color: blue; 
}

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

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

编译为

p {
  font: 12px/30px; 
}

占位符%foo (Placeholder Selectors: %foo)

Sass 额外提供了一种特殊类型的选择器:占位符选择器 (placeholder selector)。与常用的 id 与 class 选择器写法相似,只是 # 或 . 替换成了 %。必须通过 @extend 指令调用,更多介绍请查阅 @extend-Only Selectors

%border{
  width: 150px;
  height: 80px;
  border: 1px solid $color;
}

.content{
  p{
    @extend %border;
  }
}

编译为:

.content p {
  width: 150px;
  height: 80px;
  border: 1px solid aqua;
}

使用%声明占位符,@extend 来应用占位符

占位符的功能非常强大,如果只声明了占位符,没有引用,编辑完成时,则不会生成代码

讲完占位符之后,介绍一个用法和它类似的

继承

.box{
  width: 300px;
  height: 100px;
  border: 1px solid #f00;
}

.content2{
  p{
    @extend .box;
  }
}

编译为:

.box, .content2 p {
  width: 300px;
  height: 100px;
  border: 1px solid #f00;
}

注意

可以看出占位符和继承中都运用了@extend

区别是占位符不会生成有效代码,而继承一个父类时,父类是有效的代码

混合指令 (Mixin Directives)

混合指令(Mixin)用于定义可重复使用的样式,避免了使用无语意的 class,比如 .float-left。混合指令可以包含所有的 CSS 规则,绝大部分 Sass 规则,甚至通过参数功能引入变量,输出多样化的样式。

定义混合指令 @mixin (Defining a Mixin: @mixin)
@mixin large-text {
  font: {
    family: Arial;
    size: 20px;
    weight: bold;
  }
  width: 300px;
  height: 300px;
  border: 1px solid chartreuse;
  color: #ff0000;
}
引用混合样式 @include (Including a Mixin: @include)
.cotent4{
  @include large-text;
}

编译为:

.cotent4 {
  font-family: Arial;
  font-size: 20px;
  font-weight: bold;
  width: 300px;
  height: 300px;
  border: 1px solid chartreuse;
  color: #ff0000;
}

控制指令

1 流程指令 @if

当 @if 的表达式返回值不是 false 或者 null 时,条件成立,输出 {} 内的代码:

p {
  @if 1 + 1 == 2 { border: 1px solid; }
  @if 5 < 3 { border: 2px dotted; }
  @if null  { border: 3px double; }
}

编译为

p {
  border: 1px solid; 
}

@if 声明后面可以跟多个 @else if 声明,或者一个 @else 声明。如果 @if 声明失败,Sass 将逐条执行 @else if 声明,如果全部失败,最后执行 @else 声明,例如:

$type: monster;
p {
  @if $type == ocean {
    color: blue;
  } @else if $type == matador {
    color: red;
  } @else if $type == monster {
    color: green;
  } @else {
    color: black;
  }
}

编译为

p {
  color: green; 
}

2 循环指令 @for 这个指令包含两种格式:@for $var from <start> through <end>,或者 @for $var from <start> to <end>

二者区别:

  • through: 包括结尾 (例如 1 through 3, 得到 1, 2, 3)
  • to: 不包括结尾 (例如 4 to 6,得到 4,5)

through

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

编译为

.item-1 {
  width: 2em; 
}
.item-2 {
  width: 4em; 
}
.item-3 {
  width: 6em; 
}

to

@for $i from 4 to 6 {
  .item-#{$i} { width: 2em * $i; }
}

编译为:

.item-4 {
  width: 8em;
}
.item-5 {
  width: 10em;
}

3 循环指令 @each

$list: puma, sea-slug, egret, salamander;
@each $animal in  $list{
  .#{$animal}-icon {
    background-image: url('/images/#{$animal}.png');
  }
}

编译为:

.puma-icon {
  background-image: url("/images/puma.png");
}

.sea-slug-icon {
  background-image: url("/images/sea-slug.png");
}

.egret-icon {
  background-image: url("/images/egret.png");
}

.salamander-icon {
  background-image: url("/images/salamander.png");
}

4 循环指令 @while

@while 指令重复输出格式直到表达式返回结果为 false。这样可以实现比 @for 更复杂的循环,只是很少会用到。例如:

$i: 6;
@while $i > 0 {
  .item-#{$i} {
    width: 100px * $i;
  }
  $i: $i - 2;
}

编译为:

.item-6 {
  width: 600px;
}

.item-4 {
  width: 400px;
}

.item-2 {
  width: 200px;
}

5 函数指令 (Function Directives)

Sass 支持自定义函数,并能在任何属性值或 Sass script 中使用:

$width: 40px;
@function computeWidth($n: 5){
  @return $n * $width
}
.box2 {
  width: computeWidth();
}
// 或者
.box2 {
  width: computeWidth($n: 6);
}

编译为:

.box2 {
  width: 200px;
}