Image placeholder

15分钟学会SASS

Image placeholder
F2EX 2017-08-16

如果你需要编写大量的 CSS ,预处理器可以大大降低你的重复工作,并节省大量宝贵的时间。使用诸如 Sass,Less,Stylus 或 PostCSS 之类的工具,使得大而复杂的样式表更加清晰易懂,易于维护。因为具有变量,函数和混合等功能,代码变得更加有条理,使开发人员能够更快地开发,并减少错误。

下面我们来学习 SASS ,并展示它的一些主要功能。

入门

Sass 文件不能被浏览器直接解析,所以在生产环境下,需要编译成标准的 CSS 。这就是为什么你需要一个工具来帮助你将 .scss 文件转换成 .css 。 这里有几个选择:

  • 最简单的解决方案是一个用于实时编写和编译 Sass 的浏览器工具 – SassMeister
  • 使用第三方桌面应用程序。免费和付费版本都可用。你可以 在这里 了解更多信息。
  • 如果你是像我们这样的 CLI 人员,可以在计算机上安装 Sass 并手动编译文件。

如果你决定使用命令行,你可以以原始形式(使用 ruby)安装 Sass,也可以尝试使用 Node.js 。当然还有很多其他的选择,这取决于你自己。

以下是使用 CLI 编译 .scss 文件的方法:

node-sass input.scss output.css

此外, Sass 提供两种不同的语法 – SASS 和 SCSS 。它们做同样的事情,只是用不同的方式编写。 SCSS 是较新的,通常被认为更好,所以我们这里使用 SCSS 。

变量

Sass 中的变量和其他编程语言类似,包括数据类型和作用域等。当定义一个变量时,我们在其中存储一个特定的值,这通常是 CSS 中经常重现的东西,就像一个颜色,一个字体样式或者一个整体规格的盒子阴影。

下面你可以看到一个简单的例子。

SCSS

$title-font: normal 24px/1.5 'Open Sans', sans-serif;
$cool-red: #F44336;
$box-shadow-bottom-only: 0 2px 1px 0 rgba(0, 0, 0, 0.2);

h1.title {
  font: $title-font;
  color: $cool-red;
}

div.container {
  color: $cool-red;
  background: #fff;
  width: 100%;
  box-shadow: $box-shadow-bottom-only;
}

编译后的 CSS

h1.title {
  font: normal 24px/1.5 "Open Sans", sans-serif;
  color: #F44336; 
}

div.container {
  color: #F44336;
  background: #fff;
  width: 100%;
  box-shadow: 0 2px 1px 0 rgba(0, 0, 0, 0.2);
}

如果我们希望以后可以更快地重用相同的值,或者如果需要更改,那么就可以在一个地方(变量的定义)提供新的值,而不是在很多地方手动更改该属性。

混合

你可以将混合视为编程语言中构造函数类的简化版本 – 你可以获取一组 CSS 声明,并重新使用它,无论你想要输出什么,并且可以组合一组特定的样式。

混合甚至可以接受带有设置默认值的选项的参数。在下面的例子中,我们定义一个正方形 mixin ,然后使用它来创建不同大小和颜色的正方形。

SCSS

@mixin square($size, $color) {
  width: $size;
  height: $size;
  background-color: $color;
}

.small-blue-square {
  @include square(20px, rgb(0,0,255));
}

.big-red-square {
  @include square(300px, rgb(255,0,0));
}

编译后的 CSS

.small-blue-square {
  width: 20px;
  height: 20px;
  background-color: blue; 
}

.big-red-square {
  width: 300px;
  height: 300px;
  background-color: red;
}

使用 mixin 的另一种有效方法是当一个属性需要前缀在所有浏览器中运行时。

SCSS

@mixin transform-tilt() {
  $tilt: rotate(15deg);

  -webkit-transform: $tilt; /* Ch <36, Saf 5.1+, iOS, An =<4.4.4 */
      -ms-transform: $tilt; /* IE 9 */
          transform: $tilt; /* IE 10, Fx 16+, Op 12.1+ */
}

.frame:hover { 
  @include transform-tilt; 
}

编译后的 CSS

.frame:hover {
  -webkit-transform: rotate(15deg);  /* Ch <36, Saf 5.1+, iOS, An =<4.4.4 */
  -ms-transform: rotate(15deg);  /* IE 9 */
  transform: rotate(15deg);  /* IE 10, Fx 16+, Op 12.1+ */ 
}

继承

我们将看到的下一个功能是 @extend ,它允许你将一个选择器的 CSS 属性继承到另一个。这与混合系统类似,但是当我们要在页面上的元素之间创建一个逻辑连接时,它们是首选的。

SCSS

.dialog-button {
  box-sizing: border-box;
  color: #ffffff;
  box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.12);
  padding: 12px 40px;
  cursor: pointer;
}

.confirm {
  @extend .dialog-button;
  background-color: #87bae1;
  float: left;
}

.cancel {
  @extend .dialog-button;
  background-color: #e4749e;
  float: right;
}

编译后的 CSS

.dialog-button, .confirm, .cancel {
  box-sizing: border-box;
  color: #ffffff;
  box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.12);
  padding: 12px 40px;
  cursor: pointer; 
}

.confirm {
  background-color: #87bae1;
  float: left; 
}

.cancel {
  background-color: #e4749e;
  float: right; 
}

从上面的 CSS 可以看出,Sass 组合了选择器,而不是一遍又一遍地重复相同的声明,从而节省了宝贵的内存。

嵌套

HTML 遵循严格的嵌套结构,而在 CSS 中通常是完全混乱的。使用 Sass 嵌套,你可以更加紧密地组织样式表,从而减少 CSS 冲突的机会。

为了加快开发速度,我们可以设计一个包含多个链接的列表:

SCSS

ul {
  list-style: none;

  li {
    padding: 15px;
    display: inline-block;

    a {
      text-decoration: none;
      font-size: 16px;
      color: #444;
    }

  }

}

编译后的 CSS

ul {
  list-style: none; 
}

ul li {
  padding: 15px;
  display: inline-block; 
}

ul li a {
  text-decoration: none;
  font-size: 16px;
  color: #444; 
}

非常整齐并且能够有效避免冲突。

运算符

使用 Sass,你可以在样式表中进行基本的数学运算,它与应用程序中的算术符号一样简单。

SCSS

$width: 800px;

.container { 
  width: $width;
}

.column-half {
  width: $width / 2;
}

.column-fifth {
  width: $width / 5;
}

编译后的 CSS

.container {
  width: 800px; 
}

.column-half {
  width: 400px; 
}

.column-fifth {
  width: 160px; 
}

虽然 vanilla CSS 现在也以 calc() 的形式提供了这个特性,但 Sass 替代方法可以更快书写,具有 % 运算符,并且可以应用于更广泛的数据类型(例如颜色和字符串)。

函数

Sass 提供了一系列内置函数。它们提供各种用途,包括字符串操作,颜色相关操作,以及一些方便的数学方法,如 random()round()

SCSS

$awesome-blue: #2196F3;

a {
  padding: 10px 15px;
  background-color: $awesome-blue;
}

a:hover {
  background-color: darken($awesome-blue,10%);
}

编译后的 CSS

a {
  padding: 10px 15px;
  background-color: #2196F3; 
}

a:hover {
  background-color: #0c7cd5; 
}

除了庞大的可用函数列表外,还可以自定义选项。 Sass 也支持流量控制,所以如果你想,你可以创建相当复杂的行为。


2017-09-02