参考资料:

sass 有两种后缀名文件:一种后缀名为 sass,不使用大括号和分号;另一种就是我们这里使用的 scss 文件,这种和我们平时写的 css 文件格式差不多,使用大括号和分号。

关于 sass 的编译,采用 gulp + gulp-sass + browser-sync 的组合,详见 Gulp 常用插件 一文中「热重载」一节。

基本用法

变量

SASS 允许使用变量,所有的变量以 $ 开头,用过 PHP 的同学会很熟悉。

值得注意的是,SASS 中的变量通常都不需要加引号,如果加了引号,则生成的 CSS 也带引号,如果没有引号,则生成的 CSS 也没有引号。

$borderRadius: 30px;

div.main {
  height: 100px;
  width: 100px;
  background-color: black;
  border-radius: $borderRadius;
}

如果变量需要镶嵌在字符串之中,就需要写在 #{} 之中。

$side: left;
$borderRadius: 30px;

div.main {
  height: 100px;
  width: 100px;
  background-color: black;
  border-top-#{$side}-radius: $borderRadius;
}

除了普通变量外,SASS 还支持 list 类型和 map 类型,list 类型有点像 JavaScript 中的数组,而 map 类型有点像 JavaScript 中的对象。

list 类型可通过空格,逗号,或者小括号分隔多个值,可用 nth($var, $index) 取值。其他函数请参考 sass Functions(搜索 list functions)

map 类型以 key-value 键值对出现,其中 value 又可以是 list 类型。格式为 $map: (key1: value1, key2: value2),可通过 map-get($map, $key) 取值。其他函数请参考 sass Functions(搜索 map functions)

计算功能

SASS 允许在代码中使用算式。

$base: 30px;

div.main {
  height: 100px;
  width: 100px;
  background-color: black;
  border-top-left-radius: 10px + 20px;
  border-top-right-radius: $base * 2;
  border-bottom-left-radius: (100px / 2);
  border-bottom-right-radius: 50px - 40px;
}

注意运算时单位(比如 px)要紧跟着数字,不能 (10+20)px,会被解析成 30 px(数字和单位中间会有个空格)

嵌套

SASS 允许选择器嵌套。比如下面的 CSS 代码:

div.main h1 {
  color: red;
}

可以写成:

div.main {
  h1 {
    color: red;
  }
}

属性也可以嵌套:

div.main {
  height: 100px;
  width: 100px;
  // background-color: red;
  // 等价于下面的代码
  background: {
    color: red;
  }
}

和选择器嵌套不同的是,这里要注意 background 后必须加上冒号

在嵌套的代码块内,可以使用 & 引用父元素,在写伪类的时候比较常用:

a {
  color: red;
  &:hover {
    color: black;
  }
}

.post {
  font-size: 1em;
  &-head {
    font-size: 1.8em;
  }
}

注释

SASS 共有两种注释风格。

标准的 CSS 注释 /* comment */ ,会保留到编译后的文件。

单行注释 // comment,只保留在 SASS 源文件中,编译后被省略。

在 /* 后面加一个感叹号,表示这是 "重要注释"。即使是压缩模式编译,也会保留这行注释,通常可以用于声明版权信息。

/*!
 重要注释!
*/

@at-root

Sass3.3.0 中新增的功能,用来跳出选择器嵌套的。默认所有的嵌套,继承所有上级选择器,但有了这个就可以跳出所有上级选择器。

// sass style
.content {
  @at-root #{&}-header {
    color: red;
  }
  @at-root #{&}-content {
    color: blue;
  }
}

// css style
.content-header {
  color: red;
}
.content-content {
  color: blue;
}

代码复用

继承

SASS 允许一个选择器,继承另一个选择器。

div.first {
  height: 100px;
  width: 100px;
  background-color: green;
}

div.second {
  @extend div.first;
  border: {
    color: red;
    width: 10px;
    style: solid;
  }
}

也就是说,某个选择器可以继承另一个选择器的所有样式,并在它的基础上添加样式。

占位选择器 %

这里我们得强势插入占位选择器 %,配合 @entend 风味更佳。从 Sass 3.2.0 以后就可以定义占位选择器 %。这种选择器的优势在于:如果不调用则不会有任何多余的 css 文件,避免了以前在一些基础的文件中预定义了很多基础的样式,然后实际应用中不管是否使用了 @extend 去继承相应的样式,都会解析出来所有的样式。占位选择器以 % 标识定义,通过 @extend 调用。

比如这段代码:

.base {
  height: 100px;
  width: 100px;
  background-color: green;
}

div.second {
  @extend .base;
  border: {
    color: red;
    width: 10px;
    style: solid;
  }
}

编译的结果是:

.base, div.second {
  height: 100px;
  width: 100px;
  background-color: green;
}

div.second {
  border-color: red;
  border-width: 10px;
  border-style: solid;
 }

