Sass

这是一份快速参考备忘单,列出了 SASS 最有用的功能。

Sass 基础

介绍

Sass 是一种 CSS 的预编译语言

  1. $ npm install -g sass

在 Node.js 环境中使用 Sass

  1. $ sass source/index.scss build/index.css
  2. $ sass --watch input.scss output.css
  3. $ sass --watch app/sass:public/css

变量

  1. $defaultLinkColor: #46EAC2;
  2. a {
  3. color: $defaultLinkColor;
  4. }

字符串插值

  1. $wk: -webkit-;
  2. .rounded-box {
  3. #{$wk}border-radius: 4px;
  4. }

注释

  1. /*
  2. 这是多行注释
  3. 块注释
  4. 块注释
  5. */
  6. // 这是一条单行注释

Extend

  1. .button {
  2. ···
  3. }
  4. .push-button {
  5. @extend .button;
  6. }

嵌套(Nesting)

  1. nav {
  2. ul {
  3. padding: 0;
  4. list-style: none;
  5. }
  6. li { display: inline-block; }
  7. a {
  8. display: block;
  9. }
  10. }

编译 css 为:

  1. nav ul {
  2. padding: 0;
  3. list-style: none;
  4. }
  5. nav li {
  6. display: inline-block;
  7. }
  8. nav a {
  9. display: block;
  10. }

模块(片段)

  1. // _base.scss
  2. $font-stack: Helvetica, sans-serif;
  3. $primary-color: #333;

注意以下划线开头的 Sass 文件

  1. // styles.scss
  2. @use 'base';
  3. .inverse {
  4. background-color: base.$primary-color;
  5. color: white;
  6. }

编译 css 为:

  1. .inverse {
  2. background-color: #333;
  3. color: white;
  4. }

混合(Mixins)

  1. @mixin heading-font {
  2. font-family: sans-serif;
  3. font-weight: bold;
  4. }
  5. h1 {
  6. @include heading-font;
  7. }

查看: 混合(Mixins)

@import

  1. @import './other_sass_file';
  2. @import '/code', 'lists';
  3. // 纯 CSS @imports
  4. @import "theme.css";
  5. @import url(theme);

.sass.sass 扩展名是可选的。

Sass 混合(Mixins)

参数

  1. @mixin font-size($n) {
  2. font-size: $n * 1.2em;
  3. }

  1. body {
  2. @include font-size(2);
  3. }

默认值

  1. @mixin pad($n: 10px) {
  2. padding: $n;
  3. }

  1. body {
  2. @include pad(15px);
  3. }

默认变量

  1. $default-padding: 10px;
  2. @mixin pad($n: $default-padding) {
  3. padding: $n;
  4. }
  5. body {
  6. @include pad(15px);
  7. }

Sass 颜色函数

rgba

  1. rgb(100, 120, 140)
  2. rgba(100, 120, 140, .5)
  3. rgba($color, .5)

Mixing

  1. mix($a, $b, 10%) // 10% a, 90% b

修改 HSLA

  1. darken($color, 5%)
  2. lighten($color, 5%)
  1. saturate($color, 5%)
  2. desaturate($color, 5%)
  3. grayscale($color)
  1. adjust-hue($color, 15deg)
  2. complement($color) // like adjust-hue(_, 180deg)
  3. invert($color)
  1. fade-in($color, .5) // aka opacify()
  2. fade-out($color, .5) // aka transparentize()
  3. rgba($color, .5) // sets alpha to .5

获取值

HSLA

  1. hue($color) // 0deg..360deg
  2. saturation($color) // 0%..100%
  3. lightness($color) // 0%..100%
  4. alpha($color) // 0..1 (aka opacity())

RGB

  1. red($color) // 0..255
  2. green($color)
  3. blue($color)

:- :-
color.red() 用于获取颜色的红色通道
color.green() 用于获得颜色的绿色通道
color.blue() 用于获取颜色的蓝色通道
color.hue() 以获得颜色的色调
color.saturation() 用于获得颜色的饱和度
color.lightness() 以获得颜色的亮度

另见: hue(), red()

Sass 内置了对颜色值的支持

  1. @debug rgb(204, 102, 153); // #c69
  2. @debug rgba(107, 113, 127, 0.8); // rgba(107, 113, 127, 0.8)
  3. @debug hsl(228, 7%, 86%); // #dadbdf
  4. @debug hsla(20, 20%, 85%, 0.7); // rgb(225, 215, 210, 0.7)

调整

  1. // 固定金额变动
  2. adjust-color($color, $blue: 5)
  3. adjust-color($color, $lightness: -30%) // darken(_, 30%)
  4. adjust-color($color, $alpha: -0.4) // fade-out(_, .4)
  5. adjust-color($color, $hue: 30deg) // adjust-hue(_, 15deg)
  6. // 通过百分比变化
  7. scale-color($color, $lightness: 50%)
  8. // 完全改变一个属性
  9. change-color($color, $hue: 180deg)
  10. change-color($color, $blue: 250)

支持的: $red, $green, $blue, $hue, $saturation, $lightness, $alpha

Sass 其他函数

