SASS进阶1

2015年10月21日

@if

@if指令是一个SassScript,它可以根据条件来处理样式块,如果条件为true返回一个样式块,反之false返回另一个样式块。在Sass中除了@if之外,还可以配合@else if 和 @else 一起使用。

假设要控制一个元素隐藏或显示,我们可以定义一个混合宏,通过@if...@else...来判断传进参数的值来控制display的值。如下所示:

//SCSS
@mixin blockOrHidden($boolean:true){
      @if $boolean{
              @debug "$boolean is #{$boolean}";
                display: block;
          }
        @else{
              @debug: "$boolean is #{$boolean}";
              display: none;
            }
}
.block{
      @include blockOrHidden;
}
.hidden{
    @include blockOrHidden(false);
}

编译出来的CSS:

.block{
    display: block;
}
.hidden{
    display: none;
}

for循环(上)

在制作网格系统的时候,大家应该对.col1~.col12这样的印象较深。在CSS中你需要一个一个去书写,但在Sass中,可以使用@for循环来完成。在Sass的@for循环中有两种方式:

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

a)$i表示变量
b)start表示起始值
c)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;
}

for循环(下)

@for应用在网格系统生成各个格子class的代码:

//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;
}
@for $i from 1 through 12{
      .#{$grid-prefix}#{ $i }{
                  width: $grid-width * $i + $grid-gutter * ($i - 1);
                  @extend %grid;
          }
}

编译出来的CSS:

.span1, .span2, .span3, .span4, .span5,
.span6, .span7, .span8, .span9, .span10,
.span11, .span12{
      float: left;
      margin-left: 10px;
      margin-right: 10px;
}
.span1{
    width: 60px;
}
.span2{
    width: 140px;
}
.span3{
    width: 220px;
}
.span4{
    width: 300px;
}
.span5{
    width: 380px;
}
.span6{
    width: 460px;
}
.span7{
    width: 540px;
}
.span8{
    width: 620px;
}
.span9{
    width: 700px;
}
.span10{
    width: 780px;
}
.span11{
    width: 860px;
}
.span12{
    width: 940px;
}

将上面的示例稍作修改,将@for through 方式换成 @for to: :

//SCSS
@for $i from 1 to 13 {
    .#{$grid-prefix}#{$i}{
            width: $grid-width * $i + $grid-gutter * ($i - 1);
            @extend %grid;
        }
}

最终编译出来的CSS代码和上例所编译出来的一模一样。

这两段Sass代码并无太多差别,只是@for中的<end>取值不同。配合through的<end>值是12, 其遍历出来的终点值是13,其遍历出来的终点值是12, 就是<end>对就的值减去1。

while循环

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

//SCSS
$types: 4;
$type-width: 20px;
@while $type > 0 {
    .while-#{$types}{
            width: $type-width + $types;
      }
      $types: $type - 1;
}

编译出来的CSS:

.while-4{
    width: 24px;
}
.while-3{
    width: 23px;
}
.while-2{
    width: 22px;
}
.while-1{
    width: 21px;
}

each循环

@each循环就是去遍历一个列表,然后从列表中取出对应的值。

@each 循环指令的形式:

@each $var in <list>

如果你没有接触过列表,也不要紧,他也非常简单。

在下面的例子中你可以看到,$var就是一个变量名,<list> 是一个SassScript表达式,他将返回一个列表值。变量$var 会在列表中做遍历,并且遍历出与$var对应的样式块。
示例:

$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-kurior{
background: url("/images/avatars/kurior") no-repeat;
}

Sass的函数简介

在Sass中除了可以定义变量,具有@extend、%placeholder和mixins等特性之外,还自备了一系列的函数功能。其主要包括:
a)字符串函数
b)数字函数
c)列表函数
d)颜色函数
e)Introspection函数
f)三元函数等

当然除了自备的函数功能之外,我们还可以根据自己的需求定义函数功能,常常称之为自定义函数。
下面将给大家详细介绍前 4 种最常用的函数。

字符串函数-unquote()函数

字符串函数顾名思意是用来处理字符串的函数。Sass 的字符串函数主要包括两个函数:
a)unquote($string):删除字符串中的引号;
b)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 代码:

//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; }

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容

  • -------------------------一、控制指令--------------------------...
    夜幕小草阅读 3,148评论 0 5
  • 基础 声明变量 普通变量 默认变量 变量覆盖:只需要在默认变量之前重新声明下变量即可 变量的调用 局部变量和全局变...
    Jill1231阅读 1,270评论 0 1
  • 声明变量 定义变量的语法: 在有些编程语言中(如,JavaScript)声明变量都是使用关键词“var”开头,但是...
    Junting阅读 1,467评论 0 6
  • 前言 什么是CSS预处理器 定义:CSS预处理器定义了一种新的语言,其基本思想是,用一种专门的编程语言,为CSS增...
    SA_Arthur阅读 3,117评论 0 18
  • 写在前面的话 本文所有语法格式是基于SCSS格式的 scss 和 sass语法的相互转换 编译 命令行编译 GUI...
    xoyoz阅读 9,972评论 2 13