sass学习--sass的函数功能(进阶篇)

Posted 马灿发

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sass学习--sass的函数功能(进阶篇)相关的知识,希望对你有一定的参考价值。

1.字符串功能:

  • unquote($string):删除字符串中的引号;
  • quote($string):给字符串添加引号;
  • To-upper-case($string):将字符串小写字母转换为大写字母
  • To-lower-case($string):将字符串大写字母转换为小写字母

unquote($string):

//sass:unquote($string)
.test2 {
    content: unquote("‘Hello Sass!");
}
.test3 {
    content: unquote("I‘m Web Designer");
}
.test4 {
    content: unquote("‘Hello Sass!‘");
}
.test5 {
    content: unquote(‘"Hello Sass!"‘);
}
//css
.test2 {
  content: ‘Hello Sass!; }

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

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

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

注意: unquote( ) 函数只能删除字符串最前和最后的引号(双引号或单引号),而无法删除字符串中间的引号。如果字符没有带引号,返回的将是字符串本身。

quote($string):


//SCSS
.test1 {
    content:  quote(‘Hello Sass!‘);
}
.test2 {
    content: quote("Hello Sass!");
}

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

quote() 函数用来给字符串添加引号。如果字符串,自身带有引号会统一换成双引号 “”。

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

.test1 {
    content:  quote(Hello Sass);//字符串中间有空格,编译报错
}

//解决方案
.test1 {
    content:  quote(HelloSass);//去空格
}
.test1 {
    content:  quote("Hello Sass");//加引号
}

注意:quote() 碰到特殊符号,比如: !、?、> 等,除中折号 - 和 下划线_ 都需要使用双引号括起,否则编译时也会报错!

To-upper-case($sting):

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

To-lower-case($string):

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

2.数字函数

  • percentage($value):将不带单位的数转换成百分比值;
  • round($value):将数值四舍五入,转换成一个最接近的整数;
  • ceil($value):向上取整;
  • floor($value):向下取整;
  • abs($value):取数的绝对值;
  • min($numbers…):找出几个数值之间的最小值;
  • max($numbers…):找出几个数值之间的最大值;
  • random(): 获取随机数

percentage($value):

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

round($number):

>> round(12.3)
12
>> round(12.5)
13
>> round(20%)
20%
>> round(2.2%)
2%
>> round(2px / 3px)
1
>> round(1px / 3px)
0

ceil($number):向上取整

>> 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

floor($number):向下取整

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

abs($number):取绝对值

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

min($List):取多个数值中最小的

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

max($list):取最大

>> max(1,5)
5
>> max(1px,5px)
5px

random([$limit]):取随机数

>> random()
0.03886
>> random(200)
174

3.列表函数

  • length($list):返回一个列表的长度值;
  • nth($list, $n):返回一个列表中指定的某个标签值;
  • join($list1, $list2, [$separator]):将两个列给连接在一起,变成一个列表;
  • append($list1, $val, [$separator]):将某个值放在列表的最后;
  • zip($lists…):将几个列表结合成一个多维的列表;
  • index($list, $value):返回一个值在列表中的位置值。

length($list): 函数中的列表参数之间使用空格隔开,不能使用逗号,否则函数将会出错:

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

nth($list,$n):返回一个列表中指定的某个标签值