字符串

  1. unquote('hello')
  2. quote(bold); // "bold"
  1. to-upper-case(hello)
  2. to-lower-case(hello)

  1. str-length(hello world)
  2. // "ello" - 它是从 1 开始的,而不是从 0 开始的
  3. str-slice(hello, 2, 5)
  4. str-insert("abcd", "X", 1) // "Xabcd"

Numbers

  1. floor(4.2) // 4
  2. ceil(4.2) // 5
  3. round(4.2) // 4
  4. abs(-10px) // 10px

  1. min(1px, 4px) // 1px
  2. $widths: 50px, 30px, 100px
  3. @debug math.min($widths...) // 30px

  1. percentage(.5) // 50%
  2. random(3) // 0..3

Units

  1. unit(3em) // 'em'
  2. unitless(100px) // false

Units

  1. unit(3em) // 'em'
  2. unitless(100px) // false

Misc

  1. // 检查 $red
  2. variable-exists(red)
  3. // 检查@mixin red-text
  4. mixin-exists(red-text)
  5. function-exists(redify)

  1. global-variable-exists(red)

  1. // .menu li a
  2. selector-append('.menu', 'li', 'a')
  3. // .menu:hover li
  4. selector-nest('.menu', '&:hover li')
  5. selector-extend(...)
  6. selector-parse(...)
  7. selector-replace(...)
  8. selector-unify(...)

Sass 功能检查

功能检查

  1. meta.feature-exists($feature)
  2. feature-exists($feature) //=> boolean

  1. @mixin debug-content-exists {
  2. @debug meta.content-exists();
  3. @content;
  4. }
  5. @include debug-content-exists; // false
  6. @include debug-content-exists { // true
  7. // Content!
  8. }

功能

:- :-
global-variable-shadowing # 这意味着局部变量将隐藏全局变量,除非它具有 !global 标志
extend-selector-pseudoclass # 这意味着 @extend 规则将影响嵌套在伪类中的选择器,如 :not()
units-level-3 # 这意味着单位算术支持在 CSS 值和单位级别 3 中定义的单位
at-error # 这意味着支持 @error 规则
custom-property # 这意味着自定义属性声明值不支持除插值之外的任何表达式

Sass 循环

For 循环

  1. $base-color: #036;
  2. @for $i from 1 through 3 {
  3. ul:nth-child(3n + #{$i}) {
  4. background-color: lighten($base-color, $i * 5%);
  5. }
  6. }

编译 css 为:

  1. ul:nth-child(3n + 1) {
  2. background-color: #004080;
  3. }
  4. ul:nth-child(3n + 2) {
  5. background-color: #004d99;
  6. }
  7. ul:nth-child(3n + 3) {
  8. background-color: #0059b3;
  9. }

Each 循环(简单)

  1. $sizes: 40px, 50px;
  2. @each $size in $sizes {
  3. .icon-#{$size} {
  4. font-size: $size;
  5. height: $size;
  6. }
  7. }

编译 css 为:

  1. .icon-40px {
  2. font-size: 40px;
  3. height: 40px;
  4. }
  5. .icon-50px {
  6. font-size: 50px;
  7. height: 50px;
  8. }

Each 循环(嵌套)

  1. $icons: ("eye": "\f112", "start": "\f12e");
  2. @each $name, $glyph in $icons {
  3. .icon-#{$name}:before {
  4. display: inline-block;
  5. font-family: "Icon Font";
  6. content: $glyph;
  7. }
  8. }

编译 css 为:

  1. .icon-eye:before {
  2. display: inline-block;
  3. font-family: "Icon Font";
  4. content: "";
  5. }
  6. .icon-start:before {
  7. display: inline-block;
  8. font-family: "Icon Font";
  9. content: "";
  10. }

While 循环

  1. @use "sass:math";
  2. /// 将 `$value` 除以 `$ratio` 直到它低于 `$base`
  3. @function scale-below($value, $base, $ratio: 1.618) {
  4. @while $value > $base {
  5. $value: math.div($value, $ratio);
  6. }
  7. @return $value;
  8. }
  9. $normal-font-size: 16px;
  10. sup {
  11. font-size: scale-below(20px, 16px);
  12. }

编译 css 为:

  1. sup {
  2. font-size: 12.36094px;
  3. }

Sass 其它功能

条件句

  1. @mixin avatar($size, $circle: false) {
  2. width: $size;
  3. height: $size;
  4. @if $circle {
  5. border-radius: $size / 2;
  6. }
  7. }
  8. .square-av {
  9. @include avatar(100px, $circle: false);
  10. }
  11. .circle-av {
  12. @include avatar(100px, $circle: true);
  13. }

编译 css 为:

  1. .square-av {
  2. width: 100px;
  3. height: 100px;
  4. }
  5. .circle-av {
  6. width: 100px;
  7. height: 100px;
  8. border-radius: 50px;
  9. }

插值

  1. .#{$klass} { ... } // Class
  2. call($function-name) // Functions
  3. @media #{$tablet}
  4. font: #{$size}/#{$line-height}
  5. url("#{$background}.jpg")

列表

  1. $list: (a b c);
  2. nth($list, 1) // starts with 1
  3. length($list)
  4. @each $item in $list { ... }

Maps

  1. $map: (key1: value1, key2: value2, key3: value3);
  2. map-get($map, key1)

另见