強悍的 CSS 擴展語言 -- Sass

<div class = 'testBorder'>
   <p>
        <input/>       
    </p>
</div>

假設上面這 3 個 DOM 元素有這樣的需求, div 去邊框, p 顯示邊框, input 只顯示底部邊框, 並且統一用 !important 關鍵字提升樣式的優先權;css

若是手寫純 CSS 會是這樣:程序員

.testBorder{
   border:none !important;   
}
.testBorder p{
   border:1px solid !important;
}
.testBorder p input{
   border-width:0 0 1px 0 !important;
   border-style: solid !important;   
}

會發現,有重複的代碼".testBorder", ".testBorder p", "!important"。 這只是簡單的需求,若是項目龐大對樣式的需求複雜,這樣手寫 CSS 和搬磚真沒區別;編程

而換用 Sass 來寫:數組

$imp: !important; /*定義變量*/
.testBorder
{ border:none $imp; p{ border:1px solid $imp; input{ border-width:0 0 1px 0 $imp; border-style:solid $imp; } } }

 代碼可嵌套了;sass

 

CSS 是層疊樣式表,不是語言,缺少編程語言中強大的特性:變量、函數、運算、循環、判斷、繼承等;ruby

而它的擴展語言 Sass 就支持這些特性,Sass 讓咱們用編程方式來寫 CSS 代碼從而提升效率節約程序員的時間;dom

Sass 的官網:http://sass-lang.com/,  裏面文檔很是精確齊全,都不用再看其它介紹文章了,顯示得多餘。文檔雖然是雞腸,但都是比較經常使用的單詞,且還有例子,基本能看明白;編程語言

下面就最近本身經常使用的 Sass 知識點作下簡要的記錄,方便之後複習;函數

1.變量spa

定義變量 "$[name]: [value];"

$columnCount: 5; /*數字*/
$columnWidth: 100px;/*樣式*/
$columnClassName: 'column';/*字符串*/
$domTypeArr: ('input','select','div');/*數組*/
$canExtend:true; /*布爾*/

 

2.函數、判斷

定義函數: "@function [funcName]([parameters]){//doSth}"

調用方式: [functionName]([parameter]);

@function extendWidth($width){ @if($width < 1){
      @return 50px;
   }@else{
      @return $width * 50px;
   }
}

上面加粗的代碼就是判斷,和 js 的判斷同樣,區別只是關鍵字前面要加 @字符,如 @if  @else

 

3.混合指令 @Mixin , 循環for

Mixin 不知怎麼翻譯,搜了一遍翻譯爲 "混合指令", 做用是把一串 css 包在一塊兒,供調用;

定義: "@mixin [mixinName]([parameters]){//sth css}", ([parameter]) 括號和parameter 是可選的,即沒有參數時可不加括號(); 

調用方式: @include [mixinName]([parameter])

@mixin push($pushWidth){
   $_extendPushWidth: $pushWidth + 10px; /*定義內部變量*/
   margin-left: $_extendPushWidth;
}

@mixin column($columnIndex,$pushWidth:null){
   float:left;/*css*/
   border:1px solid; width:floor(extendWidth($columnIndex)); /*調用 extendWidth 用戶函數計算寬度,再調用Sass 內置的數學函數 floor 獲取整數*/
   @if($pushWidth != null){
      @include push($pushWidth); /*調用混合指令(mixin) push 生成 margin-left*/
   }
}

@mixin generateTable{
   .my-table{/*css class*/
      max-width:400px; @for $i from 1 through $columnCount{ /*$totalColumns 是上面的全局變量*/
          .#{$columnClassName}#{$i}{
         background-color:rgba(255,0,0,$i/10); @include column($i,5);/*調用mixin column 生成 column 樣式*/
          }
      }
   }
}

.my-form{
   width:500px; @include generateTable(); }

注意: mixin 與函數的主要區別:mixin 至關於一段代碼塊,和函數同樣可在其它地方重複調用,它不像函數那樣返回一個值,它是返回一個代碼塊,調用前要加關鍵字 @include;

