Sass - 前端工程師應該要會的工程化 CSS - 變數與插值
Sass 方便之一的功能就是變數設定,雖說不至於像 JavaScript 可以動態改變變數的值,但可以幫助我們更有效管理樣式。
$變數
共通的基準值、常使用到或可能需要一值調整的值、網站主要的色彩基調等都適合設定成變數做管理。
變數要設定在 Sass 文件的最開始處,後面要取用這些變數時才不會報錯。
設定變數的方法也很簡單,以 $
字號為開頭後面接變數名稱即可。
例如:
1 | $base: 10px; |
( Sass 不會區分 - 與 _ 兩者差別,例如 $base_fontsize 與 $base-fontsize 會認為是相同的變數名稱,撰寫時最好擇一當標準以免不小心寫到相同的命名造成值被取代 )
全域變數與區域變數
Sass 的變數也有位置的設定差異,於最外層設定的變數是全域變數,任何人都可以取用。而於樣式選擇器的 {}
內設定的變數就是區域變數,只能在該大括號內運作。( 有額外的狀況下面會再提到 )
1 | $width: 500px; |
以上例來說,雖然兩個選擇器都套用 $width 這個變數作為寬度的設定,但值卻是不一樣的~
Flag
在寫 CSS 時應該多少都會用到 !important
這個特殊 flag,Sass 也有兩種給變數用的 flag 設定。
!default
: 變數的默認值。如果變數沒有被重新賦值的話,就會套用預設的默認值。1
2
3
4
5
6
7
8
9
10
11
12
13
14$base: 12px;
$base: 10px !default;
$color_primary: #222 !default;
.main {
padding: $base;
background-color: $color_primary;
}
// 轉成 CSS
.main {
padding: 12px; // $base 有被重新賦值為 12px,因此不會套用 default 值
background-color: #222;
}!global
: 讓變數為全域變數。即使寫在{}
內也能被其他選擇器使用。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15.main {
$width: 5em !global;
width: $width;
}
.sidebar {
width: $width;
}
// 轉成 CSS
.main {
width: 5em;
}
.sidebar {
width: 5em;
}這兩種 flag 是 Sass 提供的設定,寫在一般 CSS 是沒有用的喔
list 與 map 格式
設定變數時,除了給定一個純值( ex. 16px、50、#222.. ) 之外,也提供 list 與 map 的格式,不過這兩種格式需要搭配輔助函示來取用。
list: 存放一組值,值與值之間可用 “空白” 或 “逗號” 分割。(如果是 list 包 list,則外層用逗號、內層用空白來區別)
1
2
3
4
5
6
7
8
9
10
11
12
13$color_values: #ff0000, #00ff00, #0000ff;
$shdow: 0px 0px 15px #222, 0px 15px 30px #666;
.box{
background-color: nth($color_values, 3);
box-shadow: nth($shadow, 1); // nth() 可以取得變數某索引位置的值
}
// 轉成 CSS
.box {
background-color: #0000ff;
box-shadow: 0px 0px 15px #222;
}map: 存放一組含有 key/value 的值,最外層需用
()
號框起。1
2
3
4
5
6
7
8
9$heading: (h1: 2em, h2: 1.5em, h3: 1.2em);
.main_title{
font-size: map-get($heading, h1); // map-get($變數, key) 取得 value
}
// 轉成 CSS
.main_title {
font-size: 2em;
}只是單純取其一值來用的話,使用 list 或 map 顯得有點 “自找麻煩”,這兩種格式比較適合與其他 function 搭配使用。像是用來遍歷的 @each,或是 @mixin 等。這部分就留待之後再說~
#{插值}
既然 Sass 有變數設定,那自然也有插值的功能啦! 類似 JavaScript ES6 的字串模板,使用插值可以做字符串的替換。
插值的寫法為 #{ $變數 }
1 | $name: foo; |
“選擇器名稱” 及 “屬性名稱” 是基本的字符串,寫甚麼就顯示甚麼,如果不使用插值符號直接帶入變數的話是會報錯的。( Sass 會認為是一般的字符串而不是變數 )
以上內容如有勘誤,還請不吝告知🙇