1. 程式人生 > >Sass進階篇

Sass進階篇

第一章:Sass的控制命令

[email protected]

@if 指令是一個 SassScript,它可以根據條件來處理樣式塊,如果條件為 true 返回一個樣式塊,反之 false 返回另一個樣式塊。在 Sass 中除了 @if 之,還可以配合 @else if 和 @else 一起使用。

假設要控制一個元素隱藏或顯示,我們就可以定義一個混合巨集,通過 @[email protected] 來判斷傳進引數的值來控制 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;
}

[email protected]迴圈(上)

在製作網格系統的時候,大家應該對 .col1~.col12 這樣的印象較深。在 CSS 中你需要一個一個去書寫,但在 Sass 中,可以使用 @for 迴圈來完成。在 Sass 的 @for 迴圈中有兩種方式:

 

@for $i from <start> through <end>
@for $i from <start> to <end>
  • $i 表示變數
  • start 表示起始值
  • 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;
}</span>

第四章:Sass的顏色函式 

RGB顏色函式-RGB()顏色函式

在 Sass 的官方文件中,列出了 Sass 的顏色函式清單,從大的方面主要分為 RGB , HSL 和 Opacity 三大函式,當然其還包括一些其他的顏色函式,比如說 adjust-color 和 change-color 等。在這章節中,將主要和大家一起探討 Sass 顏色函式中常見的 RGB、HSL 和 Opacity 函式。

1、RGB顏色函式

RGB 顏色只是顏色中的一種表示式,其中 R 是 red 表示紅色,G 是 green 表示綠色而 B 是 blue 表示藍色。在 Sass 中為 RGB 顏色提供六種函式:

  • rgb($red,$green,$blue):根據紅、綠、藍三個值建立一個顏色;
  • rgba($red,$green,$blue,$alpha):根據紅、綠、藍和透明度值建立一個顏色;
  • red($color):從一個顏色中獲取其中紅色值;
  • green($color):從一個顏色中獲取其中綠色值;
  • blue($color):從一個顏色中獲取其中藍色值;
  • mix($color-1,$color-2,[$weight]):把兩種顏色混合在一起。

僅從概念上,或許大家沒有太多的概念,我們通過下面的命令來做一個簡單的測試:

sass -i

在命令終端開啟這個命令,相當於開啟 Sass 的函式計算。

接下來,分別在終端使用 RGB 函式來進行計算,看其最終結果:

$ sass -i
>> rgb(200,40,88) //根據r:200,g:40,b:88計算出一個十六進位制顏色值
#c82858
>> rgba(#c82858,.65) //根據#c82858的65%透明度計算出一個rgba顏色值
rgba(200, 40, 88, 0.65)
>> red(#c82858) //從#c82858顏色值中得到紅色值 200
200
>> green(#c82858) //從#c82858顏色值中得到綠色值 40
40
>> blue(#c82858) //從#c82858顏色值中得到藍色值 88
88
>> mix(#c82858,rgba(200,40,80,.65),.3) //把#c82858和rgba(200,40,88,.65) 兩顏色按比例混合得到一個新顏色
rgba(200, 40, 80, 0.65105)

從上面的簡單運算結果可以很清晰的知道。在 RGB 顏色函式中,在實際中常用的主要是 rgba() 和 mix() 兩個函式,而 rgb() 函式只能快速的將一個 rgb 顏色轉換成十六進位制顏色表達,red()、green() 和 blue() 函式,只能取得某一顏色的一個值,對於顏色上使用並無太大作用(或許他的好處,我還沒有理解過來)。接下來,主要來實戰一下 rgba() 和 mix() 函式在實際中的運用。

4-2.RGB顏色函式-RGBA()函式

2、rgba() 函式主要用來將一個顏色根據透明度轉換成 rgba 顏色。

其語法有兩種格式:

rgba($red,$green,$blue,$alpha)  //將一個rgba顏色轉譯出來,和未轉譯的值一樣
rgba($color,$alpha)  //將一個Hex顏色轉換成rgba顏色

其中 rgba($color,$alpha) 函式作用更大,主要運用在這樣的情形之中:假設在實際中知道的顏色值是 #f36 或者 red,但在使用中,需要給他們配上一個透明度,這個時候在原來的 CSS 中,首先需要通過製圖工具,得到 #f36 或 red 顏色的 R、G、B 值,而不能直接使用(注意 css3 是可以的,但是存在瀏覽器相容問題):

//CSS
color: rgba(#f36,.5); //在css中,這是無效的寫法

但在 Sass 中,RGBA() 函式就能解決這個問題。我們先來看一個簡單的例子,假設在變數中定義了一個基本的變數:

$color: #f36;
$bgColor: orange;
$borderColor:green;

同時給他們加上 .5 的透明度:

//SCSS
.rgba {
    color: rgba(#f36,.5);
    background: rgba(orange,.5);
    border-color: rgba(green,.5);
}

語法:

在這個例項中,我們使用了 Sass 的 rgba 函式,在括號是函式的引數,第一個引數是需要轉換的顏色,他可以是任何顏色的表達方式,也可以是一個顏色變數;第二個引數是顏色的透明度,其值是 0~1 之間。上面的程式碼轉譯出來:

.rgba {
  color: rgba(255, 51, 102, 0.5);
  background: rgba(255, 165, 0, 0.5);
  border-color: rgba(0, 128, 0, 0.5);
}

在來看一個呼叫前面定義的變數:

//SCSS
.rgba {
    color: rgba($color,.5);
    background: rgba($bgColor,.5);
    border-color: rgba($borderColor,.5);
}

編譯出來的 css 程式碼:

//CSS
.rgba {
  color: rgba(255, 51, 102, 0.5);
  background: rgba(255, 165, 0, 0.5);
  border-color: rgba(0, 128, 0, 0.5);
}

 

我想您應該會看到一個變化,通過 rgba 函式,指定一個透明值,將原色轉換成另外一個顏色:

 

4-3.RGB顏色函式-Red()、Green()、Blue()函式

3、Red() 函式

red() 函式非常簡單,其主要用來獲取一個顏色當中的紅色值。假設有一個 #f36 的顏色,如果你想得到 #f36 中的 red 值是多少,這個時候使用 red() 函式就能很簡單獲取。

>> red(#f36)
255

得到的值是”255”。(注意:在命令終端要先輸入sass -i 命令)

4、Green() 函式

green() 函式和 red() 函式一樣,用來獲取某一個顏色值中 green 的值。同樣拿 ”#f36“ 顏色為例:

>> green(#f36)
51

5、Blue() 函式

同理,blue() 函式是用來獲取某一個顏色值中 blue 的值,如:

>> blue(#f36)
102

 

4-4.RGB顏色函式-Mix()函式

Mix 函式是將兩種顏色根據一定的比例混合在一起,生成另一種顏色。其使用語法如下:

mix($color-1,$color-2,$weight);

$color-1 和 $color-2 指的是你需要合併的顏色,顏色可以是任何表示式,也可以是顏色變數。

$weight 為 合併的比例(選擇權重),預設值為 50%,其取值範圍是 0~1 之間。它是每個 RGB 的百分比來衡量,當然透明度也會有一定的權重。預設的比例是 50%,這意味著兩個顏色各佔一半,如果指定的比例是 25%,這意味著第一個顏色所佔比例為 25%,第二個顏色所佔比例為75%。

這就是 Mix 函式的工作原理,在函式中指定三個函式,前兩個函式是你想混合的顏色(記住,你可以通過顏色變數、十六進位制、RGBA、RGB、HSL 或者 HSLA 顏色值)。第三個引數是第一種顏色的比例值。

 

第五章:Sass的@規則

[email protected]

Sass 擴充套件了 CSS 的 @import 規則,讓它能夠引入 SCSS 和 Sass 檔案。 所有引入的 SCSS 和 Sass 檔案都會被合併並輸出一個單一的 CSS 檔案。 另外,被匯入的檔案中所定義的變數或 mixins 都可以在主檔案中使用。

Sass 會在當前目錄下尋找其他 Sass 檔案, 如果是 Rack、Rails 或 Merb 環境中則是 Sass 檔案目錄。 也可以通過 :load_paths 選項或者在命令列中使用 --load-path 選項來指定額外的搜尋目錄。

@import 根據檔名引入。 預設情況下,它會尋找 Sass 檔案並直接引入, 但是,在少數幾種情況下,它會被編譯成 CSS 的 @import 規則:

  • 如果檔案的副檔名是 .css。
  • 如果檔名以 http:// 開頭。
  • 如果檔名是 url()。
  • 如果 @import 包含了任何媒體查詢(media queries)。

如果上述情況都沒有出現,並且副檔名是 .scss 或 .sass, 該名稱的 Sass 或 SCSS 檔案就會被引入。 如果沒有副檔名, Sass 將試著找出具有 .scss 或 .sass 副檔名的同名檔案並將其引入。

例如:

@import "foo.scss";

@import "foo";

兩者都將引入 foo.scss 檔案, 而

@import "foo.css";
@import "foo" screen;
@import "http://foo.com/bar";
@import url(foo);

將被編譯為:

@import "foo.css";
@import "foo" screen;
@import "http://foo.com/bar";
@import url(foo);

也可以通過一個 @import 引入多個檔案。例如:

@import "rounded-corners", "text-shadow";

將引入 rounded-corners 和 text-shadow 兩個檔案。

如果你有一個 SCSS 或 Sass 檔案需要引入, 但是你又不希望它被編譯為一個 CSS 檔案, 這時,你就可以在檔名前面加一個下劃線,就能避免被編譯。 這將告訴 Sass 不要把它編譯成 CSS 檔案。 然後,你就可以像往常一樣引入這個檔案了,而且還可以省略掉檔名前面的下劃線。

例如,你有一個檔案叫做 _colors.scss。 這樣就不會生成 _colors.css 檔案了, 而且你還可以這樣做:

@import "colors";//不用加下劃線

來引入 _colors.scss 檔案。

注意,在同一個目錄不能同時存在帶下劃線和不帶下劃線的同名檔案。 例如, _colors.scss 不能與 colors.scss 並存。

巢狀 @import

雖然大部分時間只需在頂層檔案使用 @import 就行了, 但是,你還可以把他們包含在 CSS 規則 和 @media 規則中。

來看官網提供的一個簡單示例:

假設要引入的樣式檔案`example.scss`檔案中包含這樣的程式碼:

.example {
  color: red;
}

然後這樣引用:

#main {
  @import "example";
}

編譯出來的 CSS:

#main .example {
  color: red;
}