但是 .base 这个类实际并没有用到,我们不希望它在样式表中,可以用占位选择器:

%base {
  height: 100px;
  width: 100px;
  background-color: green;
}

div.second {
  @extend %base;
  border: {
    color: red;
    width: 10px;
    style: solid;
  }
}

这时我们再看生成的样式表:

div.second {
  height: 100px;
  width: 100px;
  background-color: green;
}

div.second {
  border-color: red;
  border-width: 10px;
  border-style: solid;
}

Mixin

还是上面的例子,有两个 div,它们有一些基础样式,但是又不能用继承关系,这时就可以用 Mixin 定义可以复用的代码块。

使用 @mixin 命令,定义一个代码块。

@mixin divBase {
  width: 100px;
  height: 100px;
}

使用 @include 命令,调用这个 mixin。

div.first {
  @include divBase;
  background-color: green;
}

div.second {
  @include divBase;
  background-color: red;
}

其实这个例子举的不好,用 @extend 也能实现,但是mixin 的强大之处,在于可以指定参数和缺省值。

@mixin divBase($width: 100px, $height: 100px) {
  width: $width;
  height: $height;
}

div.first {
  @include divBase;
  background-color: green;
}

div.second {
  @include divBase(20px, 50px);
  background-color: red;
}

颜色函数

SASS 提供了一些内置的颜色函数,以便生成系列颜色。

lighten(#cc3, 10%) // #d6d65c
darken(#cc3, 10%) // #a3a329
grayscale(#cc3) // #808080
complement(#cc3) // #33c

插入文件

@import 命令,用来插入外部文件(.scss 和 .css 的后缀可以省略)。

@import 'b.scss';
@import 'c.css';

高级用法

条件语句

@if 以及 @else 以及 @else if 命令:

div.second {
  width: 100px;
  height: 100px;
  @if (1 + 1 != 2) {
    background-color: red;
  } @else {
    background: {
      color: black;
    }
  }
}

注意 SASS 中只有 ==!= 没有 ===

循环语句

循环语句我觉得是 SASS 中最好用的功能,让我觉得 SASS 真的是一种 "编程语言"。

比如有一张雪碧图,如果仅仅用 CSS,我们可能会写出如下 "又臭又长" 的代码:

div.bg_1 {
  float: left;
  width: 50px;
  height: 50px;
  background-image: url(bg.jpg);
  background-position: 0 0;
}

div.bg_2 {
  float: left;
  width: 50px;
  height: 50px;
  background-image: url(bg.jpg);
  background-position: -50px 0;
}

div.bg_3 {
  float: left;
  width: 50px;
  height: 50px;
  background-image: url(bg.jpg);
  background-position: -100px 0;
}

我们先用 SASS 的 Mixin 复用一些代码(用 @extend 也可以):

@mixin divBase {
  float: left;
  width: 50px;
  height: 50px;
  background-image: url(bg.jpg);
}

div.bg_1 {
  @include divBase;
  background-position: 0 0;
}

div.bg_2 {
  @include divBase;
  background-position: -50px 0;
}

div.bg_3 {
  @include divBase;
  background-position: -100px 0;
}

接着我们就来用循环语句进一步精简代码。

SASS 支持 for 循环:

@mixin divBase {
  float: left;
  width: 50px;
  height: 50px;
  background-image: url(bg.jpg);
}

@for $i from 1 to 4 {  // [1, 4)
  div.bg_#{$i} {
    @include divBase;
    background-position: -50px * ($i - 1) 0;
  }
}

我们注意下上面的循环次数,是 [1, 4),如果想要 [1, 4],则要用 through 关键字:

@for $i from 1 through 4 {  // [1, 4]
  div.bg_#{$i} {
    @include divBase;
    background-position: -50px * ($i - 1) 0;
  }
}

支持 while 循环:

@mixin divBase {
  float: left;
  width: 50px;
  height: 50px;
  background-image: url(bg.jpg);
}

$i: 1;

@while $i < 4 {
  div.bg_#{$i} {
    @include divBase;
    background-position: -50px * ($i - 1) 0;
  }
  $i: $i + 1;
}

我们还可以用 each,语法为 @each $var in <list or map>

@each $i in (1, 2, 3) {
  div.bg_#{$i} {
    @include divBase;
    background-position: -50px * ($i - 1) 0;
  }
}

我们可以把 (1, 2, 3) 抽象为一个变量,有点 JavaScript 中数组的意思,这样更灵活,这样数字不一定是等比数列,适用范围就更广了。我喜欢 each!

$num: (1, 2, 3);

@each $i in $num {
  div.bg_#{$i} {
    @include divBase;
    background-position: -50px * ($i - 1) 0;
  }
}

自定义函数

@function double($n) {
  @return $n * 2;
}

div.second {
  width: 100px;
  height: double(100px);
  background-color: red;
}

