一、变量作用域

1、Sass 变量的作用域只能在当前的层级上有效果

2、当然 Sass 中我们可以使用 !global 关键词来设置变量是全局的

h1 {
  $myColor: green;   // 只在 h1 里头有用,局部作用域
  color: $myColor;
}

h1 {
  $myColor: green !global;  // 全局作用域
  color: $myColor;
}
p {
  color: $myColor;
}

3、注意:所有的全局变量我们一般定义在同一个文件,如:_globals.scss,然后我们使用 @include 来包含该文件

二、@import 导入文件和Partials 语法

1、@import 指令可以让我们导入其他文件等内容。

CSS @import 指令在每次调用时,都会创建一个额外的 HTTP 请求。但,Sass @import 指令将文件包含在 CSS 中,不需要额外的 HTTP 请求

2、css本身也有@import属性,sass再提出来,会不会有所多余呢?我们来分析一下css的 @import

  • 它更多是用来做媒体查询的
  • 它每引入一个文件,都会向服务器发送一次请求
  • 它并不是把引入的文件和当前文件进行融合
  • 引入文件中定义的变量不能在当前文件中使用

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

  • 文件拓展名是.css
  • 文件名以http://开头;
  • 文件名是url();
  • 不能包含媒体查询 media queries。

3、另外,Sass可以把Sass文件当做一个组件引入而不会把这个组件单独编译成css文件,而想要实现这个功能只需要在文件名前面加上一个下划线就可以了。比如_components.scss 这时候编辑器不会自动编译这个文件,而只有当我们在另一个scss文件里引入这个文件之后,才会把这个文件里的内容编译到引入的文件里

4、现在我在项目中建立了两个scss文件

  • _components.scss
  • style.scss

  可以看到_components.scss并没有被编辑器所编译,只有一个孤零零的scss文件,而下面的style.scss文件则被编译成了css文件,并附带了一个map文件。

  另外还可以看到一点,_components中定义的@mixin在style中是可以正常使用的,也就是说我们可以把一些公用的文件提取出来,然后在需要用的地方引入就可以了,这对于模块化开发非常有帮助。

5、Sass Partials 语法

  如果你不希望将一个 Sass 的代码文件编译到一个 CSS 文件,你可以在文件名的开头添加一个下划线。这将告诉 Sass 不要将其编译到 CSS 文件。

_filename;

  注意:以下实例创建一个 _colors.scss 的文件,但是不会编译成 _colors.css 文件。如果要导入该文件,则不需要使用下划线。

// _colors.scss 文件代码:
$myPink: #EE82EE;
$myBlue: #4169E1;

// 如果要导入该文件,则不需要使用下划线:
@import "colors";
body {
  font-family: Helvetica, sans-serif;
  color: $myBlue;
}

  注意:请不要将带下划线与不带下划线的同名文件放置在同一个目录下,比如,_colors.scss 和 colors.scss 不能同时存在于同一个目录下,否则带下划线的文件将会被忽略。

三、@mixin 与 @include

  @mixin 指令允许我们定义一个可以在整个样式表中重复使用的样式。

  @include 指令可以将混入(mixin)引入到文档中。

1、定义一个混入:Sass 的连接符号 - 与下划线符号 _ 是相同的,也就是 @mixin important-text { } 与 @mixin important_text { } 是一样的混入。

@mixin important-text {
  color: red;
  font-weight: bold;
  border: 1px solid blue;
}
// 使用混入
.danger {
  @include important-text;
  background-color: green;
}

// 将以上代码转换为 CSS 代码,如下所示:
.danger {
  color: red;
  font-weight: bold;
  border: 1px solid blue;
  background-color: green;
}

2、向混入传递变量:

/* 混入接收两个参数 */
@mixin bordered($color, $width) {
  border: $width solid $color;
}
.myArticle {
  @include bordered(blue, 1px);  // 调用混入,并传递两个参数
}

3、混入的参数也可以定义默认值,语法格式如下:

@mixin bordered($color: blue, $width: 1px) {
  border: $width solid $color;
}

// 在包含混入时,你只需要传递需要的变量名及其值:
@mixin sexy-border($color, $width: 1in) {
  border: {
    color: $color;
    width: $width;
    style: dashed;
  }
}
p { @include sexy-border(blue); }
h1 { @include sexy-border(blue, 2in); }

4、可变参数:

... 来设置可变参数。例如,用于创建盒子阴影(box-shadow)的一个混入(mixin)可以采取任何数量的 box-shadow 作为参数

@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);
}

5、混入也还可以包含选择器和属性的混合体,选择器中甚至可以包含 parent references(父选择器)

/* 混合体:选择器/嵌套属性/父选择器 */
@mixin public{
    &:hover{
        font:{
            family: '微软雅黑';
            size: 14px;
            weight: bold;  
        }
    }
    *{
        border-radius: 10px;
    }
}
/* 引用 Mixins模块 */
div{
    @include public;
}

  编译为css

div:hover {
  font-family: '微软雅黑';
  font-size: 14px;
  font-weight: bold; 
}
div * {
  border-radius: 10px; 
}

  解释:在 public 模块中,首先使用了选择器(&),接着使用嵌套属性语法,最后使用了父选择器(*)

四、@extend 与 继承

1、@extend 指令告诉 Sass 一个选择器的样式从另一选择器继承。如果一个样式与另外一个样式几乎相同,只有少量的区别,则使用 @extend 就显得很有用。

.button-basic  {
  border: none;
  padding: 15px 30px;
}
.button-report  {
  @extend .button-basic;
  background-color: red;
}
.button-submit  {
  @extend .button-basic;
  background-color: green;
  color: white;
}

// 将以上代码转换为 CSS 代码,如下所示:
.button-basic, .button-report, .button-submit {
  border: none;
  padding: 15px 30px;
}
.button-report  {
  background-color: red;
}
.button-submit  {
  background-color: green;
  color: white;
}

  注意 @extend 转换为 css 代码的情况。

  使用 @extend 后,我们在 HTML 按钮标签中就不需要指定多个类 class="button-basic button-report" ,只需要设置 class="button-report" 类就好了。@extend 很好的体现了代码的复用。

2、与 @mixin 区别:

  @extend指令通过继承从而简化了代码,但是它的缺陷也尤为明显,首先是不够灵活,最重要的是它还会将你不需要的其他地方具有相同类名的样式都继承过来(继承来的类添加了其他规则)。但你要清楚,@extend指令有它自己的应用场景,并非一无是处,只不过在多样化且不重复的复用上,@mixin指令要优于它而已。

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

3、@mixin 与 @extend 的区别与选择:@extend的本质其实是将一个样式的类名组合在一起形成组选择器,共用一段样式代码,而@mixin则恰恰相反

.button {  
    background: green;  
}
.button-1 {  
    @extend .button;  
}
.button-2 {  
    @extend .button;  
}

// @extend编译后
.button, 
.button-1, 
.button-2 {  
    background: green;  
}

@mixin button {  
    background-color: green;  
}
.button-1 {  
    @include button;  
} 
.button-2 {  
    @include button;  
}

// @mixin编译后
.button {  
    background-color: green;  
}
.button-1 {  
    background-color: green;  
}
.button-2 {  
    background-color: green;  
}

  所以,通过编译后的 css 代码,二者的区别显而易见,使用@extend可以减少编译后代码量。@extend 是类的样式的组合,而 @mixin 是将混入的样式在引用的位置直接复用。