原文网址:Scss--@mixin--使用/实例_IT利刃出鞘的博客-CSDN博客

简介

        本文介绍Scss混合指令@mixin的用法。

        混合指令(Mixin)用于定义可重复使用的样式,避免了使用无语意的 class,比如 .float-left。混合指令可以包含所有的 CSS 规则,绝大部分 Sass 规则,甚至通过参数功能引入变量,输出多样化的样式。

定义混合指令:@mixin

        混合指令的用法是在 @mixin 后添加名称与样式,比如名为 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 }
}

引用混合样式:@include

说明

        使用 @include 指令引用混合样式,格式是在其后添加混合名称,以及需要的参数(可选)。

简单示例

SCSS:

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

编译后的CSS:

.page-title {
  font-family: Arial;
  font-size: 20px;
  font-weight: bold;
  color: #ff0000;
  padding: 4px;
  margin-top: 10px; 
}

可以在最外层引用混合样式

也可以在最外层引用混合样式,不会直接定义属性,也不可以使用父选择器。

SCSS

@mixin silly-links {
  a {
    color: blue;
    background-color: red;
  }
}
@include silly-links;

编译后的CSS:

a {
  color: blue;
  background-color: red; 
}

混合样式中可以包含其他混合样式

比如

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

混合样式中应该只定义后代选择器,这样可以安全的导入到文件的任何位置。

参数

概述

说明

        参数用于给混合指令中的样式设定变量,并且赋值使用。在定义混合指令的时候,按照变量的格式,通过逗号分隔,将参数写进圆括号里。引用指令时,按照参数的顺序,再将所赋的值对应写进括号。

示例

SCSS:

@mixin sexy-border($color, $width) {
  border: {
    color: $color;
    width: $width;
    style: dashed;
  }
}
p { 
  @include sexy-border(blue, 1in); 
}

编译后的CSS:

p {
  border-color: blue;
  border-width: 1in;
  border-style: dashed; 
}

给参数设置默认值

        混合指令也可以使用给变量赋值的方法给参数设定默认值,然后,当这个指令被引用的时候,如果没有给参数赋值,则自动使用默认值。

SCSS:

@mixin sexy-border($color, $width: 1in) {
  border: {
    color: $color;
    width: $width;
    style: dashed;
  }
}
p { @include sexy-border(blue); }
h1 { @include sexy-border(blue, 2in); }

编译后的CSS:

p {
  border-color: blue;
  border-width: 1in;
  border-style: dashed; 
}
h1 {
  border-color: blue;
  border-width: 2in;
  border-style: dashed; 
}

关键词参数

混合指令也可以使用关键词参数,上面的例子也可以写成:

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

        虽然不够简明,但是阅读起来会更方便。关键词参数给函数提供了更灵活的接口,以及容易调用的参数。关键词参数可以打乱顺序使用,如果使用默认值也可以省缺,另外,参数名被视为变量名,下划线、短横线可以互换使用。 

参数变量

说明

        有时,不能确定混合指令需要使用多少个参数,比如一个关于 box-shadow 的混合指令不能确定有多少个 'shadow' 会被用到。这时,可以使用参数变量 … 声明(写在参数的最后方)告诉 Sass 将这些参数视为值列表处理。

简单示例

SCSS

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

编译后的CSS

.shadowed {
  -moz-box-shadow: 0px 4px 5px #666, 2px 6px 10px #999;
  -webkit-box-shadow: 0px 4px 5px #666, 2px 6px 10px #999;
  box-shadow: 0px 4px 5px #666, 2px 6px 10px #999;
}

参数变量也可以用在引用混合指令(@include)

与平时用法一样,将一串值列表中的值逐条作为参数引用。

SCSS

@mixin colors($text, $background, $border) {
  color: $text;
  background-color: $background;
  border-color: $border;
}
$values: #ff0000, #00ff00, #0000ff;
.primary {
  @include colors($values...);
}

编译后的CSS:

.primary {
  color: #ff0000;
  background-color: #00ff00;
  border-color: #0000ff;
}

向混合样式中导入内容

说明

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

简单示例

SCSS

@mixin apply-to-ie6-only {
  * html {
    @content;
  }
}
@include apply-to-ie6-only {
  #logo {
    background-image: url(/logo.gif);
  }
}

编译后的CSS:

* html #logo {
  background-image: url(/logo.gif);
}

为便于书写,@mixin 可以用 = 表示,而 @include 可以用 + 表示,所以上面的例子可以写成:

=apply-to-ie6-only
  * html
    @content
+apply-to-ie6-only
  #logo
    background-image: url(/logo.gif)

        注意: 当 @content 在指令中出现过多次或者出现在循环中时,额外的代码将被导入到每一个地方。

发表回复