1. 程式人生 > >Sass的學習筆記

Sass的學習筆記

    Sass被稱為“CSS前處理器”,就是用一種程式設計的思想去寫CSS樣式表。在還沒接觸Sass的時候,很多人都不願意去了解,認為都會了CSS,為什麼還要去寫Sass,Sass最終生成的還是CSS檔案呀。

    最初,我也是這麼認為的。

    在我認真的學了Sass之後,原來使用Sass對CSS有很大的幫助,對於經常性寫CSS檔案的設計師們,節省了很多的開發時間,並且可以寫出擴充套件性更強、更易於維護的程式碼。下面是我記錄了Sass的學習筆記。

一. sass安裝

1.1 Ruby安裝

    主要針對的是window系統下的安裝,因為Sass依賴於Ruby環境,所以應先安裝Ruby,Ruby安裝包下載連結:http://rubyinstaller.org/downloads/

    下載之後,安裝過程中,請勾選Add Ruby executables to your PATH,新增環境變數。

    如果沒有勾選,需在安裝完成之後配置Ruby環境變數。

    在window系統中,新建系統變數RUBY_HOME,存放Ruby安裝路徑(D:\Program Files\Ruby23-x64

)。

    在系統變數Path中,新增Ruby執行環境路徑(%RUBY_HOME%\bin),Ruby環境變數配置完成。

1.2 執行gem命令

    安裝完成之後,在開始選單中找到Ruby,開啟Start Command Prompt with Ruby,輸入ruby -v,如果顯示ruby的版本資訊,表示安裝成功。

