詳解scss的繼承、佔位符和混合宏

一、繼承和佔位符

二者都是經過@extend來引用。css

1.1 繼承

一個已經存在的css樣式類,能夠被其餘樣式類繼承。git

例如,實現如下css樣式:github

.btn, .btn--primary, .btn--info {
  border: 1px solid blue; }

.btn--primary {
  color: black; }

.btn--info {
  color: gray; }

scss中能夠這樣寫,顯然,這種寫法便於維護和閱讀!web

.btn {
  border: 1px solid blue;
}

.btn--primary {
  color: black;
  @extend .btn;
}

.btn--info {
  color: gray;
  @extend .btn; 
}

1.2 佔位符

顧名思義,若是不被extend引用,它是不會被編譯,也就是:不會佔用css文件大小。這是和繼承最大區別。ruby

scss代碼以下:函數

%btn {
  border: 1px solid blue;
}

// 沒有被extend
// 不會出如今css文件中
%test-btn {
  border: 1px solid black;
}

.btn--primary {
  color: black;
  @extend %btn;
}

.btn--info {
  color: gray;
  @extend %btn; 
}

編譯後的css代碼:測試

.btn--primary, .btn--info {
  border: 1px solid blue; }

.btn--primary {
  color: black; }

.btn--info {
  color: gray; }

2. 混合宏

scss中的函數,經過關鍵字@mixin聲明,@include引用。網站

2.1 參數設置和調用方式

無參調用 scss:url

@mixin btn {
  border-radius : 3px;
}

.box {
  color: white;
  @include btn;
}

css:spa

.box {
  color: white;
  border-radius: 3px; }

參數調用 scss:

$radius:3px !default;

@mixin btn($radius:5px) { // 默認是 5px
  border-radius : $radius;
}

.box {
  color: white;
  @include btn($radius); // 傳入參數
}

css:

.box {
  color: white;
  border-radius: 3px; }

參數過多的狀況

當參數二、3個時候,能夠經過@mixin size($width,$height)這樣來調用。當參數過多,使用...符號。

scss:

$height: 15px !default;
$width: 18px !default;

@mixin size($list...) {
  @if length($list) == 0 {
    height: $height;
    width: $width;   
  }@else if length($list) == 1 {
    height: $list;
    width: $list;
  }@else if length($list) == 2 {
    height: nth($list , 1);
    width: nth($list , 2);
  }@else {
    @debug "Too many parameters";
  }
}

.btn--primary {
  @include size();
}

.btn--big {
  @include size(20px , 25px);
}

.btn--square {
  @include size( 18px );
}

.btn--test {
  @include size(1px,2px,3px,4px); // just a test. console output "Too many parameters" what we have defined.
}

輸出的css結果:

.btn--primary {
  height: 15px;
  width: 18px; }

.btn--big {
  height: 20px;
  width: 25px; }

.btn--square {
  height: 18px;
  width: 18px; }

2.2 好處和不足

混合宏最大的不足:會複用代碼,形成css冗贅(能夠嘗試一下下方的測試代碼)。 固然,符合宏能夠傳遞參數這點很nice。

能夠編譯下方代碼,觀察下結果:

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

.box {
  @include border-radius;
  margin-bottom: 5px;
}

.btn {
  @include border-radius;
}

3. 版本

  • scss:3.5.6
  • ruby:2.4.4p296

歡迎技術交流,引用請註明出處。 我的網站:godbmw.com Github:godbmw

相關文章
相關標籤/搜索