Sass进阶

————————-一、控制指令—————————
1、@if 指令是一个 SassScript,它可以根据条件来处理样式块,如果条件为 true 返回一个样式块,反之 false 返回另一个样式块。在 Sass 中除了 @if 之,还可以配合 @else if 和 @else 一起使用。
2、@for循环(上)在 Sass 中,可以使用 @for 循环来完成。在 Sass 的 @for 循环中有两种方式:

@for $i from <start> through <end>
@for $i from <start> to <end>

$i 表示变量
start 表示起始值
end 表示结束值
这两个的区别是关键字 through 表示包括 end 这个数,而 to 则不包括 end 这个数。
如下代码,先来个使用 through 关键字的例子:

@for $i from 1 through 3 {
  .item-#{$i} { width: 2em * $i; }
}

编译出来的 CSS:

.item-1 {
  width: 2em;
}
.item-2 {
  width: 4em;
}
.item-3 {
  width: 6em;
}

再来个 to 关键字的例子:

@for $i from 1 to 3 {
  .item-#{$i} { width: 2em * $i; }
}

编译出来的 CSS:

.item-1 {
  width: 2em;
}
.item-2 {
  width: 4em;
}

3、@for循环 (下)
//SCSS

$grid-prefix: span !default;
$grid-width: 60px !default;
$grid-gutter: 20px !default;
%grid {
  float: left;
  margin-left: $grid-gutter / 2;
  margin-right: $grid-gutter / 2;
}
//through
@for $i from 1 through 12 {
  .#{$grid-prefix}#{$i}{
    width: $grid-width * $i + $grid-gutter * ($i - 1);
    @extend %grid;
  }  
}
//to
@for $i from 1 to 13 {
  .#{$grid-prefix}#{$i}{
    width: $grid-width * $i + $grid-gutter * ($i - 1);
    @extend %grid;
  }  
}

4、@while循环 @while 指令也需要 SassScript 表达式(像其他指令一样),并且会生成不同的样式块,直到表达式值为 false 时停止循环。这个和 @for 指令很相似,只要 @while 后面的条件为 true 就会执行。

//SCSS
$types: 4;
$type-width: 20px;

@while $types > 0 {
    .while-#{$types} {
        width: $type-width + $types;
    }
    $types: $types - 1;
}

编译出来的 CSS

.while-4 {
  width: 24px;
}

.while-3 {
  width: 23px;
}

.while-2 {
  width: 22px;
}

.while-1 {
  width: 21px;
}

5、@each循环 @each 循环就是去遍历一个列表,然后从列表中取出对应的值。
@each 循环指令的形式:

@each $var in <list>

如:

//scss
$list: adam john wynn mason kuroir;//$list 就是一个列表
@mixin author-images {
    @each $author in $list {
        .photo-#{$author} {
            background: url("/images/avatars/#{$author}.png") no-repeat;
        }
    }
}
.author-bio {
    @include author-images;
}

编译出来的css

.author-bio .photo-adam {
  background: url("/images/avatars/adam.png") no-repeat; }
.author-bio .photo-john {
  background: url("/images/avatars/john.png") no-repeat; }
.author-bio .photo-wynn {
  background: url("/images/avatars/wynn.png") no-repeat; }
.author-bio .photo-mason {
  background: url("/images/avatars/mason.png") no-repeat; }
.author-bio .photo-kuroir {
  background: url("/images/avatars/kuroir.png") no-repeat; }

——————–二、Sass的函数功能-字符串与数字函数 —————–
1、Sass的函数简介
在 Sass 中除了可以定义变量,具有 @extend、%placeholder 和 mixins 等特性之外,还自备了一系列的函数功能。其主要包括:
字符串函数
数字函数
列表函数
颜色函数
Introspection 函数
三元函数等
当然除了自备的函数功能之外,我们还可以根据自己的需求定义函数功能,常常称之为自定义函数。
2、字符串函数-unquote()函数
字符串函数顾名思意是用来处理字符串的函数。Sass 的字符串函数主要包括两个函数:
unquote($string):删除字符串中的引号;
quote($string):给字符串添加引号。
(1)、unquote()函数 unquote() 函数主要是用来删除一个字符串中的引号,如果这个字符串没有带有引号,将返回原始的字符串。

//SCSS
.test1 {
    content:  unquote('Hello Sass!') ;
}
.test2 {
    content: unquote("'Hello Sass!");
}
.test3 {
    content: unquote("I'm Web Designer");
}
.test4 {
    content: unquote("'Hello Sass!'");
}
.test5 {
    content: unquote('"Hello Sass!"');
}
.test6 {
    content: unquote(Hello Sass);
}

编译的代码

//CSS
.test1 {
  content: Hello Sass!; }