1.3 安裝sass

    A. 安裝方法一:原配置源安裝

    在命令列中直接輸入gem install sass,按回車鍵即可。等待一段時間會提示安裝成功。(因為國內網路原因,估計會安裝不成功,所以可以翻牆或者選擇下面淘寶映象安裝)

    安裝Sass測試版本 gem install sass –pre

    升級Sass版本 gem update sass

    檢視Sass版本 sass –v

    幫助命令列 sass -h

    B. 安裝方法二:淘寶映象安裝

    首先移除預設的配置源(https://rubygems.org/),然後新增淘寶映象的配置源(https://ruby.taobao.org/),在命令列中輸入

    gem source --removehttps://rubygems.org/ 

    gem source --addhttps://ruby.taobao.org/

    輸入gem source檢視當前的源是否為淘寶映象配置源,如果為淘寶源,再輸入gem install sass,等待一段時間,會提示安裝成功。

    C. 安裝方法三:本地安裝

    還可以選擇本地安裝,需要在網上找到Sass的gem檔案,下載連結:https://rubygems.org/gems/sass

    下載之後,存放在任意位置,在命令列中輸入gem install E://sass-3.4.22.gem,安裝路徑,根據自己存放的路徑填寫。


二. Sass基本用法

2.1 匯入

    我們都知道CSS檔案,都有匯入功能,@import ‘reset.css’,但是在建站方面,這種匯入效果和頁面分別link兩個CSS檔案樣式表的效果是一樣的,因為HTTP請求的數目並不會減少。

    在Sass中,也有匯入功能,如果匯入的是CSS檔案,@import ‘reset.css’,那效果和CSS檔案匯入效果是一樣的,它還是以@import存在,並不會合併到編譯後的CSS檔案中。Sass匯入可以省略.scss字尾名,如果以@import ‘reset’方式匯入,會合併到編譯後的CSS檔案。一般需要匯入的Sass檔案是以_開頭命名,如_reset.scss,匯入只要引入reset即可。

    被匯入Sass檔案,_a.scss:

$fontSize: 12px;

    需要匯入樣式的Sass檔案,b.scss:

@import 'a';
body {
  font-size: $fontSize;
}

    編譯後的CSS樣式:

body {
  font-size: 12px;
}

2.2 註釋

    Sass檔案添加註釋有兩種方式:

   /* 這是註釋 */

    這種方式和CSS檔案中的註釋是一樣的。如果在壓縮模式下使用這種註釋方式,那麼在最終生產的CSS檔案中註釋將會被刪除。但如果不用壓縮輸出方式,註釋將保留在CSS檔案中。

   // 這是註釋

    Sass有可以用兩條正斜槓表示單行註釋,這和JavaScript、Java檔案的單行註釋方式相同。這種方式的註釋,不會顯示在輸出的CSS檔案中。  

2.3 變數

    Sass中定義變數的語法是:美元符號、變數名、冒號、變數值。

    A.普通變數$variable-name: value;

$colorMain: orange;
a {
  color: $colorMain;
}

    編譯後的CSS樣式:

a {
  color: orange;
}

    B.預設變數$variable-name: value !default;

$fontSize: 13px !default;
body {
  font-size: $fontSize;
}

    編譯後的CSS樣式:

body {
  font-size: 13px;
}

    如果需要改變預設變數,在預設變數前面,重新賦值即可。(!default標識告訴Sass,只有在沒有其他值賦值的情況下才使用預設值。

$fontSize: 12px;
$fontSize: 13px !default;
body {
  font-size: $fontSize;
}

    編譯後的CSS樣式:

body {
  font-size: 12px;
}

    C.多值變數$variable-name: value1 value2 value3;

    Sass可以定義多值變數, 多值變數可以分為list型別和map型別,對應於JavaScript的陣列和物件。

    list型別變數,是以空格,逗號或者括號來分割多個值,可用nth($list, n)函式來取值。

$colorLink: #222 $colorMain; //第一個為預設顏色值,第二個為滑鼠滑過顏色值
a {
  color: nth($colorLink, 1);
  &:hover {
    color: nth($colorLink, 2);
  }
}

    編譯後的CSS樣式:

a {
  color: #222;
}
a:hover {
  color: orange;
}

    上面這部分類似為一維陣列的定義和使用,下面為多維陣列:

$px: 20px 15px, 15px 20px; //二維陣列

    或者用括號來分割:

$px: (20px 15px) (15px 20px); //二維陣列

   map型別變數,是以key-value成對定義的,其中value值又可以為普通變數或者list變數。格式為:$map(key1: value1, key2: value2, key3: value3)可用map-get($map, $key)來取值。

$heading: (h1: 20px, h2: 16px, h3: 13px);
body {
  font-size: map-get($heading, h3);
}

    編譯後的CSS樣式:

body {
  font-size: 13px;
}

2.4 巢狀

    巢狀語法是:選擇器,左大括號,屬性-值對,右大括號。在多值變數的時候,我們用到了一個&這樣的符號,指的是父元素選擇器,在巢狀偽選擇器的時候經常用到。(在使用巢狀的時候要注意,儘量不要超過三層。

div {
  background: $colorMain;
  a {
    color: #fff;
    text-decoration: none;
    &:hover, &:active {
      text-decoration: underline;
    }
  }
}

    編譯後的CSS樣式:

div {
  background: orange;
}
div a {
  color: #fff;
  text-decoration: none;
}
div a:hover, div a:active {
  text-decoration: underline;
}

    在上面我們講述的是選擇器的巢狀,在Sass中,還有一種屬性巢狀:

.div {
  background: {
    image: url("img/img_01.png");
    repeat: no-repeat;
    position: center;
  }
  border: {
    style: solid;
    color: $colorMain;
    left: {
      width: 5px;
    }
    right: {
      width: 2px;
    }
  }
}

    編譯後的CSS樣式:

.div {
  background-image: url("img/img_01.png");
  background-repeat: no-repeat;
  background-position: center;
  border-style: solid;
  border-color: orange;
  border-left-width: 5px;
  border-right-width: 2px;
}

    注意:屬性巢狀書寫時,一定不要忘了屬性後面所跟的冒號在對div的背景定義上,其實背景直接可以寫為background: url(“img/img_01.png”) no-repeat center,不用像上面那麼麻煩,所以在寫樣式的時候,也要注意減少不必要的麻煩。

2.5 繼承

    使用@extend命令可讓任何元素繼承其他樣式定義好的屬性和值。如果有好幾個元素有共同的樣式屬性,這種情況可使用@extend命令。

.div {
  background: $colorMain;
  padding: 20px;
}
.div-01 {
  @extend .div;
  border: 2px solid #eee;
}
.div-02 {
  @extend .div;
  border: 2px solid #ccc;
}

    編譯後的CSS樣式:

.div, .div-01, .div-02 {
  background: orange;
  padding: 20px;
}
.div-01 {
  border: 2px solid #eee;
}
.div-02 {
  border: 2px solid #ccc;
}

2.6 佔位符

    佔位符與繼承@extend命令一起使用,有些情況下,一些程式碼只是用來做擴充套件用,就可以用佔位符選擇器,以此來減少冗餘程式碼。以繼承的例子來,只需將開頭的.div換為%div即可。這樣在生成的CSS檔案中就不會有.div的樣式。

%div {
  background: $colorMain;
  padding: 20px;
}
.div-01 {
  @extend %div;
  border: 2px solid #eee;
}
.div-02 {
  @extend %div;
  border: 2px solid #ccc;
}

    編譯後的CSS樣式:

.div-01, .div-02 {
  background: orange;
  padding: 20px;
}
.div-01 {
  border: 2px solid #eee;
}
.div-02 {
  border: 2px solid #ccc;
}

2.7 混合巨集

    混合巨集以@mixin命令宣告,基本語法是:@mixin mixin-name($parameter) {…: $parameter},混合巨集既可以不傳遞引數,也可以有引數,並且可以是單個,也可以有多個引數。Compass提供了許多現成的混合巨集。

    A.無引數混合巨集

    無引數混合巨集相當於繼承,可以直接用繼承代替。

@mixin center-block {
  margin-left: auto;
  margin-right: auto;
}
.div {
  @include center-block;
}

    編譯後的CSS樣式:

.div {
  margin-left: auto;
  margin-right: auto;
}

    B.有引數的混合巨集

    以圓角為例(通常在定義混合巨集的引數時,都會設定一個預設值,當然,也可以不設定。):

@mixin border-radius($radius: 4px) {
  -moz-border-radius: $radius;
  -webkit-border-radius: $radius;
  -o-border-radius: $radius;
  -ms-border-radius: $radius;
  border-radius: $radius;
}
.div {
  @include border-radius(5px);
}

    編譯後的CSS樣式:

.div {
  -moz-border-radius: 5px;
  -webkit-border-radius: 5px;
  -o-border-radius: 5px;
  -ms-border-radius: 5px;
  border-radius: 5px;
}

    C.多個引數混合巨集

    對於#{$direction},可能有點陌生,這是變數的一種特殊使用方法,在字串中使用,用#{}包含變數。

@mixin border-direction-radius($direction: top-left, $radius: 4px) {
  -moz-border-#{$direction}-radius: $radius;
  -webkit-border-#{$direction}-radius: $radius;
  -o-border-#{$direction}-radius: $radius;
  -ms-border-#{$direction}-radius: $radius;
  border-#{$direction}-radius: $radius;
}
.div {
  @include border-direction-radius(top-left, 5px)
}

    編譯後的CSS樣式:

.div {
  -moz-border-top-left-radius: 5px;
  -webkit-border-top-left-radius: 5px;
  -o-border-top-left-radius: 5px;
  -ms-border-top-left-radius: 5px;
  border-top-left-radius: 5px;
}

    D.多組值引數

    如果一個引數可以有多組值,如box-shadow,transition等,那麼引數則需要在變數後加三個點表示,如:$variables… 。以box-shadow為例,box-shadow: h-shadow v-shadow blur spread color inset,都指的是box-shadow: 水平偏量 垂直偏量 模糊值 陰影擴散值 陰影的顏色 inset值

@mixin box-shadow ($shadow...){
  -moz-box-shadow: $shadow;
  -webkit-box-shadow: $shadow;
  -o-box-shadow: $shadow;
  -ms-box-shadow: $shadow;
  box-shadow: $shadow;
}
.div {
  @include box-shadow(1px 1px 2px 0px gray, 0px 1px 0px 1px lighten(gray, 0.5));
}

    編譯後的CSS樣式:

.div {
  -moz-box-shadow: 1px 1px 2px 0px gray, 0px 1px 0px 1px #818181;
  -webkit-box-shadow: 1px 1px 2px 0px gray, 0px 1px 0px 1px #818181;
  -o-box-shadow: 1px 1px 2px 0px gray, 0px 1px 0px 1px #818181;
  -ms-box-shadow: 1px 1px 2px 0px gray, 0px 1px 0px 1px #818181;
  box-shadow: 1px 1px 2px 0px gray, 0px 1px 0px 1px #818181;
}

 


三. Sass程式設計

3.1 數學計算

    Sass可進行加、減、乘、除計算。注意,進行計算時,數值的單位必須一致,並且運算子號最好兩邊都有一個空格,以免計算出錯。

    A.加法

$widthContainer: 1200px;
$widthLeft: 20%;
$widthRight: 80%;
.div {
  width: $widthLeft + $widthRight;
}

    編譯後的CSS樣式:

.div {
  width: 100%;
}

    B.減法

.div {
  width: $widthRight - $widthLeft;
}

    編譯後的CSS樣式:

.div {
  width: 60%;
}

    C.乘法

    在計算乘法的時候要注意,當相乘時,如果值後面都帶單位,會出現問題。

.addition {
  width: 20px * 40px;
}

    編譯時,報錯:

800px*px isn't a valid CSS value.

    如果只給一個值帶單位,就正常了

.addition {
  width: 20 * 40px;
}

    編譯後的CSS樣式:

.addition {
  width: 800px;
}

    D.除法

    在計算除法的時候,跟乘法一樣,只需要一個值帶單位即可,並且表示式放在括號內,才能正常使用。

.addition {
  width: 80% / 20%;
}

    對此,編譯之後,在CSS中,是沒有意義的

.addition {
  width: 80% / 20%;
}

    如果使用括號:

.addition {
  width: (80% / 20);
}

    編譯之後的CSS樣式:

.addition {
  width: 4%;
}

3.2 條件

    @if@else if控制命令,舉個簡單例子:

$div: left;
.div {
  @if $div == left {
    float: left;
  }@else if $div == right {
    float: right;
  }
}

    編譯後的CSS樣式:

.div {
  float: left;
}

3.3 迴圈

   @for迴圈命令,有兩種形式:@for $variable from startNum to endNum,和@for $variable from startNum through endNum,startNum表示起始值,endNum表示結束值,關鍵字to迴圈時不包括endNum這個數,through迴圈時包括endNum這個數。

@for $i from 1 through 3 {
  .div-#{$i} {
    width: 100px * $i; 
  }
}

    編譯後的CSS樣式:

.div-1 {
  width: 100px;
}
.div-2 {
  width: 200px;
}
.div-3 {
  width: 300px;
}

    @for $variable from startNum to endNum

@for $i from 2 to 4 {
  .div-#{$i} {
    width: 100px * $i;
  }
}

    編譯後的CSS樣式:

.div-2 {
  width: 100px;
}
.div-3 {
  width: 200px;
}

   @each迴圈命令,基本語法是:@each $variable in list/map,list/map表示list型別或者map型別變數。

    A.迴圈list型別變數

@each $list in a,b,c {
  .#{$list} {
    background-image: url("img/#{$list}.png");
  }
}

    編譯後的CSS樣式:

.a {
  background-image: url("img/a.png");
}
.b {
  background-image: url("img/b.png");
}
.c {
  background-image: url("img/c.png");
}

    多組值的迴圈:

$listData: (a, no-repeat, left top) (b, no-repeat, left bottom);
@each $name, $repeatType, $sizeType in $listData {
  .#{$name} {
    background-image: url("img/#{$name}.png");
    background-repeat: $repeatType;
    background-position: $sizeType;
  }
}

    編譯後的CSS樣式:

.a {
  background-image: url("img/a.png");
  background-repeat: no-repeat;
  background-position: left top;
}
.b {
  background-image: url("img/b.png");
  background-repeat: no-repeat;
  background-position: left bottom;
}

    B.迴圈map型別變數

$headings: (h1: 20px, h2: 16px, h3: 13px);
@each $header, $size in $headings {
  #{$header} {
    font-size: $size;
  }
}

    編譯後的CSS檔案:

h1 {
  font-size: 20px;
}
h2 {
  font-size: 16px;
}
h3 {
  font-size: 13px;
}

3.4函式

    Sass提供了好多現成的函式,我們也可以自己定義函式,用@function命令定義函式,@return定義函式返回值。

@function func() {
  @return 13px;
}
body {
  font-size: func();
}

    編譯之後的CSS樣式:

body {
  font-size: 13px;
}