SCSS基本语法

一、基本使用

1. 使用变量$

先说明下载css中定义变量的写法

:root {
  --color:#f00;
}
body {
  --border-color:#f2f2f2;
}
.header {
  --background-color:#f8f8f8;
}

p {
  color: var(--color);
  border-color: var(--border-color);
} 
.header {
  background-color: var(--background-color);
}

在scss中定义变量有如下规则:

  • 变量名以美元 $ 开头,后面跟变量名;
  • 变量名是不以数字开头的可包含字母、数字、下划线、横线(连接符);
  • 写法同 css,即变量名与值之间用 : 分隔;
  • 变量一定要先定义,后使用;

注意,在定义变量时,$font-B$font_B是一样的含义,写在后面的会覆盖前面的变量。可用于配置颜色、字体,或全局配置图片路径等。

2. 默认变量值 !default

!default 可以给变量赋予默认值。该变量假如已经赋值,那么它不会被重新赋值,但是,如果它尚未赋值,那么它会被赋予新的给定值。

3. 局部变量和全局变量

局部变量: 在选择器内定义的变量,只能在选择器范围内使用,相当于块作用域;
全局变量:定义后能全局使用的变量,有两种定义方式,一种是在选择器外面的最前面定义的变量;另一种是使用 !global 标志定义全局变量。

4. 变量值类型

变量值的类型可以有很多种,SASS支持7种主要的数据类型:

  • 数字 (例如: 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 ,从一个值映射到另一个 (例如: (key1: value1, key2: value2))

注意,用 () 表示不包含任何值的空数组(在 Sass 3.3 版之后也视为空的 map)

$layer-index:10;
$border-width:3px;
$font-base-family:'Open Sans', Helvetica, Sans-Serif;
$top-bg-color:rgba(255,147,29,0.6);
$block-base-padding:6px 10px 6px 10px;
$blank-mode:true;
$var:null; // 值null是其类型的唯一值。它表示缺少值,通常由函数返回以指示缺少结果。
$color-map: (color1: #fa0000, color2: #fbe200, color3: #95d7eb);

$fonts: (serif: "Helvetica Neue",monospace: "Consolas");

5. 语法嵌套规则

选择器嵌套

Sass 允许将一个 CSS 样式嵌套进另一个样式中,内层样式仅适用于外层样式的选择器范围内(可以理解为层级选择器),这有助于避免父选择器重复,相对于复杂的CSS布局中多层嵌套的选择器 要简单得多,例如

#main p {
  color: #00ff00;
  width: 97%;
  .redbox {
    background-color: #ff0000;
    color: #000000;
  }
} 
父选择器 &

有些时候需要直接使用嵌套外层的父选择器,这个就很有用了,例如,你可能喜欢给选择器指定 hover样式,或者当body元素具有某个样式时,在这些情况下,你可以 & 字符来明确地表示插入指定父选择器。 例如:

a {
  font-weight: bold;
  text-decoration: none;
  &:hover { text-decoration: underline; }
  body.firefox & { font-weight: normal; }
} 

& 必须出现在的选择器的开头位置(也就是作为选择器的第一个字符),但可以跟随后缀,将被添加到父选择的后面。 例如:

#main {
  color: black;
  &-sidebar { border: 1px solid; }
} 

注意,父选择器 & 被作为一个后缀的时候,Sass 将抛出一个错误。

嵌套属性

CSS中有一些属性遵循相同的“命名空间”;比如,font-family, font-size, 和 font-weight都在font命名空间中。在CSS中,如果你想在同一个命名空间中设置一串属性,你必须每次都输出来。Sass为此提供了一个快捷方式:只需要输入一次命名空间,然后在其内部嵌套子属性。例如:

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

命名空间也可以有自己的属性值。例如:

// scss
.funky {
  font: 20px/24px fantasy {
    weight: bold;
  }
} 
// 编译为
.funky {
  font: 20px/24px fatasy;
  font-weight: bold;
}

补充,font 属性的定义
font 属性是(按顺序): "font-style font-variant font-weight font-size/line-height font-family"font-sizefont-family 的值是必需的。如果缺少了其他值,默认值将被插入,如果有默认值的话。

占位符选择器 %xxx

有时,需要定义一套样式并不是给某个元素用,而是只通过 @extend 指令使用,尤其是在制作 Sass 样式库的时候,希望 Sass 能够忽略用不到的样式。例如:

.button%base {
    display: inline-block;
    margin-bottom: 0;
    font-weight: normal;
    font-size: 14px;
    // ...
    user-select: none;
}

如果没有通过@extend指令使用这个样式,这个样式在编译成css时是会被忽略的。
通过 @extend 指令使用

// scss
.btn-default {
    @extend %base;
    color: #333;
    background-color: #fff;
    border-color: #ccc;
}

.btn-success {
    @extend %base;
    color: #fff;
    background-color: #5cb85c;
    border-color: #4cae4c;
}
// 编译为
.button.btn-danger, .button.btn-success {
    display: inline-block;
    margin-bottom: 0;
    font-weight: normal;
    font-size: 14px;
    // ...
    user-select: none;
}

.btn-default {
  color: #333;
  background-color: #fff;
  border-color: #ccc;
}

.btn-success {
  color: #fff;
  background-color: #5cb85c;
  border-color: #4cae4c;
}

6. 注释

Sass支持两种注释

  • 标准的css多行注释 /* ... */ 会编译到.css文件中
  • 单行注释 // 不会编译到.css文件

7. SASS导入@import

@import

Sass 拓展了 @import 的功能,允许其导入 SCSS 或 Sass 文件。被导入的文件将合并编译到同一个 CSS 文件中,另外,被导入的文件中所包含的变量或者混合指令 (mixin) 都可以在导入的文件中使用。

// public.scss
$font-base-color: #333;

// index.scss
@import "public"
.container {
  color: $font-base-color;
}

如下几种方式,都将作为普通的css语句,不会导入任何sass文件

  • 文件拓展名是 .css;
  • 文件名以 http:// 开头;
  • 文件名是 url();
  • @import 包含 media queries
@import "public.css";
@import url(public);
@import "http://xxx.com/xxx";
@import 'landscape' screen and (orientation:landscape);
局部文件

Sass源文件中可以通过@import指令导入其他Sass源文件,被导入的文件就是局部文件,局部文件让Sass模块化编写更加容易。
如果一个目录正在被Sass程序监测,目录下的所有scss/sass源文件都会被编译,但通常不希望局部文件被编译,因为局部文件是用来被导入到其他文件的。如果不想局部文件被编译,文件名可以以下划线 (_)开头

嵌套 @import

虽然在大部分情况下,一般都是在文档的顶层使用 @import,但是也可以在CSS 规则和@media 规则中包含@import语句。就像一个基层的 @import ,这里会包含 @import 导入文件的内容。但是,只是这样导入的样式只能出现在嵌套的层中。例如

// _base.scss
.example {
  color: red;
} 
// index.scss
.container {
  @import "example";
}

// 编译为
.container .example {
  color: red;
} 

注意:@import不能使用在控制指令或混入中。

二、指令

1. 混合指令 (@mixin)

混入(mixin)允许您定义可以在整个样式表中重复使用的样式,而避免了使用无语意的类(class),比如 .float-left。混入(mixin)还可以包含所有的CSS规则,以及任何其他在Sass文档中被允许使用的东西。
他们甚至可以带arguments,引入变量,只需少量的混入(mixin)代码就能输出多样化的样式。

基础定义与使用

混入(mixin)通过 @mixin 指令定义。在它后面跟混入的名称和任选的arguments,以及混入的内容块。例如,large-text混入定义如下:

@mixin large-text {
  font: {
    family: Arial;
    size: 20px;
    weight: bold;
  }
  color: #ff0000;
} 

混入也可以包含选择器和属性的混合体,选择器中甚至可以包含父选择器。例如:

@mixin clearfix {
  display: inline-block;
  &:after {
    content: ".";
    display: block;
    height: 0;
    clear: both;
    visibility: hidden;
  }
  * html & { height: 1px }
} 

注意,由于历史原因,混入(mixin)的名字(和所有其他 Sass 标识符)可以互换连字符和下划线。例如,如果你定义了一个名为add-column的混入,你可以把它作为add_column,反之亦然。

使用 @include 指令可以将混入(mixin)引入到文档中。这需要一个混入的名称和可选的参数传递给它,并包括由混入定义的当前规则的样式。 例如:

.page-title {
  @include large-text;
  padding: 4px;
  margin-top: 10px;
} 

混入(mixin)定义也可以包含其他的混入。例如:

@mixin highlighted-background { background-color: #fc0; }
@mixin header-text { font-size: 20px; } 
@mixin compound {
  @include highlighted-background;
  @include header-text;
}
带参数混入

混入可以用SassScript 值作为参数,给定的参数被包括在混入中并且作为变量提供给混入。
当定义一个混入(mixin)的时候,参数被作为变量名,写到混入(mixin)名字后面的括号内,多个参数可以用逗号分隔。然后,当调用混入的时候,值通过对应的参数顺序被传递。 例如

@mixin sexy-border($color, $width) {
  border: {
    color: $color;
    width: $width;
    style: dashed;
  }
}

p {
  @include sexy-border(blue, 1in);
}

当然也可以给参数赋默认值 ($color, $width: 1in)

如果在使用 @include 指令时明确使用关键字参数,那么命名的参数可以按照任意顺序传递

h1 { @include sexy-border( $width: 2in, $color: blue ); } 

如果不确定参数个数的话,可以使用可变参数来定义参数,参数看起来就像普通参数一样,但后面跟随着...。例如:

@mixin box-shadow($shadows...) {
      -moz-box-shadow: $shadows;
      -webkit-box-shadow: $shadows;
      box-shadow: $shadows;
}
.shadows {
  @include box-shadow(0px 4px 5px #666, 2px 6px 10px #999);
} 
混入样式中使用插槽

在引用混合样式的时候,可以先将一段代码带入到混合指令中,然后再输出混合样式,额外导入的部分将 @content 标志占位:

$color: white;
@mixin colors($color: blue) {
  background-color: $color;
  @content;
  border-color: $color;
}
.colors {
  @include colors { color: $color; }
}
// 编译为
.colors {
  background-color: blue;
  color: white;
  border-color: blue;
}
总结
  • mixin是可以重复使用的一组CSS声明
  • mixin有助于减少重复代码,只需声明一次,就可在文件中引用
  • 混合指令可以包含所有的 CSS 规则,绝大部分 Sass 规则,甚至通过参数功能引入变量,输出多样化的样式。
  • 使用参数时建议加上默认值

2. 函数指令(@function)

Sass 支持自定义函数,并能在任何值或脚本上下文中使用。例如:

$grid-width: 40px;
$gutter-width: 10px;

@function grid-width($n) {
  @return $n * $grid-width + ($n - 1) * $gutter-width;
}
#sidebar { width: grid-width(5); }

// 编译后
#sidebar { width: 240px; }

函数可以访问任何全局定义的变量,以及接受参数,就像一个混入。函数可以包含语句,并且你必须调用@return 来设置函数的返回值。当然,可以像关键字混入一样,传入参数名来调用函数,也支持可变参数。

3. 继承指令 (@extend)

在没有继承指令前,以警告框为例,通常会在HTML中定义两个class,一个是通用警告框样式,一个是不同颜色的警告框样式

使用继承@extend改进

可以使用 @extend 继承通用样式,使用时就无需在html中写两个class了

.alert{
    padding: 15px;
    // ...
    border: 1px solid transparent;
}
.alert-info {
    @extend .alert;
    color: #31708f;
    // ...
}
.alert-success {
    @extend .alert;
    color: #3c763d;
    // ...
}
使用多个@extend

当然可以使用多个 @extend

.alert-success {
    @extend .alert;
    @extend .important;
    color: #3c763d;
    // ...
}
@extend多层继承

一个选择器可以扩展另一个选择器,另一个选择器又扩展的第三选择器选择。 例如:

.error {
  border: 1px #f00;
  background-color: #fdd;
}
.seriousError {
  @extend .error;
  border-width: 3px;
}
.criticalError {
  @extend .seriousError;
  position: fixed;
  top: 10%;
  bottom: 10%;
  left: 10%;
  right: 10%;
} 
占位符%

被继承的css父类并没有被实际应用,对于该类,可能不希望被编译输出到最终的css文件中,它只会增加CSS文件的大小,永远不会被使用。
这时候可以使用占位符%,在Sass文件中使用占位符选择器时,它可以用于扩展其他选择器,但不会被编译成最终的CSS。

%alert {
    padding: 15px;
    margin-bottom: 20px;
    border: 1px solid transparent;
    border-radius: 4px;
    font-size: 12px;
}
.alert-info {
    @extend %alert;
    color: #31708f;
    background-color: #d9edf7;
    border-color: #bce8f1;
}

4. @use指令

@use 可以从其他 sass 样式表加载 mixin, funcition 和变量,并将来自多个样式表的css组合在一起。
通过 @use "module" 使用模块时,可以不需要写扩展名,程序会自动查找。
语法:@use "Address" as spacename;
Adress: scss 文件路径
spacename:命名空间(防止加载多个文件导致引用混淆)

@use "_base.scss" as base;
.button {
  @include base.borderColor;
  color: base.$color;
}

重要的是,通过@use 加载的模块不管被引用多少次,都会在编译后输出一次到css中。但使用@import多次引入同一模块,会反复输出到css中。

注意@use的前面只能出现@forward或变量声明,其它的所有代码只能出现在 @use 之后。

5. @forward指令

当使用@use加载文件A时,当前文件中可以使用@forward来使A文件中的 mixin,函数和变量可以暴露出去。通常用于跨多个文件组织 sass 库。
通过 @forward 加载一个模块的成员,这些成员并不能在当前文件内访问,而仅仅是将这些成员当作自己的成员对外暴露出去。例如:

//a.scss
$color:red;
.a{
    color: $color;
    font-size: 16px;
}
//b.scss
@forward 'a.scss'; // 转发a中的变量,并引入普通样式代码
.b{
    // 虽然没有使用 @use 不能访问模块 a.scss 的变量,但可以继承它的样式
    @extend .a;
    // 如果写 color: a.$red 会报错,因为没有使用 @use "a.scss"
}
//css.scss
@use 'b.scss';
.index{
    @extend .a;
    background-color: b.$color;
}

通过 @forward "module" as xxx-* 可以给同一个模块中的成员统一添加前缀。
假设有 a.scssb.scssc.scss 三个模块中都有一个名叫 $color 的变量:

// bus.scss
@forward 'a.scss' as a-*;
@forward 'b.scss' as b-*;
@forward 'c.scss' as c-*;

// index.scss
@use 'bus.scss';

.index {
  background-color: bus.$a-color;
  color: bus.$b-color;
  border: 1px solid bus.$c-color;

在转发其他模块的成员时,可以对成员进行配置,修改默认值,或者指定一个确定的值均可。

// a.scss
$red: #f00 !default;
$black: #000 !default;
$green: #0f0 !default;

// b.scss
// 转发成员时进行配置,修改默认值,或修改为固定的值
@forward 'a.scss' with (
  $red: #f55 !default,
  $black: #333,
);

// index.scss
@use 'b.scss' with (
  $red: #f11,
);

.div {
  color: b.$red;                // #f11
  background-color: b.$black;   // #333
  border-color: b.$green;       // #0f0
}

默认情况下,@forward 会将一个模块中所有成员都转发,如果只想转发某些成员,或不想转发某些成员,可以这样书写:

  • @forward "module" hide $var, mixinName, fnName 禁止转发某些成员
  • @forward "module" show $var, mixinName, fnName 只转发某些成员

各个成员通过逗号 , 分隔开,如果成员是变量,不能省略 $符号。

三、SassScript

1. SASS 运算 (Operations)符的基本使用

等号操作符

所有的数据都支持等号运算符:

符号 说明
== 等于
!= 不等于

例1:数字比较

$theme:1;
.container {
    @if $theme==1 {
        background-color: red;
    }
    @else {
        background-color: blue;
    }
}

例2:字符串比较

$theme:"blue";
.container {
    @if $theme !="blue" {
        background-color: red;
    }
    @else {
        background-color: blue;
    }
}
关系(比较)运算符

关系运算符只能用于整数比较

符号 说明
<(lt) 小于
>(gt) 大于
<=(lte) 小于等于
>=(gte) 大于等于

例子

$theme:3;
.container {
    @if $theme >= 5 {
        background-color: red;
    }
    @else {
        background-color: blue;
    }
}
逻辑运行符
符号 说明
and 逻辑与
or 逻辑或
not 逻辑非

+ 运算符

    width: 50 + 20;     // 70
    width: 50 + 20%;    // 70%
    width: 50% + 20%;   // 70%
    width: 20 + 10px;   // 30px
    width: 10px + 20px; // 30px
    width: 10px + 10pt; // 23.3333333333px
    // width: 20% + 10px;  // Error have incompatible units.
    // width: 10px * 2pt;  // Error 20px*pt isn't a valid CSS value.

- 运算符

    width: 50 - 30;     // 20
    width: 50 - 30%;    // 20%
    width: 60% - 30%;   // 30%
    width: 20px - 10px; // 10px
    width: 50px - 20pt; // 23.3333333333px
    width: 50px - 20;   // 30px
    // width: 50px - 20%;  // Error have incompatible units.

*运算符

    width: 20 * 10;     // 200
    width: 5 * 20%;     // 100
    // width: 10% * 20%;   //Error 出现了两个百分号
    // width: 10px * 20px  //Error 出现了两个单位
    width: 10px * 2;    // 20px

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

width: 10 / 5;    // 此时的/没有被当作运算符,原样输出 10 / 5 
width: (10 / 5);  // 2

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

  • 如果值或值的一部分,是变量或者函数的返回值
  • 如果值被圆括号包裹
  • 如果值是算数表达式的一部分
$width: 1000px;
div {
    width: ($width/2); // 使用变量与括号
    z-index: round(10)/2; // 使用了函数
    height: (500px/2); // 使用了括号
    margin-left: 5px + 8px/2px; // 使用了+表达式
}

%运算符

    width: 10 % 3;     // 1
    width: 50 % 3px;   // 2px
    width: 50px % 3px; // 2px
    width: 50% % 7;    // 1%
    width: 50px % 7;   // 1px
    width: 50% % 9%;   // 5%
    // width: 50% % 2px;  // Error have incompatible units.
    width: 50px % 10pt;  // 10pt == 13.33333px  50px % 10pt=> 10px
字符串运算

+ 可用于连接字符串
注意:如果有引号字符串(位于 + 左侧)连接无引号字符串,运算结果是有引号的,相反,无引号字符串(位于 + 左侧)连接有引号字符串,运算结果则没有引号。(如果有一个值是函数返回的,情况可能不一样)

.container {
    content: "Foo" + Bar;         // "FooBar"
    content:  Foo + Bar;           // FooBar
    content: "Foo" + "Bar";       // "FooBar"
    font-family: sans- + "serif";  // sans-serif
}

2. 插值语句#{}

使用插值语句#{},可以确保 / 不做除法运算而是完整地编译到 CSS 文件中

p {
    $font-size: 12px;
    $line-height: 30px;
    font: #{$font-size}/#{$line-height} Helvetica,sans-serif;
    // font: 16px/30px Arial, Helvetica, sans-serif; 
}

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

$class-name:danger;
$attr:color;
$author:"zzz";

/*
    这是文件说明部分
    @author:#{$author}
*/

a .#{$class-name} {
    border-#{$attr}: #F00;
}

3. 常见函数的基本使用

这里介绍常见函数使用,更多函数移步官网

Color(颜色函数)

sass包含很多操作颜色的函数。例如:lighten()darken()函数可用于调亮或调暗颜色,opacify()函数使颜色透明度减少,transparent()函数使颜色透明度增加,mix()函数可用来混合两种颜色。

String(字符串函数)

Sass有许多处理字符串的函数,比如向字符串添加引号的quote()、获取字符串长度的string-length()和将内容插入字符串给定位置的string-insert()

p{
    &:after{
        content: quote(这是里面的内容);
        content: str-insert($string: "abce", $insert:"d" , $index: 4);
    }
    background-color: unquote($string: "#f00");
    z-index: str-length("sass学习");
}
Math(数值函数)

数值函数处理数值计算,例如:percentage()将无单元的数值转换为百分比,round()将数字四舍五入为最接近的整数,min()max()获取几个数字中的最小值或最大值,random()返回一个随机数。

p {
    z-index: abs($number: -15); // 15
    z-index: ceil(5.8); //6
    z-index: max(5, 1, 6, 8, 3); //8
    opacity: random(); // 随机 0-1
}
List

List函数操作List,length()返回列表长度,nth()返回列表中的特定项,join()将两个列表连接在一起,append()在列表末尾添加一个值。

p {
    z-index: length(12px); //1
    z-index: length(12px 5px 8px); //3
    z-index: index(a b c d, c); //3
    padding: append(10px 20px, 30px); // 10px 20px 30px
    color: nth($list: red blue green, $n: 2); // blue
}
Map函数

Map函数操作Map,map-get()根据键值获取map中的对应值,map-merge()来将两个map合并成一个新的map,map-values()映射中的所有值。

$font-sizes:("small":12px,"normal":18px,"large":24px);
$padding:(top:10px,right:20px,bottom:10px,left:30px);
p{
    font-size: map-get($map: $font-sizes, $key: "normal"); // 18px
    @if map-has-key($padding, "right"){
        padding-right: map-get($padding, "right"); // 20px
    }
    &:after{
        // '"small", "normal", "large" 10px, 20px, 10px, 30px';
        content: map-keys($font-sizes) + " "+ map-values($padding) + "";
    }
}
selector选择器函数

选择符相关函数可对CSS选择进行一些相应的操作,例如:selector-append()可以把一个选择符附加到另一个选择符,selector-unify()将两组选择器合成一个复合选择器。

.header{
    background-color: #000;
    content: selector-append(".a",".b",".c") + '';  // ".a.b.c"
    content: selector-unify("a",".diasbled") + '';  // "a.diasbled"
}
自检函数

自检相关函数,例如:feature-exists()检查当前Sass版本是否存在某个特性,variable-exists()检查当前作用域中是否存在某个变量,mixin-exists()检查某个mixin是否存在。

$color:#F00;
@mixin padding($left:0, $top:0, $right:0, $bottom:0) {
    padding: $top $right $bottom $left;
}

.container {
    @if variable-exists(color) {
        color: $color;
    }
    @else {
        content: "$color不存在";
    }
    @if mixin-exists(padding) {
        @include padding($left: 10px, $right: 10px);
    }
}

4. 流程控制指令@if、@for、@each、@while

@if 控制指令

@if()函数允许您根据条件进行分支,并仅返回两种可能结果中的一种。
语法方式同js的if....else if ...else

$theme:"green";
.container {
    @if $theme=="red" {
        color: red;
    }
    @else if $theme=="blue" {
        color: blue;
    }
    @else if $theme=="green" {
        color: green;
    }
    @else {
        color: darkgray;
    }
}
@for指令

@for 指令可以在限制的范围内重复输出格式,每次按要求(变量的值)对输出结果做出变动。这个指令包含两种格式:@for $var from through ,或者 @for $var from to,区别在于 throughto 的含义:

  • 当使用through时,条件范围包含<start>与<end>的值。
  • 而使用to 时条件范围只包含<start>的值不包含<end>的值。
  • 另外,$var 可以是任何变量,比如 $i<start> 和<end> 必须是整数值。
@for $i from 1 to 4 {
    .p#{$i} {
        width: 10px * $i;
        height: 30px;
        background-color: red;
    }
}

@for $i from 1 through 3 {
    .p#{$i} {
        width: 10px * $i;
        height: 30px;
        background-color: red;
    }
}
@each指令