>> nth(10px 20px 30px,1)
10px
>> nth((Helvetica,Arial,sans-serif),2)
"Arial"
>> nth((1px solid red) border-top green,1)
(1px "solid" #ff0000)

join($list1, $list2, [$separator]) :只能将两个列表连接成一个列表,如果直接连接两个以上的列表将会报错。

>> join(10px 20px, 30px 40px)
(10px 20px 30px 40px)

>> join((blue,red),(#abc,#def))
(#0000ff, #ff0000, #aabbcc, #ddeeff)

//多个列表连接,需要将多个join()函数合并在一起使用:
>> join((blue red), join((#abc #def),(#dee #eff)))
(#0000ff #ff0000 #aabbcc #ddeeff #ddeeee #eeffff)

除此之外,还有很特别的参数$separator,用来指定列表连接之间的分隔符的,默认为auto,还有comma(逗号)和space(空格)

$separator重要性:请明确指定$separator的值,否则将会有多种情形发生!为避免血案发生,还是明确指定$separator的值吧!

append($list[,$separtator]):

>> 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)

zip($list…): 每个单一的列表个数必须是相同的

zip(1px 2px 3px,solid dashed dotted,green blue red)

index($index,$value):返回一个值在列表中的位置值

>> index(1px solid red, 1px)
1
>> index(1px solid red, solid)
2
>> index(1px solid red, red)
3

4.Introspection函数: 主要用来对值做一个判断

  • type-of($value):返回一个值的类型;
  • unit($number):返回一个值的单位;
  • unitless($number):判断一个值是否带有单位;
  • comparable($number-1, $number-2):判断两个值是否可以做加、减和合并.

type-of($value):返回一个值的类型

总共有number、string、bool、color四种类型!

unit()函数:返回一个值的单位

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

>> unit(100)
""
>> unit(100px)
"px"
>> unit(20%)
"%"
>> unit(1em)
"em"
>> unit(10px * 3em)
"em*px"
>> unit(10px / 3em)//但这种无法合并的单位在css中是没有意义的
"px/em"
>> unit(10px * 2em / 3cm / 1rem)
"em/rem"

注意:加、减碰到不同单位时,unit() 函数将会报错除 px 与 cm、mm 运算之外,jianren就是矫情!

>> unit(1px + 1cm)
"px"
>> unit(1px - 1cm)
"px"
>> unit(1px + 1mm)
"px"
>> unit(10px * 2em - 3cm / 1rem)
SyntaxError: Incompatible units: ‘cm‘ and ‘px*em‘.
>> unit(10px * 2em - 1px / 1rem)
SyntaxError: Incompatible units: ‘‘ and ‘em‘.
>> unit(1px - 1em)
SyntaxError: Incompatible units: ‘em‘ and ‘px‘.
>> unit(1px - 1rem)
SyntaxError: Incompatible units: ‘rem‘ and ‘px‘.
>> unit(1px - 1%)
SyntaxError: Incompatible units: ‘%‘ and ‘px‘.
>> unit(1cm + 1em)
SyntaxError: Incompatible units: ‘em‘ and ‘cm‘.

unitless($number)函数:只是用来判断一个值是否带有单位,如果不带单位返回的值为 true带单位返回的值为 false

>> unitless(100)
true
>> unitless(100px)
False

用例:用户在调用混合宏时,如果用户没有给参数值加上单位,程序会自动加入单位

//用例:用户在调用混合宏时,如果用户没有给参数值加上单位,程序会自动加入单位
@mixin adjust-location($x, $y) {
  @if unitless($x) {    
    $x: 1px * $x;
  }
  @if unitless($y) {    
    $y: 1px * $y;
  }
  position: relative; 
  left: $x; 
  top: $y;
}

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

comparable($number-1,$number-2): 主要是用来判断两个数是否可以进行“加,减”以及“合并”。如果可以返回的值为 true,如果不可以返回的值是 false

>>comparable(2px,1px)
true
>> comparable(2px,1%)
False

5.Miscellaneous函数:

Miscellaneous 函数称为三元条件函数,他有两个值,当条件成立返回一种值,当条件不成立时返回另一种值:

if($condition,$if-true,$if-false)

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

6.Maps的函数

6-1Maps的用途:管理变量

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

$map: (
$key1: value1,
$key2: value2,
$key3: value3
)

注意:用个 $ 加上命名空间来声明 map。后面紧接是一个小括号 (),将数据以 key:value 的形式赋予,其中 key 和 value 是成对出现,并且每对之间使用逗号 (,) 分隔,其中最后一组后面没有逗号

//以前常用方法定义变量:
$default-color: #fff !default;
$primary-color: #22ae39 !default;

//现在可以更好的管理变量:(可以随意添加变量)
$color: (
    default: #fff,
    primary: #22ae39
);

还可让 map 嵌套 map。其实就是 map 的某一个 key 当成 map,里面可以继续放一对或者多对 key:value:

$map: (
    key1: value1,
    key2: (
        key-1: value-1,
        key-2: value-2,
    ),
    key3: value3
);

使用场景:在换皮肤的项目,可能每一套皮肤对应的颜色蛮多的,那么使用此功能来管理颜色的变量就非常的有条理性,便于维护与管理。

$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
    )
);

6-2Maps的七大函数:

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

6-2-1.map-get($map,$key): 依给定的 key 值,返回 map 中相关的value 值。如果 $key 不存在 $map中,将返回 null 值。

$social-colors: (
    dribble: #ea4c89,
    facebook: #3b5998,
    github: #171515,
    google: #db4437,
    twitter: #55acee
);
.btn-dribble{
  color: map-get($social-colors,facebook);
}

如果 $key 不在 $map 中,不会编译出 CSS,在 Sass 中,map-get($social- colors,weibo) 返回了一个 null 值。
没有编译出样式,也没有任何错误或者警告信息,体验不强,也不好排错。其实如果我们自定义一个函数,另外加个判断,那就截然不同,看下面函数!

6-2-2.map-has-key($map,$key): 根据给定的 key 值判断 map 是否有对应的 value 值,如果有返回 true,否则返回 false。

$map 中有这个 $key,则函数返回 true,否则返回 false。可使用 map-has-key($map,$key) 函数就可以改变map-get($map,$key)不编译也不报错的状态。

@if map-has-key($social-colors,facebook){
    .btn-facebook {
        color: map-get($social-colors,facebook);
    }
} @else {
    @warn "No color found for faceboo in $social-colors map. Property ommitted."
}
//但为提高效率,不每次都编写相同的代码,可定义函数实现:
@function colors($color){
    @if not map-has-key($social-colors,$color){
        @warn "No color found for `#{$color}` in $social-colors map. Property omitted.";
    }
    @return map-get($social-colors,$color);
}
.btn-dribble {
    color: colors(dribble);
}
.btn-facebook {
    color: colors(facebook);
}
//对于上面的实现,也可加行@each来实现:
@each $social-network,$social-color in $social-colors {
    .btn-#{$social-network} {
        color: colors($social-network);
    }
}

6-2-3.map-keys($map):返回$map中的所有key,结果为一个列表。

@function colors($color){
    $names: map-keys($social-colors);
    @if not index($names,$color){
        @warn "Waring: `#{$color} is not a valid color name.`";
    }
    @return map-get($social-colors,$color);
}
.btn-weibo{
    color: colors(weibo);
}
//也可以使用@each@for遍历所有值

@each $name in map-keys($social-colors){
    .btn-#{$name}{
        color: colors($name);
    }
}
@for $i from 1 through length(map-keys($social-colors)){
    .btn-#{nth(map-keys($social-colors),$i)} {
        color: colors(nth(map-keys($social-colors),$i));
    }
}

6-2-4.map-values($map):返回所有的value值,也是一个列表

6-2-5.map-merge($map1,$map2):将两个map合并,得到新的map。

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

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

注意:若$map1和$map2中有相同的$key,$map2中的$key将会取代$map1中的。

6-2-6map-remove(map,key):

用来删除当前 $map 中的某一个 $key,从而得到一个新的 map。其返回的值还是一个 map。若$map中不存在要删除的$key,则返回的新map和之前的map一样。

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

6-2-7 keywords($args…)

动态创建map 的函数。可通过混合宏或函数的参数创建map。参数需成堆出现。

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

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

7.颜色函数:

三大方向:RGB、HSL、Opacity三大函数!和其他的颜色函数!

rgb($red,$green,$blue):
rgba($red,$green,$blue,$alpha):
red($color):
green($color):
blue($color):
mix($color-1,$color-2,[$weight]):
    hsl($hue,$saturation,$lightness)
    hsla($hue,$saturation,$lightness,$alpha)
    hue($color)
    saturation($color)
    lightness($color)
    adjust-hue($color,$degrees)
    lighten($color,$amount)
    darken($color,$amount)
    saturate($color,$amount)
    desaturate($color,$amount)
    grayscale($color)
    complement($color)
    invert($color)
      alpha($color) /opacity($color)
      rgba($color, $alpha)
      opacify($color, $amount) / fade-in($color, $amount)
      transparentize($color, $amount) / fade-out($color, $amount)

实战:(-?-;)我只知道可以用它制作七色卡之类的东西,望赐教!


总结:罗列了sass繁杂的函数功能:字符串、数字函数、列表函数、Introspection函数(判断值)、Miscelloneous(三元条件函数)、Maps函数、颜色函数等七个大块!可谓是左宜右有啊!(形容多才多艺,什么都能做)(●’?’●)人丑就该多读书!

以上是关于sass学习--sass的函数功能(进阶篇)的主要内容,如果未能解决你的问题,请参考以下文章

Sass学习笔记之入门篇

Sass 基础教程——基本介绍

Sass 基础教程——基本介绍

Sass 基础教程——基本介绍

Sass 基础教程——基本介绍

sass的函数简介