.test2 {
  content: 'Hello Sass!; }

.test3 {
  content: I'm Web Designer; }

.test4 {
  content: 'Hello Sass!'; }

.test5 {
  content: "Hello Sass!"; }

.test6 {
  content: Hello Sass; }

(2)quote() 函数刚好与 unquote() 函数功能相反,主要用来给字符串添加引号。如果字符串,自身带有引号会统一换成双引号 “”

//SCSS
.test1 {
    content:  quote('Hello Sass!');
}
.test2 {
    content: quote("Hello Sass!");
}
.test3 {
    content: quote(ImWebDesigner);
}
.test4 {
    content: quote(' ');
}

编译出来的 css 代码:

//CSS
.test1 {
  content: "Hello Sass!";
}
.test2 {
  content: "Hello Sass!";
}
.test3 {
  content: "ImWebDesigner";
}
.test4 {
  content: "";
}

使用 quote() 函数只能给字符串增加双引号,而且字符串中间有单引号或者空格时,需要用单引号或双引号括起,否则编译的时候将会报错。

.test1 {
    content:  quote(Hello Sass);
}

这样使用,编译器马上会报错:

error style.scss (Line 13: $string: ("Hello""Sass") is not a string for `quote')

解决方案就是去掉空格,或者加上引号:

.test1 {
    content:  quote(HelloSass);
}
.test1 {
    content:  quote("Hello Sass");
}

同时 quote() 碰到特殊符号,比如: !、?、> 等,除中折号 – 和 下划线_ 都需要使用双引号括起,否则编译器在进行编译的时候同样会报错
3、字符串函数-To-upper-case()、To-lower-case()
(1)To-upper-case() To-upper-case() 函数将字符串小写字母转换成大写字母。如:

//SCSS
.test {
  text: to-upper-case(aaaaa);
  text: to-upper-case(aA-aAAA-aaa);
}

编译出来的 css 代码:

//CSS
.test {
  text: AAAAA;
  text: AA-AAAA-AAA;
}```
(2)、To-lower-case()
 与 To-upper-case() 刚好相反,将字符串转换成小写字母
4、数字函数简介  Sass 中的数字函数提要针对数字方面提供一系列的函数功能:
      percentage($value):将一个不带单位的数转换成百分比值;
      round($value):将数值四舍五入,转换成一个最接近的整数;
      ceil($value):将大于自己的小数转换成下一位整数;
      floor($value):将一个数去除他的小数部分;
      abs($value):返回一个数的绝对值;
      min($numbers…):找出几个数值之间的最小值;
      max($numbers…):找出几个数值之间的最大值;
      random(): 获取随机数
5、percentage()函数主要是将一个不带单位的数字转换成百分比形式:

percentage(.2)
20%
percentage(2px / 10px)
20%
percentage(2em / 10em)
20%

.footer{
width : percentage(.2)
}

6、round() 函数可以将一个数四舍五入为一个最接近的整数:

round(12.3)
12
round(12.5)
13
round(1.49999)
1
round(2.0)
2
round(20%)
20%
round(2.2%)
2%
round(3.9em)
4em
round(2.3px)
2px
round(2px / 3px)
1
round(1px / 3px)
0
round(3px / 2em)
2px/em

.footer {
width:round(12.3px)
}

编译后的 css 代码:

.footer {
width: 12px;
}

在round() 函数中可以携带单位的任何数值。
编译后的 css 代码:

.footer{
width : 20%
}

如果您转换的值是一个带有单位的值,那么在编译的时候会报错误信息:
7、ceil() 函数将一个数转换成最接近于自己的整数,会将一个大于自身的任何小数转换成大于本身 1 的整数。也就是只做入,不做舍的计算:

ceil(2.0)
2
ceil(2.1)
3
ceil(2.6)
3
ceil(2.3%)
3%
ceil(2.3px)
3px
ceil(2.5px)
3px
ceil(2px / 3px)
1
ceil(2% / 3px)
1%/px
ceil(1em / 5px)
1em/px

.footer {
width:ceil(12.3px);
}

编译后的 css 代码:

.footer {
width: 13px;
}

8、floor() 函数刚好与 ceil() 函数功能相反,其主要将一个数去除其小数部分,并且不做任何的进位。也就是只做舍,不做入的计算:

floor(2.1)
2
floor(2.5)
2
floor(3.5%)
3%
floor(10.2px)
10px
floor(10.8em)
10em
floor(2px / 10px)
0
floor(3px / 1em)
3px/em

.footer {
width:floor(12.3px);
}

编译后的 css 代码:

.footer {
width: 12px;
}

9、abs( ) 函数会返回一个数的绝对值。

abs(10)
10
abs(-10)
10
abs(-10px)
10px
abs(-2em)
2em
abs(-.5%)
0.5%
abs(-1px / 2px)
0.5

.footer {
width:abs(-12.3px);
}

编译后的 css 代码:

.footer {
width: 12.3px;
}

10、min() 函数功能主要是在多个数之中找到最小的一个,这个函数可以设置任意多个参数:

min(1,2,1%,3,300%)
1%
min(1px,2,3px)
1px
min(1em,2em,6em)
1em

不过在 min()、max() 函数中同时出现两种不同类型的单位
max() 函数和 min() 函数一样,不同的是,max() 函数用来获取一系列数中的最大那个值:
11、random() 函数是用来获取一个随机数:

random()
0.03886
random()
0.66527
这是产生0-1的随机数


------------------ 三、Sass的函数功能-列表函数--------------------
1、列表函数简介   列表函数主要包括一些对列表参数的函数使用,主要包括以下几种:
      length($list):返回一个列表的长度值;
      nth($list, $n):返回一个列表中指定的某个标签值
      join($list1, $list2, [$separator]):将两个列给连接在一起,变成一个列表;
      append($list1, $val, [$separator]):将某个值放在列表的最后;
      zip($lists…):将几个列表结合成一个多维的列表;
      index($list, $value):返回一个值在列表中的位置值。
列表函数中的每个函数都有其独特的作用与功能,接下来我们通过命令终端向大家展示每个列表函数的功能与使用。
2、length()函数主要用来返回一个列表中有几个值,简单点说就是返回列表清单中有多少个值

length(10px)
1
length(10px 20px (border 1px solid) 2em)
4
length(border 1px solid)
3

length() 函数中的列表参数之间使用空格隔开,不能使用逗号,否则函数将会出错
3、nth()函数   语法

nth($list,$n)

nth() 函数用来指定列表中某个位置的值。不过在 Sass 中,nth() 函数和其他语言不同,1 是指列表中的第一个标签值,2 是指列给

中的第二个标签值,依此类推。如:

nth(10px 20px 30px,1)
10px
nth((Helvetica,Arial,sans-serif),2)
“Arial”
nth((1px solid red) border-top green,1)

abs(-10)
10
>> abs(-10px)
10px
>> abs(-2em)
2em
>> abs(-.5%)
0.5%
>> abs(-1px / 2px)
0.5

.footer {
width:abs(-12.3px);
}
编译后的 css 代码:
.footer {
width: 12.3px;
}
10、min() 函数功能主要是在多个数之中找到最小的一个,这个函数可以设置任意多个参数:
>> min(1,2,1%,3,300%)
1%
>> min(1px,2,3px)
1px
>> min(1em,2em,6em)
1em
不过在 min()、max() 函数中同时出现两种不同类型的单位 max() 函数和 min() 函数一样,不同的是,max() 函数用来获取一系列数中的最大那个值: 11、random() 函数是用来获取一个随机数:
>> random()
0.03886
>> random()
0.66527
这是产生0-1的随机数
------------------ 三、Sass的函数功能-列表函数-------------------- 1、列表函数简介 列表函数主要包括一些对列表参数的函数使用,主要包括以下几种: length($list):返回一个列表的长度值; nth($list, $n):返回一个列表中指定的某个标签值 join($list1, $list2, [$separator]):将两个列给连接在一起,变成一个列表; append($list1, $val, [$separator]):将某个值放在列表的最后; zip($lists…):将几个列表结合成一个多维的列表; index($list, $value):返回一个值在列表中的位置值。 列表函数中的每个函数都有其独特的作用与功能,接下来我们通过命令终端向大家展示每个列表函数的功能与使用。 2、length()函数主要用来返回一个列表中有几个值,简单点说就是返回列表清单中有多少个值
>> length(10px)
1
>> length(10px 20px (border 1px solid) 2em)
4
>> length(border 1px solid)
3
length() 函数中的列表参数之间使用空格隔开,不能使用逗号,否则函数将会出错 3、nth()函数 语法
nth($list,$n)
nth() 函数用来指定列表中某个位置的值。不过在 Sass 中,nth() 函数和其他语言不同,1 是指列表中的第一个标签值,2 是指列给 中的第二个标签值,依此类推。如:
>> nth(10px 20px 30px,1)
10px
>> nth((Helvetica,Arial,sans-serif),2)
“Arial”
>> nth((1px solid red) border-top green,1)
(1px “solid” #ff0000)

注:在 nth($list,$n) 函数中的 $n 必须是大于 0 的整数:

nth((1px solid red) border-top green 1 ,0)
SyntaxError: List index 0 must be a non-zero integer for `nth’

4、join() 函数是将两个列表连接合并成一个列表。

join(10px 20px, 30px 40px)
(10px 20px 30px 40px)
join((blue,red),(#abc,#def))
(#0000ff, #ff0000, #aabbcc, #ddeeff)
join((blue,red),(#abc #def))
(#0000ff, #ff0000, #aabbcc, #ddeeff)

不过 join() 只能将两个列表连接成一个列表,但很多时候不只碰到两个列表连接成一个列表,这个时候就需要将多个 join() 函数合

并在一起使用

join((blue red), join((#abc #def),(#dee #eff)))
(#0000ff #ff0000 #aabbcc #ddeeff #ddeeee #eeffff)

5、append() 函数是用来将某个值插入到列表中,并且处于最末位

append(10px 20px ,30px)
(10px 20px 30px)
append((10px,20px),30px)
(10px, 20px, 30px)
append(green,red)
(#008000 #ff0000)
append(red,(green,blue))
(#ff0000 (#008000, #0000ff))

如果没有明确的指定 $separator 参数值,其默认值是 auto。
如果列表只有一个列表项时,那么插入进来的值将和原来的值会以空格的方式分隔。
如果列表中列表项是以空格分隔列表项,那么插入进来的列表项也将以空格分隔;
如果列表中列表项是以逗号分隔列表项,那么插入进来的列表项也将以逗号分隔;

当然,在 append() 函数中,可以显示的设置 $separator 参数,
如果取值为 comma 将会以逗号分隔列表项
如果取值为 space 将会以空格分隔列表项

append((blue green),red,comma)
(#0000ff, #008000, #ff0000)
append((blue green),red,space)
(#0000ff #008000 #ff0000)
append((blue, green),red,comma)
(#0000ff, #008000, #ff0000)
append((blue, green),red,space)
(#0000ff #008000 #ff0000)
append(blue,red,comma)
(#0000ff, #ff0000)
append(blue,red,space)
(#0000ff #ff0000)

6、zip()函数将多个列表值转成一个多维的列表:

zip(1px 2px 3px,solid dashed dotted,green blue red)
((1px “solid” #008000), (2px “dashed” #0000ff), (3px “dotted” #ff0000))
在使用zip()函数时,每个单一的列表个数值必须是相同的:

zip()函数中每个单一列表的值对应的取其相同位置值:
|--- List ---|--- nth(1) ---|--- nth(2) ---|--- nth(3) ---|
|------------|--------------|--------------|--------------|
|    List1   |      1px     |      2px     |      3px     |
|------------|--------------|--------------|--------------|
|    List2   |      solid   |      dashed  |     dotted   |
|------------|--------------|--------------|--------------|
|    List3   |      green   |      blue    |      red     |
|------------|--------------|--------------|--------------|
zip()函数组合出来就成了:

1px solid green, 2px dashed blue, 3px dotted red

7、index() 函数类似于索引一样,主要让你找到某个值在列表中所处的位置。在 Sass 中,第一个值就是1,第二个值就是 2

index(1px solid red, 1px)
1
index(1px solid red, solid)
2
index(1px solid red, red)
3
index(1px solid red,dotted) //列表中没有找到 dotted
false

8、Introspection 函数包括了几个判断型函数:

type-of($value):返回一个值的类型
unit($number):返回一个值的单位
unitless($number):判断一个值是否带有单位
comparable($number-1, $number-2):判断两个值是否可以做加、减和合并
9、Introspection 函数 -type-of()
type-of() 函数主要用来判断一个值是属于什么类型:
返回值:
number 为数值型。
string 为字符串型。
bool 为布尔型。
color 为颜色型

type-of(100)
“number”
type-of(100px)
“number”
type-of(“asdf”)
“string”
type-of(asdf)
zip(1px 2px 3px,solid dashed dotted,green blue red)
((1px “solid” #008000), (2px “dashed” #0000ff), (3px “dotted” #ff0000))
在使用zip()函数时,每个单一的列表个数值必须是相同的:
zip()函数中每个单一列表的值对应的取其相同位置值: |--- List ---|--- nth(1) ---|--- nth(2) ---|--- nth(3) ---| |------------|--------------|--------------|--------------| | List1 | 1px | 2px | 3px | |------------|--------------|--------------|--------------| | List2 | solid | dashed | dotted | |------------|--------------|--------------|--------------| | List3 | green | blue | red | |------------|--------------|--------------|--------------| zip()函数组合出来就成了:
1px solid green, 2px dashed blue, 3px dotted red
7、index() 函数类似于索引一样,主要让你找到某个值在列表中所处的位置。在 Sass 中,第一个值就是1,第二个值就是 2
>> index(1px solid red, 1px)
1
>> index(1px solid red, solid)
2
>> index(1px solid red, red)
3
>> index(1px solid red,dotted) //列表中没有找到 dotted
false
8、Introspection 函数包括了几个判断型函数: type-of($value):返回一个值的类型 unit($number):返回一个值的单位 unitless($number):判断一个值是否带有单位 comparable($number-1, $number-2):判断两个值是否可以做加、减和合并 9、Introspection 函数 -type-of() type-of() 函数主要用来判断一个值是属于什么类型: 返回值: number 为数值型。 string 为字符串型。 bool 为布尔型。 color 为颜色型
>> type-of(100)
“number”
>> type-of(100px)
“number”
>> type-of(“asdf”)
“string”
>> type-of(asdf)
“string”
type-of(true)
“bool”
type-of(false)
“bool”
type-of(#fff)
“color”
type-of(blue)
“color”
type-of(1 / 2 = 1)
“string”

10、unit() 函数主要是用来获取一个值所使用的单位,碰到复杂的计算时,其能根据运算得到一个“多单位组合”的值,不过只充许

乘、除运算:

unit(100)
“”
unit(100px)
“px”
unit(20%)
“%”
unit(1em)
“em”
unit(10px * 3em)
“em*px”
unit(10px / 3em)
“px/em”
unit(10px * 2em / 3cm / 1rem)
“em/rem”

但加、减碰到不同单位时,unit() 函数将会报错,除 px 与 cm、mm 运算之外:
11、unitless() 函数相对来说简单明了些,只是用来判断一个值是否带有单位,如果不带单位返回的值为 true,带单位返回的值为 

false:

unitless(100)
true
unitless(100px)
false
unitless(100em)
false
unitless(100%)
false
unitless(1 /2 )
true
unitless(1 /2 + 2 )
true
unitless(1px /2 + 2 )
false
用户在调用混合宏时,如果用户没有给参数值加上单位,程序会自动加入单位。

12、comparable() 函数主要是用来判断两个数是否可以进行“加,减”以及“合并”。如果可以返回的值为 true,如果不可以返回的

值是 false:

comparable(2px,1px)

true

comparable(2px,1%)

index(1px solid red, red)
3
>> index(1px solid red,dotted) //列表中没有找到 dotted
false
8、Introspection 函数包括了几个判断型函数: type-of($value):返回一个值的类型 unit($number):返回一个值的单位 unitless($number):判断一个值是否带有单位 comparable($number-1, $number-2):判断两个值是否可以做加、减和合并 9、Introspection 函数 -type-of() type-of() 函数主要用来判断一个值是属于什么类型: 返回值: number 为数值型。 string 为字符串型。 bool 为布尔型。 color 为颜色型
>> type-of(100)
“number”
>> type-of(100px)
“number”
>> type-of(“asdf”)
“string”
>> type-of(asdf)
“string”
>> type-of(true)
“bool”
>> type-of(false)
“bool”
>> type-of(#fff)
“color”
>> type-of(blue)
“color”
>> type-of(1 / 2 = 1)
“string”
10、unit() 函数主要是用来获取一个值所使用的单位,碰到复杂的计算时,其能根据运算得到一个“多单位组合”的值,不过只充许 乘、除运算:
>> unit(100)
“”
>> unit(100px)
“px”
>> unit(20%)
“%”
>> unit(1em)
“em”
>> unit(10px * 3em)
“em*px”
>> unit(10px / 3em)
“px/em”
>> unit(10px * 2em / 3cm / 1rem)
“em/rem”
但加、减碰到不同单位时,unit() 函数将会报错,除 px 与 cm、mm 运算之外: 11、unitless() 函数相对来说简单明了些,只是用来判断一个值是否带有单位,如果不带单位返回的值为 true,带单位返回的值为 false:
>> unitless(100)
true
>> unitless(100px)
false
>> unitless(100em)
false
>> unitless(100%)
false
>> unitless(1 /2 )
true
>> unitless(1 /2 + 2 )
true
>> unitless(1px /2 + 2 )
false
用户在调用混合宏时,如果用户没有给参数值加上单位,程序会自动加入单位。
12、comparable() 函数主要是用来判断两个数是否可以进行“加,减”以及“合并”。如果可以返回的值为 true,如果不可以返回的 值是 false:
>>
comparable(2px,1px)

true
>> comparable(2px,1%)
false
comparable(2px,1em)
false
comparable(2rem,1em)
false
comparable(2px,1cm)
true
comparable(2px,1mm)
true

comparable(2px,1rem)

false

comparable(2cm,1mm)
true

13、Miscellaneous 函数称为三元条件函数,主要因为他和 JavaScript 中的三元判断非常的相似。他有两个值,当条件成立返回一种

值,当条件不成立时返回另一种值:

if(true,1px,2px)
1px
if(false,1px,2px)
2px

14、map 常常被称为数据地图,也有人称其为数组,因为他总是以 key:value 成对的出现,但其更像是一个 JSON 数据。

$map: (
$key1: value1,
$key2: value2,
$key3: value3
首先有一个类似于 Sass 的变量一样,用个 $ 加上命名空间来声明 map。后面紧接是一个小括号 (),将数据以 key:value 的形式赋

予,其中 key 和 value 是成对出现,并且每对之间使用逗号 (,) 分隔,其中最后一组后面没有逗号。
)

在 Sass 中常用下面的方式定义变量:

$default-color: #fff !default;
$primary-color: #22ae39 !default;

我们使用 map 可以更好的进行管理:

$color: (
default: #fff,
primary: #22ae39
);

如果哪一天,你需要新增加颜色变量值,在 map 中可以非常随意的添加:

$color: (
default: #fff,
primary: #22ae39,
negative: #d9534f
);

map 的嵌套实用性也非常的强,大家可能有碰到过换皮肤的项目,可能每一套皮肤对应的颜色蛮多的,那么使用此功能来管理颜色的变

量就非常的有条理性,便于维护与管理。你可以这样使用:

$theme-color: (
default: (
bgcolor: #fff,
text-color: #444,
link-color: #39f
),
primary:(
bgcolor: #000,
text-color:#fff,
link-color: #93f
),
negative: (
bgcolor: #f36,
text-color: #fefefe,
link-color: #d4e
)
);

15、前面介绍了使用 map 来管理变量,但要在 Sass 中获取变量,或者对 map 做更多有意义的操作,我们必须借助于 map 的函数功

能。在 Sass 中 map 自身带了七个函数:
map-get($map,$key):根据给定的 key 值,返回 map 中相关的值。
map-merge($map1,$map2):将两个 map 合并成一个新的 map。
map-remove($map,$key):从 map 中删除一个 key,返回一个新 map。
map-keys($map):返回 map 中所有的 key。
map-values($map):返回 map 中所有的 value。
map-has-key($map,$key):根据给定的 key 值判断 map 是否有对应的 value 值,如果有返回 true,否则返回 false。
keywords($args):返回一个函数的参数,这个参数可以动态的设置 key 和 value。
16、map-get($map,$key) 函数的作用是根据 $key 参数,返回 $key 在 $map 中对应的 value 值。如果 $key 不存在 $map中,将返

回 null 值。此函数包括两个参数:
$map:定义好的 map。
$key:需要遍历的 key。
来看一个简单的示例,假设定义了一个 $social-colors 的 map:

$social-colors: (
dribble: #ea4c89,
facebook: #3b5998,
github: #171515,
google: #db4437,
twitter: #55acee
);

假设要获取 facebook 键值对应的值 #3b5998,我们就可以使用 map-get() 函数来实现:

.btn-dribble{
color: map-get($social-colors,facebook);
}

编译出来的CSS:

.btn-dribble {
color: #3b5998;
}

我们来看另一种情况,假设 $social-colors 这个 map 没有 $weibo 这个 key:

.btn-weibo{
font-size: 12px;
color: map-get($social-colors,weibo);
}

此时编译出来的是CSS:

.btn-weibo {
font-size: 12px;
}

从 编译出来的 CSS 可以得知,如果 $key 不在 $map 中,不会编译出 CSS,其实在 Sass 中,map-get($social- colors,weibo) 返

回了一个 null 值。但在编译出来的 CSS 中,你只知道他没有编译出样式,而且在命令终端编译时,也没有任何错误或者警告信息。

说实话,你并不知道他为什么编译不出来样式,或者说他已返回了值为 null。体验不强,也不好排错。其实如果我们自定义一个函数

,另外加个判断,那就截然不同。
17、map-has-key($map,$key) 函数将返回一个布尔值。当 $map 中有这个 $key,则函数返回 true,否则返回 false。
前面的示例,当 $key 不在 $map 中时,使用 map-get($map,$key) 函数将返回一个 null 值。但对于开发人员,并看不到任何提示信

息。如果使用 map-has-key($map,$key) 函数就可以改变这一状态。
http://www.imooc.com/code/8457
18、map-keys($map) 函数将会返回 $map 中的所有 key。这些值赋予给一个变量,那他就是一个列表。如:

map-keys($social-colors);

其返回值为:

“dribble”,”facebook”,”github”,”google”,”twitter”

18、map-values($map) 函数类似于 map-keys($map) 功能,不同的是 map-values($map )获取的是 $map 的所有 value 值,可以说也

将是一个列表。而且,map-values($map) 中如果有相同的 value 也将会全部获取出来。

map-values($social-colors)

将会返回:

ea4c89,#3b5998,#171515,#db4437,#55acee

19、map-merge($map1,$map2) 函数是将 $map1 和 $map2 合并,然后得到一个新的 $map。如果你要快速将新的值插入到 $map 中的话

,这种方法是最佳方法。假设我们有两个 $map:

$color: (
text: #f36,
link: #f63,
border: #ddd,
backround: #fff
);
$typo:(
font-size: 12px,
line-height: 1.6
);

如果希望将这两个 $map 合并成一个 map,我们只要这样做:

$newmap: map-merge($color,$typo);

将会生成一个新的 map:

$newmap:(
text: #f36,
link: #f63,
border: #ddd,
background: #fff,
font-size: 12px,
line-height: 1.6
);

这样你就可以借助 map-get( ) 等函数做其他事情了。

不过有一点需要注意,如果 $map1 和 $map2 中有相同的 $key 名,那么将 $map2 中的 $key 会取代 $map1 中的
20、map-remove($map,$key) 函数是用来删除当前 $map 中的某一个 $key,从而得到一个新的 map。其返回的值还是一个 map。他并

不能直接从一个 map 中删除另一个 map,仅能通过删除 map 中的某个 key 得到新 map。如:

$map:map-remove($social-colors,dribble);

返回的是一个新 map:

$map:(
facebook: #3b5998,
github: #171515,
google: #db4437,
twitter: #55acee
);

如果删除的 key 并不存在于 $map 中,那么 map-remove() 函数返回的新 map 和以前的 map 一样。
21、keywords($args) 函数可以说是一个动态创建 map 的函数。可以通过混合宏或函数的参数变创建 map。参数也是成对出现,其中 

$args 变成 key(会自动去掉$符号),而 $args 对应的值就是value。

@mixin map($args…){
@debug keywords($args);
}

@include map(
$dribble: #ea4c89,
$facebook: #3b5998,
$github: #171515,
$google: #db4437,
$twitter: #55acee
);

在命令终端可以看到一个输入的 @debug 信息:

DEBUG: (dribble: #ea4c89, facebook: #3b5998, github: #171515, google: #db4437, twitter: #55acee)

-----------------------------四、Sass的函数功能-颜色函数 ---------------------------
1、RGB颜色函数
RGB 颜色只是颜色中的一种表达式,其中 R 是 red 表示红色,G 是 green 表示绿色而 B 是 blue 表示蓝色。在 Sass 中为 RGB 颜色提供六种函数:
rgb($red,$green,$blue):根据红、绿、蓝三个值创建一个颜色;
rgba($red,$green,$blue,$alpha):根据红、绿、蓝和透明度值创建一个颜色;
red($color):从一个颜色中获取其中红色值;
green($color):从一个颜色中获取其中绿色值;
blue($color):从一个颜色中获取其中蓝色值;
mix($color-1,$color-2,[$weight]):把两种颜色混合在一起。
仅从概念上,或许大家没有太多的概念,我们通过下面的命令来做一个简单的测试:

$ sass -i

rgb(200,40,88) //根据r:200,g:40,b:88计算出一个十六进制颜色值

c82858

rgba(#c82858,.65) //根据#c82858的65%透明度计算出一个rgba颜色值
rgba(200, 40, 88, 0.65)
red(#c82858) //从#c82858颜色值中得到红色值 200
200
green(#c82858) //从#c82858颜色值中得到绿色值 40
40
blue(#c82858) //从#c82858颜色值中得到蓝色值 88
88
mix(#c82858,rgba(200,40,80,.65),.3) //把#c82858和rgba(200,40,88,.65) 两颜色按比例混合得到一个新颜色
rgba(200, 40, 80, 0.65105)

2、red() 函数非常简单,其主要用来获取一个颜色当中的红色值。假设有一个 #f36 的颜色,如果你想得到 #f36 中的 red 值是多少,这个时候使用 red() 函数就能很简单获取。

red(#f36)
255

得到的值是”255”。(注意:在命令终端要先输入sass -i 命令)
3、green() 函数和 red() 函数一样,用来获取某一个颜色值中 green 的值。同样拿 ”#f36“ 颜色为例:

green(#f36)
51

4、blue() 函数是用来获取某一个颜色值中 blue 的值,如:

blue(#f36)
102

5、Mix 函数是将两种颜色根据一定的比例混合在一起,生成另一种颜色。其使用语法如下:

mix($color-1,$color-2,$weight);

$color-1 和 $color-2 指的是你需要合并的颜色,颜色可以是任何表达式,也可以是颜色变量。
$weight 为 合并的比例(选择权重),默认值为 50%,其取值范围是 0~1 之间。它是每个 RGB 的百分比来衡量,当然透明度也会有一定的权重。默认的比例是 50%,这意味着两个颜色各占一半,如果指定的比例是 25%,这意味着第一个颜色所占比例为 25%,第二个颜色所占比例为75%。

mix(#f00, #00f) => #7f007f
mix(#f00, #00f, 25%) => #3f00bf
mix(rgba(255, 0, 0, 0.5), #00f) => rgba(63, 0, 191, 0.75)

6、关于 HSL 的颜色函数,以供大家使用,其中常用的有 saturation、lightness、adjust-hue、lighten、darken 等等。接下来我们先来了解一下 HSL 颜色函数包括哪些具体的函数,所起的作用是什么:
hsl($hue,$saturation,$lightness):通过色相(hue)、饱和度(saturation)和亮度(lightness)的值创建一个颜色;
hsla($hue,$saturation,$lightness,$alpha):通过色相(hue)、饱和度(saturation)、亮度(lightness)和透明(alpha)的值创建一个颜色;
hue($color):从一个颜色中获取色相(hue)值;
saturation($color):从一个颜色中获取饱和度(saturation)值;
lightness($color):从一个颜色中获取亮度(lightness)值;
adjust-hue($color,$degrees):通过改变一个颜色的色相值,创建一个新的颜色;
lighten($color,$amount):通过改变颜色的亮度值,让颜色变亮,创建一个新的颜色;
darken($color,$amount):通过改变颜色的亮度值,让颜色变暗,创建一个新的颜色;
saturate($color,$amount):通过改变颜色的饱和度值,让颜色更饱和,从而创建一个新的颜色
desaturate($color,$amount):通过改变颜色的饱和度值,让颜色更少的饱和,从而创建出一个新的颜色;
grayscale($color):将一个颜色变成灰色,相当于desaturate($color,100%);
complement($color):返回一个补充色,相当于adjust-hue($color,180deg);
invert($color):反回一个反相色,红、绿、蓝色值倒过来,而透明度不变。

同样在你的终端,通过 sass -i 来对上面的各个函数做一个简单测试:

hsl(200,30%,60%) //通过h200,s30%,l60%创建一个颜色

7aa3b8

hsla(200,30%,60%,.8)//通过h200,s30%,l60%,a80%创建一个颜色
rgba(122, 163, 184, 0.8)

hue(#7ab)//得到#7ab颜色的色相值
195deg

saturation(#7ab)//得到#7ab颜色的饱和度值
33.33333%

lightness(#7ab)//得到#7ab颜色的亮度值
60%

adjust-hue(#f36,150deg) //改变#f36颜色的色相值为150deg

33ff66

lighten(#f36,50%) //把#f36颜色亮度提高50%

ffffff

darken(#f36,50%) //把#f36颜色亮度降低50%

33000d

saturate(#f36,50%) //把#f36颜色饱和度提高50%

ff3366

desaturate(#f36,50%) //把#f36颜色饱和度降低50%

cc667f

grayscale(#f36) //把#f36颜色变成灰色

999999

complement(#f36)

33ffcc

invert(#f36)

00cc99

在 HSL 函数中,hsl() 和 hsla() 函数主要是通过颜色的 H、S、L 或者 A 几个参数获取一个 rgb 或 rgba 表达的颜色,这两个函数与 CSS 中的无太大区别,只是使用这两个函数能帮助您知道颜色的十六进制表达式和 rgba 表达式。

而 hue()、saturation() 和 lightness() 函数主要是用来获取指定颜色中的色相值、饱和度和亮度值。对于颜色表达没有太多的实际作用。

HSL 函数中最常见的应该是 lighten()、darken()、saturate()、desaturate()、grayscale()、complement()和 invert() 几个函数。接下来,我们针对这几个函数来做进一步的了解与学习。
7、lighten() 和 darken() 两个函数都是围绕颜色的亮度值做调整的,其中 lighten() 函数会让颜色变得更亮,与之相反的 darken() 函数会让颜色变得更暗。这个亮度值可以是 0~1 之间,不过常用的一般都在 3%~20% 之间。
来看一个简单的实例,首先定义一个颜色变量:

$baseColor: #ad141e;

使用 lighten() 和 darken() 函数来修改 10% 的亮度值:

//SCSS
.lighten {
background: lighten($baseColor,10%);
}
.darken{
background: darken($baseColor,10%);
}

编译出来的 css 代码:

//CSS
.lighten {
background: #db1926;
}

.darken {
background: #7f0f16;
}

8、saturate()、desaturate()这两个函数是通过改变颜色的饱和度来得到一个新的颜色,他们和前面介绍的修改亮度得到新颜色的方法非常相似。

//SCSS
$baseColor: #ad141e;
.saturate {
background: saturate($baseColor,30%); //在原色饱和度基础上增加饱和度
}
.desaturate {
background: desaturate($baseColor,30%);//在原色饱和度基础上减少饱和度
}

编译出来的 css 代码:

//CSS
.saturate {
background: #c1000d;
}

.desaturate {
background: #903137;
}

9、HSL函数-adjust-hue()函数  这个是通过调整颜色的色相换算一个新颜色。他需要一个颜色和色相度数值。通常这个度数值是在 -360deg 至 360deg 之间,当然了可以是百分数:

//SCSS
$baseColor: #ad141e;
.adjust-hue-deg {
background: adjust-hue($baseColor,30deg);
}
.adjust-hue-per {
background: adjust-hue($baseColor,30%);
}

编译出来的代码

//CSS
.adjust-hue-deg {
background: #ad5614;
}

.adjust-hue-per {
background: #ad5614;
}

10、HSL函数-grayscale()函数  这个函数会颜色的饱和度值直接调至 0%,所以此函数与 desaturate($color,100%) 所起的功能是一样的。一般这个函数能将彩色颜色转换成不同程度的灰色

//SCSS
$baseColor: #ad141e;
.grayscale {
background: grayscale($baseColor);
}
.desaturate {
background: desaturate($baseColor,100%);
}

//CSS
.grayscale {
background: #616161;
}

.desaturate {
background: #616161;
}

11、Opacity函数简介
Opacity函数简介
在 CSS 中除了可以使用 rgba、hsla 和 transform 来控制颜色透明度之外,还可以使用 opacity 来控制,只不过前两者只是针对颜色上的透明通道做处理,而后者是控制整个元素的透明度。
在 Sass 中,也提供了系列透明函数,只不过这系列的透明函数主要用来处理颜色透明度:
      alpha($color) /opacity($color):获取颜色透明度值;
      rgba($color, $alpha):改变颜色的透明度值;
      opacify($color, $amount) / fade-in($color, $amount):使颜色更不透明;
      transparentize($color, $amount) / fade-out($color, $amount):使颜色更加透明。
12、Opacity函数-alpha()、opacity()函数
alphpa() 和 opacity() 函数很简单,与前面介绍的 red(),green() 等函数很类似。这个函数的主要功能是用来获取一个颜色的透明度值。如果颜色没有特别指定透明度,那么这两个函数得到的值都会是 1:

alpha(red)
1
alpha(rgba(red,.8))
0.8
opacity(red)
1
opacity(rgba(red,.8))
0.8

13、Opacity函数-rgba()函数
在前面介绍 RGB 函数一节中,还记得吗?有一个 rgba() 函数可以创建一个颜色,同时还可以对颜色修改其透明度。其可以接受两个参数,第一个参数为颜色,第二个参数是你需要设置的颜色透明值。

rgba(red,.5)
rgba(255, 0, 0, 0.5)
rgba(#dedede,.5)
rgba(222, 222, 222, 0.5)
rgba(rgb(34,45,44),.5)
rgba(34, 45, 44, 0.5)
rgba(rgba(33,45,123,.2),.5)
rgba(33, 45, 123, 0.5)
rgba(hsl(33,7%,21%),.5)
rgba(57, 54, 50, 0.5)
rgba(hsla(33,7%,21%,.9),.5)
rgba(57, 54, 50, 0.5)

14、Opacity函数-opacify()、fade-in()函数
这两个函数是用来对已有颜色的透明度做一个加法运算,会让颜色更加不透明。其接受两个参数,第一个参数是原始颜色,第二个参数是你需要增加的透明度值,其取值范围主要是在 0~1 之间。当透明度值增加到大于 1 时,会以 1 计算,表示颜色不具有任何透明度。

opacify(rgba(22,34,235,.6),.2)
rgba(22, 34, 235, 0.8)
opacify(rgba(22,34,235,.6),.5)

1622eb

opacify(hsla(22,34%,23%,.6),.15)
rgba(79, 53, 39, 0.75)
opacify(hsla(22,34%,23%,.6),.415)

4f3527

opacify(red,.15)

ff0000

opacify(#89adde,.15)

89adde

fade-in(rgba(23,34,34,.5),.15)
rgba(23, 34, 34, 0.65)
fade-in(rgba(23,34,34,.5),.615)

172222

15、Opacity函数-transparentize()、 fade-out()函数
transparentize() 和 fade-out() 函数所起作用刚好与 opacify() 和 fade-in() 函数相反,让颜色更加的透明。这两个函数会让透明值做减法运算,当计算出来的结果小于 0 时会以 0 计算,表示全透明。

transparentize(red,.5)
rgba(255, 0, 0, 0.5)
transparentize(#fde,.9)
rgba(255, 221, 238, 0.1)
transparentize(rgba(98,233,124,.3),.11)
rgba(98, 233, 124, 0.19)
transparentize(rgba(98,233,124,.3),.51)
rgba(98, 233, 124, 0)
fade-out(red,.9)
rgba(255, 0, 0, 0.1)
fade-out(hsla(98,6%,23%,.5),.1)
rgba(58, 62, 55, 0.4)
fade-out(hsla(98,6%,23%,.5),.6)
rgba(58, 62, 55, 0)

16、颜色函数实战——七色卡

http://www.imooc.com/code/8429


-------------------------五、 Sass 的 @ 规则 ------------------------
1、@import
Sass 支持所有 CSS3 的 @ 规则, 以及一些 Sass 专属的规则,也被称为“指令(directives)”。 这些规则在 Sass 中具有不同的

功效,详细解释如下。
Sass 扩展了 CSS 的 @import 规则,让它能够引入 SCSS 和 Sass 文件。 所有引入的 SCSS 和 Sass 文件都会被合并并输出一个单一

的 CSS 文件。 另外,被导入的文件中所定义的变量或 mixins 都可以在主文件中使用。

Sass 会在当前目录下寻找其他 Sass 文件, 如果是 Rack、Rails 或 Merb 环境中则是 Sass 文件目录。 也可以通过 :load_paths 

选项或者在命令行中使用 --load-path 选项来指定额外的搜索目录。

@import 根据文件名引入。 默认情况下,它会寻找 Sass 文件并直接引入, 但是,在少数几种情况下,它会被编译成 CSS 的 

@import 规则:

如果文件的扩展名是 .css。
如果文件名以 http:// 开头。
如果文件名是 url()。
如果 @import 包含了任何媒体查询(media queries)。
如果上述情况都没有出现,并且扩展名是 .scss 或 .sass, 该名称的 Sass 或 SCSS 文件就会被引入。 如果没有扩展名, Sass 将

试着找出具有 .scss 或 .sass 扩展名的同名文件并将其引入。

@import “foo.scss”;
@import “foo”;

两者都将引入 foo.scss 文件, 而

@import “foo.css”;
@import “foo” screen;
@import “http://foo.com/bar“;
@import url(foo);

将被编译为:

@import “foo.css”;
@import “foo” screen;
@import “http://foo.com/bar“;
@import url(foo);

也可以通过一个 @import 引入多个文件。例如:

@import “rounded-corners”, “text-shadow”;

将引入 rounded-corners 和 text-shadow 两个文件。
如果你有一个 SCSS 或 Sass 文件需要引入, 但是你又不希望它被编译为一个 CSS 文件, 这时,你就可以在文件名前面加一个下划

线,就能避免被编译。 这将告诉 Sass 不要把它编译成 CSS 文件。 然后,你就可以像往常一样引入这个文件了,而且还可以省略掉

文件名前面的下划线。
例如,你有一个文件叫做 _colors.scss。 这样就不会生成 _colors.css 文件了, 而且你还可以这样做:
@import "colors";//不用加下划线
注意,在同一个目录不能同时存在带下划线和不带下划线的同名文件。 例如, _colors.scss 不能与 colors.scss 并存。
嵌套 @import
虽然大部分时间只需在顶层文件使用 @import 就行了, 但是,你还可以把他们包含在 CSS 规则 和 @media 规则中。
来看官网提供的一个简单示例:
假设要引入的样式文件`example.scss`文件中包含这样的代码:

.example {
color: red;
}

然后这样引用:

main {

@import “example”;
}

编译出来的css

main .example {

color: red;
}

2、@media  Sass 中的 @media 指令和 CSS 的使用规则一样的简单,但它有另外一个功能,可以嵌套在 CSS 规则中。有点类似 JS 的

冒泡功能一样,如果在样式中使用 @media 指令,它将冒泡到外面。来看一个简单示例:

.sidebar {
width: 300px;
@media screen and (orientation: landscape) {
width: 500px;
}
}

编译出来:

.sidebar {
width: 300px; }
@media screen and (orientation: landscape) {
.sidebar {
width: 500px; }

@media 也可以嵌套 @media:

@media screen {
.sidebar {
@media (orientation: landscape) {
width: 500px;
}
}
}

此时编译出来:

@media screen and (orientation: landscape) {
.sidebar {
width: 500px; } }

在使用 @media 时,还可以使用插件#{}:

$media: screen;
$feature: -webkit-min-device-pixel-ratio;
$value: 1.5;

@media #{$media} and ($feature: $value) {
.sidebar {
width: 500px;
}
}

编译出来的css

@media screen and (-webkit-min-device-pixel-ratio: 1.5) {
.sidebar {
width: 500px; } }

 3、@extend
Sass 中的 @extend 是用来扩展选择器或占位符。比如:

.error {
border: 1px #f00;
background-color: #fdd;
}
.error.intrusion {
background-image: url(“/image/hacked.png”);
}
.seriousError {
@extend .error;
border-width: 3px;
}

被编译成:

.error, .seriousError {
border: 1px #f00;
background-color: #fdd; }

.error.intrusion, .seriousError.intrusion {
background-image: url(“/image/hacked.png”); }

.seriousError {
border-width: 3px; }

扩展选择器:

@extend 不止扩展类选择器,还可以扩展任何选择器,比如 .special.cool, a:hover, 或 a.user[href^=“http://“],例如:

.hoverlink {
@extend a:hover;
}
a:hover {
text-decoration: underline;
}

编译出来:

a:hover, .hoverlink {
text-decoration: underline; }

多个扩展

所设某个样式要继承多个地方的样式,那么可以使用 @extend 来继承多个选择器或占位符的样式,如:

.error {
border: 1px #f00;
background-color: #fdd;
}
.attention {
font-size: 3em;
background-color: #ff0;
}
.seriousError {
@extend .error;
@extend .attention;
border-width: 3px;
}

编译出来的CSS

.error, .seriousError {
border: 1px #f00;
background-color: #fdd; }

.attention, .seriousError {
font-size: 3em;
background-color: #ff0; }

.seriousError {
border-width: 3px; }

扩展单一选择器

前面我们知道 %placeholder 不使用@extend显示调用是不会生成任何样式代码。那么在选择器中使用占位符一样。比如下面的代码:

context a%extreme {

color: blue;
font-weight: bold;
font-size: 2em;
}

这段代码在不调用之前不产生任何代码,只有能过@extend调用之后才生成代码:

.notice {
@extend %extreme;
}

编译出来的CSS

context a.notice {

color: blue;
font-weight: bold;
font-size: 2em;
}

4、@at-root
@at-root 从字面上解释就是跳出根元素。当你选择器嵌套多层之后,想让某个选择器跳出,此时就可以使用 @at-root。来看一个简单

的示例:

.a {
color: red;

.b {
color: orange;

.c {
  color: yellow;

  @at-root .d {
    color: green;
  }
}

}
}

编译出来的css

.a {
color: red;
}

.a .b {
color: orange;
}

.a .b .c {
color: yellow;
}

.d {
color: green;
}

5、@debug 在 Sass 中是用来调试的,当你的在 Sass 的源码中使用了 @debug 指令之后,Sass 代码在编译出错时,在命令终端会输

出你设置的提示 Bug:

@debug 10em + 12em;

会输出

Line 1 DEBUG: 22em

6、@warn 和 @debug 功能类似,用来帮助我们更好的调试 Sass。如:

@mixin adjust-location($x, $y) {
@if unitless($x) {//unitless是内置函数,判断数值是否有“单位”
@warn “Assuming #{$x} to be in pixels”;
$x: 1px * $x;
}
@if unitless($y) {
@warn “Assuming #{$y} to be in pixels”;
$y: 1px * $y;
}
position: relative; left: $x; top: $y;
}

.botton{
@include adjust-location(20px, 30);
}

WARNING: Assuming 30 to be in pixels

     on line 7 of ./8805/9jDF/index.scss, in `adjust-location'

     from line 16 of ./8805/9jDF/index.scss

.botton {

position: relative;

left: 20px;

top: 30px; }

7、@error
@error 和 @warn、@debug 功能是如出一辙。

@mixin error($x){
@if $x < 10 {
width: $x * 10px;
} @else if $x == 10 {
width: $x;
} @else {
@error “你需要将#{$x}值设置在10以内的数”;
}

}

.test {
@include error(15);
}

编译的时候

你需要将15值设置在10以内的数 on line 7 at column 5

    原文作者:夜幕小草
    原文地址: https://www.jianshu.com/p/bd2b221260b8
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