1. 程式人生 > >Sass入門-混合巨集

Sass入門-混合巨集

五、混合巨集

當你的樣式變得越來越複雜,需要重複使用大段的樣式時, Sass 中的混合巨集就會有重大意義。

  • 宣告混合巨集(使用@mixin來宣告)

    1.不帶引數的混合巨集:

    @mixin border-radius{
        -webkit-border-radius: 5px;
        border-radius: 5px;
    }

    2.帶引數的混合巨集:

    @mixin border-radius($radius:5px){
        -webkit-border-radius: $radius;
        border-radius: $radius;
    }

    3.複雜的混合巨集

    @mixin box-shadow($shadow...) {
      @if length($shadow) >= 1 {
        @include prefixer(box-shadow, $shadow);
      } @else{
        $shadow:0 0 4px rgba(0,0,0,.3);
        @include prefixer(box-shadow, $shadow);
      }
    }

    這個 box-shadow 的混合巨集,帶有多個引數,這個時候可以使用“ … ”來替代。簡單的解釋一下,當 $shadow 的引數數量值大於或等於“ 1 ”時,表示有多個陰影值,反之呼叫預設的引數值“ 0 0 4px rgba(0,0,0,.3) ”。

  • 呼叫混合巨集(使用@include來呼叫混合巨集)

    呼叫1.中宣告的混合巨集:

    button {
        @include border-radius;
    }

    編譯後的css為:

    button {
      -webkit-border-radius: 3px;
      border-radius: 3px;
    }
  • 混合巨集的引數

    1.傳一個不帶值的引數

    在混合巨集中,可以傳一個不帶任何值的引數,如:

    @mixin border-radius($radius){
      -webkit-border-radius: $radius;
      border-radius: $radius;
    }

    呼叫時,可以給這個混合巨集傳一個引數值:

    .box {
      @include border-radius(3px);
    }
    編譯後的css為:
    .box {
      -webkit-border-radius: 3px;
      border-radius: 3px;
    }

    2.傳一個帶值的引數

    在混合巨集中,可以給引數傳一個預設值,如:

    @mixin border-radius($radius:3px){
      -webkit-border-radius: $radius;
      border-radius: $radius;
    }

    呼叫時:

    .btn {
      @include border-radius;      //呼叫預設的3px的值
    }
    .box {
      @include border-radius(50%);     //將會覆蓋掉預設值
    }

    3.傳多個引數

    例如:

    @mixin center($width,$height){
      width: $width;
      height: $height;
      position: absolute;
      top: 50%;
      left: 50%;
      margin-top: -($height) / 2;
      margin-left: -($width) / 2;
    }

    呼叫時:

    .box-center {
      @include center(500px,300px);
    }

    還有一個特別的引數“…”,當混合巨集引數過多時使用,如:

    @mixin box-shadow($shadows...){
      @if length($shadows) >= 1 {
        -webkit-box-shadow: $shadows;
        box-shadow: $shadows;
      } @else {
        $shadows: 0 0 2px rgba(#000,.25);
        -webkit-box-shadow: $shadow;
        box-shadow: $shadow;
      }
    }

    呼叫時:

    .box {
      @include box-shadow(0 0 1px rgba(#000,.5),0 0 2px rgba(#000,.2));
    }
    編譯出來的css為:
    .box {
      -webkit-box-shadow: 0 0 1px rgba(0, 0, 0, 0.5), 0 0 2px rgba(0, 0, 0, 0.2);
      box-shadow: 0 0 1px rgba(0, 0, 0, 0.5), 0 0 2px rgba(0, 0, 0, 0.2);
    }
  • 擴充套件/繼承(通過@extend實現)

    在 Sass 中是通過關鍵詞 “@extend”來繼承已存在的類樣式塊,從而實現程式碼的繼承。編譯後的css會將選擇器合併在一起,形成組合選擇器,如下所示:

    .btn {
      border: 1px solid #ccc;
      padding: 6px 10px;
      font-size: 14px;
    }
    
    .btn-primary {
      background-color: #f36;
      color: #fff;
      @extend .btn;
    }
    
    .btn-second {
      background-color: orange;
      color: #fff;
      @extend .btn;
    }

    編譯後的css為:

    .btn, .btn-primary, .btn-second {
      border: 1px solid #ccc;
      padding: 6px 10px;
      font-size: 14px;
    }
    
    .btn-primary {
      background-color: #f36;
      color: #fff;
    }
    
    .btn-second {
      background-clor: orange;
      color: #fff;
    }
  • 佔位符(%placeholder)

    它可以取代以前 CSS 中的基類造成的程式碼冗餘的情形。因為 %placeholder 宣告的程式碼,如果不被 @extend 呼叫的話,不會產生任何程式碼。通過 @extend 呼叫的佔位符,編譯出來的程式碼會將相同的程式碼合併在一起。來看一個演示:

    %mt5 {
      margin-top: 5px;
    }
    %pt5{
      padding-top: 5px;
    }
    
    .btn {
      @extend %mt5;
      @extend %pt5;
    }
    
    .block {
      @extend %mt5;
    
      span {
        @extend %pt5;
      }
    }
    

    編譯後為:

    .btn, .block {
      margin-top: 5px;
    }
    
    .btn, .block span {
      padding-top: 5px;
    }
  • 混合巨集VS繼承VS佔位符

    1.混合巨集:

    編譯出來的 CSS 清晰告訴了大家,他不會自動合併相同的樣式程式碼,如果在樣式檔案中呼叫同一個混合巨集,會產生多個對應的樣式程式碼,造成程式碼的冗餘,這也是 CSSer 無法忍受的一件事情。不過他並不是一無事處,他可以傳引數。

    個人建議:如果你的程式碼塊中涉及到變數,建議使用混合巨集來建立相同的程式碼塊。

    2.繼承:

    使用繼承後,編譯出來的 CSS 會將使用繼承的程式碼塊合併到一起,通過組合選擇器的方式向大家展現,比如 .mt, .block, .block span, .header, .header span。這樣編譯出來的程式碼相對於混合巨集來說要乾淨的多,也是 CSSer 期望看到。但是他不能傳變數引數。

    個人建議:如果你的程式碼塊不需要專任何變數引數,而且有一個基類已在檔案中存在,那麼建議使用 Sass 的繼承。

    3.佔位符

    編譯出來的 CSS 程式碼和使用繼承基本上是相同,只是不會在程式碼中生成佔位符 mt 的選擇器。那麼佔位符和繼承的主要區別的,“佔位符是獨立定義,不呼叫的時候是不會在 CSS 中產生任何程式碼;繼承是首先有一個基類存在,不管呼叫與不呼叫,基類的樣式都將會出現在編譯出來的 CSS 程式碼中。”

    這裡寫圖片描述