SCSS 基础语法与使用(混合器)

420 阅读2分钟

(1)当你的代码中需要用到大段大段重用样式代码的时候,可以通过 SCSS 的混 合器实现大段样式的重用。混合器使用@mixin 标识符定义。

示例:

SCSS 样式文件:(添加跨浏览器的圆角边框)

@minix rounded-corners{
-moz-border-radius:5px;
-webkit-border-radius:5px;
border-radius:5px;
}

可以使用@include 来使用这个混合器:
notice{
background-color:green;
border:2px solid #fff;
@include rounded-corners;
}

编译后的 css 样式:

.notice{
    background-color:green;
    border:2px solid #fff;
    -moz-border-radius:5px;
    -webkit-border-radius:5px;
    border-radiusL5px;
}

(2)使用混合器:

利用混合器,可以很容易地在样式表的不同地方共享样式。如果发现自己在不停地 重复一段样式,那就应该把这段代码构造成优良的混合器,尤其是这段样式本身就 是一个逻辑单元,比如说就是一组放在一起有意义的属性。

混合器中的 css 规则:混合器中不仅可以包含属性,也可以包含 css 规则,包含选 择器和选择器中的属性。

示例:

SCSS 样式文件:

@mixin no-bullets{
    list-style:none;
li{
    list-style-image:none;
    list-style-type:none;
    margin-left:0px;
}
}

通过@include 使用混合器

ul.plain{
  color:#444;
  @include no-bullets;
}

编译后的 css 样式:

ul.plain{
  color:#444;
  list-style:none;
}
ul.plain li{
  list-style-image:none;
  list-style-type:none;
  margin-left:0px;
}

(3)给混合器传参:

混合器不一定总是生成相同的样式,可以通过@include 混合器时给混合器传参, 来指定混合器生成的精确样式。当@include 混合器时,参数其实就是可以赋值给 css 属性值的变量。

示例:

SCSS 样式文件:

@mixin link-colors($normal, $hover, $visited){
  color: $normal;
&:hover{ color: $hover; }
&:visited{ color: $visited; }
}

通过@include 使用混合器时

a{
  @include link-colors(blue, red, green);
}

编译后的 CSS 样式:

a{ color:blue; }
a:hover{ color:red; }
a:visited{ color: green; }

当你@include 混合器时,有时候可能会很难区分每个参数是什么意思,参数之间 是一个什么样的顺序。为了解决这个问题,SCSS 允许通过预付$name:value 的形式指 定每个参数的值。这是形式的传参,参数顺序就不必再在乎了,只需要保证没有漏掉参 数即可。

示例:

通过@include 使用混合器时

a{
  @include link-colors{
    $normal: blue,
    $visited: green,
    $hover: red
  };
}

(4)默认参数值:

为了在@include 混合器时不必传入所有的参数,我们可以给参数指定一个默认值。 参数默认值使用$name:default-value 的声明形式,默认值可以是任何有效的 css 属性值,甚至是其他参数的引用。

示例:

SCSS 样式文件:

@mixin link-colors(
$normal,
$hover:$normal,
$visited:$normal;
)
{
	color:$normal;
&:hover{ color:$hover; }
&:visited{ color:$visited; }
}

通过@include 使用混合器

a{
  @include link-colors(red);
}

编译后的 css 样式:

a{ color: red; }
a:hover{ color:red; }
a:visited{ color:red; }