有这样一个例子,普通CSS写法

p{
  display:inline-block;
  width:10px;
  height:10px;
  margin:10px;
}
p:nth-child(1){
  background:red;
}
p:nth-child(2){
  background:green;
}
p:nth-child(3){
  background:blue;
}
p:nth-child(4){
  background:orange;
}
p:nth-child(5){
  background:pink;
}

使用@each指令改写,@each 指令的格式是 $var in <list> , $var 可以是任何变量名,比如 $length 或者 $name,而<list>是一连串的值,也就是值列表。

p{
  width:10px;
  height:10px;
  margin:10px;
  display:inline-block;
}
$color-list:red green blue orange pink;
@each $color in $color-list{
  /*使用index()获取当前颜色在列表的所属位置*/
  $index:index($color-list,$color);
  p:nth-child(#{$index}){
    background:$color;
  }
}
@while 指令

@while 指令重复输出格式直到表达式返回结果为 false。这样可以实现比 @for 更复杂的循环。
用sass实现bootstrap中css的这么一段代码:

.col-sm-12 {
    width: 100%;
}
.col-sm-11 {
    width: 91.66666667%;
}
.col-sm-10 {
    width: 83.33333333%;
}
.col-sm-9 {
    width: 75%;
}
.col-sm-8 {
    width: 66.66666667%;
}
.col-sm-7 {
    width: 58.33333333%;
}
.col-sm-6 {
    width: 50%;
}
.col-sm-5 {
    width: 41.66666667%;
}
.col-sm-4 {
    width: 33.33333333%;
}
.col-sm-3 {
    width: 25%;
}
.col-sm-2 {
    width: 16.66666667%;
}
.col-sm-1 {
    width: 8.33333333%;
}

@while改写:

$column:12;
@while $column > 0 {
    .col-sm-#{$column}{
        // width:$column / 12*100%;
        // width: calc($column / 12) * 100%;
        width: unquote($string: $column / 12 * 100 + '%');
    }
    $column:$column - 1;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,312评论 5 473
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,578评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,337评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,134评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,161评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,303评论 1 280
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,761评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,421评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,609评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,450评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,504评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,194评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,760评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,836评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,066评论 1 257
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,612评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,178评论 2 341

推荐阅读更多精彩内容