SASS 入门笔记的更多相关文章

  1. 每天成长一点---WEB前端学习入门笔记

    WEB前端学习入门笔记 从今天开始,本人就要学习WEB前端了. 经过老师的建议,说到他每天都会记录下来新的知识点,每天都是在围绕着这些问题来度过,很有必要每天抽出半个小时来写一个知识总结,及时对一天工 ...

  2. Ruby小白入门笔记之 <Gemfile 文件>

    因为初学Ruby,四处查资料无果,才来的贴出亲自试过的操作,覆盖整个个人入门笔记博客中,故所有的操作,都以最明了的方式阐述,当你创建完一个新的Rails应用后,你发现JAVA中我们可以编写maven聚 ...

  3. ES6入门笔记

    ES6入门笔记 02 Let&Const.md 增加了块级作用域. 常量 避免了变量提升 03 变量的解构赋值.md var [a, b, c] = [1, 2, 3]; var [[a,d] ...

  4. [Java入门笔记] 面向对象编程基础(二):方法详解

    什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能上来看,方法都有点类似与函数.但是,方法与传统的函数还是有着不同之处: 在 ...

  5. React.js入门笔记

    # React.js入门笔记 核心提示 这是本人学习react.js的第一篇入门笔记,估计也会是该系列涵盖内容最多的笔记,主要内容来自英文官方文档的快速上手部分和阮一峰博客教程.当然,还有我自己尝试的 ...

  6. redis入门笔记(2)

    redis入门笔记(2) 上篇文章介绍了redis的基本情况和支持的数据类型,本篇文章将介绍redis持久化.主从复制.简单的事务支持及发布订阅功能. 持久化 •redis是一个支持持久化的内存数据库 ...

  7. redis入门笔记(1)

    redis入门笔记(1) 1. Redis 简介 •Redis是一款开源的.高性能的键-值存储(key-value store).它常被称作是一款数据结构服务器(data structure serv ...

  8. OpenGLES入门笔记四

    原文参考地址:http://www.cnblogs.com/zilongshanren/archive/2011/08/08/2131019.html 一.编译Vertex Shaders和Fragm ...

  9. OpenGLES入门笔记三

    在入门笔记一中比较详细的介绍了顶点着色器和片面着色器. 在入门笔记二中讲解了简单的创建OpenGL场景流程的实现,但是如果在场景中渲染任何一种几何图形,还是需要入门笔记一中的知识:Vertex Sha ...

随机推荐

  1. 通过pycharm使用git[图文详解]

    前言 使用git+pycharm有一段时间了,算是稍有点心得,这边整理一下,可能有的方法不是最优,欢迎交流,可能还是习惯敲命令去使用git,不过其实pycharm已经帮忙做了很多了,我们可以不用记住那 ...

  2. Linux用户体系和文件权限总结

    一.           Linux系统用户和用户组相关文件 1.  /etc/passwd文件 这个passwd文件是Linux用户信息文件.文件格式说明如下: root:x:0:0:root:/r ...

  3. Hive安装部署

    目录 一.        安装Hive. 1 1.       选择CDH版本的... 1 2.       解压文件... 1 二.        配置Hive. 1 1.       配置环境变量 ...

  4. Redis命令拾遗三(列表List类型)

    本文版权归博客园和作者吴双本人共同所有.转载和爬虫请注明原文地址 Redis五种数据类型之列表类型 Redis五种数据类型之列表类型.你可以存储一个有序的字符串列表一类数据.比如你想展示你所存储的所有 ...

  5. WPF binding 参考

    Introduction This is an article on WPF Binding Cheat Sheet. Some of the Binding won't work for Silve ...

  6. C#开发微信门户及应用(27)-公众号模板消息管理

    通过模板消息接口,公众号能向关注其账号的用户发送预设模板的消息.模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等.不支持广告等营销类消 ...

  7. IO模型

    前言 说到IO模型,都会牵扯到同步.异步.阻塞.非阻塞这几个词.从词的表面上看,很多人都觉得很容易理解.但是细细一想,却总会发现有点摸不着头脑.自己也曾被这几个词弄的迷迷糊糊的,每次看相关资料弄明白了 ...

  8. jdk安装

    x86 和 x64的安装判别 [root@CentOS ~]# uname -aLinux CentOS 2.6.32-358.el6.i686 #1 SMP Thu Feb 21 21:50:49 ...

  9. Console.In.ReadToEnd() 控制台 输入完毕

    输入完数据后 按回车(另起一行) ctrl+z enter .......百度了半天 没百度到..最后还是google 强大..解决了问题 ..

  10. 利用CSS背景颜色属性使父级div背景透明同时避免子级标签透明。

    实现背景色透明效果的代码 实现各个浏览器中具备良好的透明特性的效果,IE中使用私有滤镜filter,高端浏览器使用CSS3中的rgba属性. 输入十六进制的颜色值以及透明度,自动在IE的过渡滤镜以及C ...