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閱讀 229,732評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,214評論 3 426
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,781評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,588評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,315評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,699評論 1 327
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,698評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,882評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,441評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,189評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,388評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,933評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,613評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,023評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,310評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,112評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,334評論 2 377

推薦閱讀更多精彩內容

  • -------------------------一、控制指令--------------------------...
    夜幕小草閱讀 3,165評論 0 5
  • 基礎 聲明變量 普通變量 默認變量 變量覆蓋:只需要在默認變量之前重新聲明下變量即可 變量的調用 局部變量和全局變...
    Jill1231閱讀 1,304評論 0 1
  • 聲明變量 定義變量的語法: 在有些編程語言中(如,JavaScript)聲明變量都是使用關鍵詞“var”開頭,但是...
    Junting閱讀 1,479評論 0 6
  • 前言 什么是CSS預處理器 定義:CSS預處理器定義了一種新的語言,其基本思想是,用一種專門的編程語言,為CSS增...
    SA_Arthur閱讀 3,137評論 0 18
  • 寫在前面的話 本文所有語法格式是基于SCSS格式的 scss 和 sass語法的相互轉換 編譯 命令行編譯 GUI...
    xoyoz閱讀 9,996評論 2 13