@for $i from 1 through $columnCount{ } 這是 for 循環,把 $i 從 1 開始遞增到 $columnCount;

若是要循環一個數組或集合,要用到 @each $var in [array]{}

 

把上面三段代碼 copy 到一個文件(如 test.scss), 在命令窗口中調用 sass 命令:

sass c:\test.sass c:\test.css

生成的 css :

@charset "GBK";
/*數字*/
/*樣式*/
/*字符串*/
/*數組*/
/*布爾*/
.my-form {
  width: 500px; }
  .my-form .my-table {
    /*css class*/
    max-width: 400px;
    /*$totalColumns 是上面的全局變量*/
    /*$totalColumns 是上面的全局變量*/
    /*$totalColumns 是上面的全局變量*/
    /*$totalColumns 是上面的全局變量*/
    /*$totalColumns 是上面的全局變量*/ }
    .my-form .my-table .column1 {
      background-color: rgba(255, 0, 0, 0.1);
      float: left;
      /*css*/
      border: 1px solid;
      width: 50px;
      /*調用 extendWidth 用戶函數計算寬度,再調用Sass 內置的數學函數 floor 獲取整數*/
      /*定義內部變量*/
      margin-left: 15px;
      /*調用混合指令(mixin) push 生成 margin-left*/
      /*調用mixin column 生成 column 樣式*/ }
    .my-form .my-table .column2 {
      background-color: rgba(255, 0, 0, 0.2);
      float: left;
      /*css*/
      border: 1px solid;
      width: 100px;
      /*調用 extendWidth 用戶函數計算寬度,再調用Sass 內置的數學函數 floor 獲取整數*/
      /*定義內部變量*/
      margin-left: 15px;
      /*調用混合指令(mixin) push 生成 margin-left*/
      /*調用mixin column 生成 column 樣式*/ }
    .my-form .my-table .column3 {
      background-color: rgba(255, 0, 0, 0.3);
      float: left;
      /*css*/
      border: 1px solid;
      width: 150px;
      /*調用 extendWidth 用戶函數計算寬度,再調用Sass 內置的數學函數 floor 獲取整數*/
      /*定義內部變量*/
      margin-left: 15px;
      /*調用混合指令(mixin) push 生成 margin-left*/
      /*調用mixin column 生成 column 樣式*/ }
    .my-form .my-table .column4 {
      background-color: rgba(255, 0, 0, 0.4);
      float: left;
      /*css*/
      border: 1px solid;
      width: 200px;
      /*調用 extendWidth 用戶函數計算寬度,再調用Sass 內置的數學函數 floor 獲取整數*/
      /*定義內部變量*/
      margin-left: 15px;
      /*調用混合指令(mixin) push 生成 margin-left*/
      /*調用mixin column 生成 column 樣式*/ }
    .my-form .my-table .column5 {
      background-color: rgba(255, 0, 0, 0.5);
      float: left;
      /*css*/
      border: 1px solid;
      width: 250px;
      /*調用 extendWidth 用戶函數計算寬度,再調用Sass 內置的數學函數 floor 獲取整數*/
      /*定義內部變量*/
      margin-left: 15px;
      /*調用混合指令(mixin) push 生成 margin-left*/
      /*調用mixin column 生成 column 樣式*/ }

 

效果:

<div class="my-form">
    <div class="my-table">
        <div class="column1">column1</div>
        <div class="column2">column2</div>
        <div class="column3">column3</div>
    </div>

4.導入其它sass 文件:

@import 'test.scss';

 

很明顯用 Sass 來寫 css, 不但代碼量倍數級減小,且優雅簡潔易於維護和擴展;

其實 sass 語法有點像 js ,若是會 js,觸類旁通學起來很容易;

 

window 下的編譯環境:

先按裝 Ruby, 下載地址:http://rubyinstaller.org/downloads/

再安裝 Sass, 

gem install sass

 

就能夠用 sass 命令進行編譯了:

sass input.scss output.css

 

sass 還有一個好牛叉的插件: compass, 先看下官網:http://compass-style.org/, 有時間 再做整理;

相關文章
相關標籤/搜索