sass 实战

117 阅读1分钟

Sass(Scss)是世界上最成熟、稳定和强大的专业级CSS扩展语言。 Sass 扩展了 CSS3,增加了规则、变量、混入、选择器、继承等等特性。Sass 生成良好格式化的 CSS 代码,易于组织和维护。在前端开发中使用频繁。

定义 CSS 预处理器

“CSS 预处理器是一个程序,可让您从预处理器自己的独特语法生成 CSS。有很多 CSS 预处理器可供选择,但是大多数 CSS 预处理器会添加一些纯 CSS 中不存在的功能,例如 mixin、嵌套选择器、继承选择器等。这些特性使 CSS 结构更具可读性和更易于维护”。

一旦你熟悉了 CSS,下一个自然的步骤就是使用预处理器。最大的优点是不必重复自己。

这个优势被称为保持你的 CSS Dry,它代表“不要重复你自己”

基本知识点

& 父选择器

如果多级嵌套,&指向最近的一个

例如:

a{
 font-weight: bold;
 &:hover{
  text-decoration: none;
  }
}

编译为

a{
 font-weight: bold;
}
a:hover{
text-decoration: none;
}

属性嵌套

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

编译为

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

插值语句 #{} 可以写进多行注释中输出变量值

$version: "1.2.3";
/* This CSS is generated by My Snazzy Framework version #{$version}. */

编译为

/* This CSS is generated by My Snazzy Framework version 1.2.3. */

变量

以$开头

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

变量支持块级作用域,分局部变量和全局变量,

局部转全局 加:!global

数据类型

  • 数字,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)

除法

``/在 CSS 中通常起到分隔数字的用途,SassScript 作为 CSS 语言的拓展当然也支持这个功能,同时也赋予了/除法运算的功能。也就是说,如果/` 在 SassScript 中把两个数字分隔,编译后的 CSS 文件中也是同样的作用。

以下三种情况 / 将被视为除法运算符号:

  • 如果值,或值的一部分,是变量或者函数的返回值
  • 如果值被圆括号包裹
  • 如果值是算数表达式的一部分
p {
  font: 10px/8px;             // Plain CSS, no division
  $width: 1000px;
  width: $width/2;            // Uses a variable, does division
  width: round(1.5)/2;        // Uses a function, does division
  height: (500px/2);          // Uses parentheses, does division
  margin-left: 5px + 8px/2px; // Uses +, does division
}

编译为

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:before {
  cursor: e + -resize;
  content: "Foo " + Bar;
  content: "I ate #{5 + 10} pies!";
  font-family: sans- + "serif";
  margin: 3px + 4px auto;
}

编译为

p:before {
  cursor: e-resize;
  content: "Foo Bar";
  content: "I ate 15 pies!"; 
  font-family: sans-serif; 
  margin: 7px auto; 
}

导入外部文件

@import

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

.example {
  color: red;
}

然后导入到 #main 样式内

#main {
  @import "example";
}

将会被编译为

#main .example {
  color: red;
}

@media

允许在css中嵌套使用

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

编译为

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

@extend

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

也同样会使用 hacked.png 背景。

控制指令

@if

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

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

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

@for

@for 指令可以在限制的范围内重复输出格式,每次按要求(变量的值)对输出结果做出变动。这个指令包含两种格式:@for $var from start through end,或者 @for $var from start to end,区别在于 throughto 的含义:当使用 through 时,条件范围包含 startend 的值,而使用 to 时条件范围只包含 start 的值不包含 end 的值。另外,$var 可以是任何变量,比如 $i 必须是整数值

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

编译为

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