CSS 樣板語言 - SASS

Sass: Syntactically Awesome Style Sheets 是 CSS 的樣板語言


解決 CSS 的缺點

  • 每個樣式最後都要加分號,缺少分號,導致前後樣式都出錯
  • 要加一個大括號包住所有樣式
  • 沒辦法一目了然層級關係

SASS 的特性

  • 最後面不需要分號和大括號,打了反而錯
  • 透過縮排來表示層級關係,元素只要跳一行縮排輸入,每個元素打完換行繼續打下一個元素
  • 表現 class 內部的樣式,例如: .namecard h2,與前面元素同一層級,輸入 & h2 來表示
  • 中間冒號後面記得要空一格
  • 內部文字是在 「元素後」或是「class 後」空一格輸入

變數概念管理色彩 & 內容

為網站設定視覺時,通常會有 3-5 個主要用色,反覆用在按鈕、邊框、背景等地方,如要修改主色,卻沒使用變數,必須要「一個一個剪貼將新色碼貼上」或是用「尋找+取代」,很麻煩又浪費時間

變數建立: $變數名稱

  • 顏色變數 $color_word: #2D3748
  • 距離變數 $margin_zero: 0px
  • 內容變數 $title_front: “範例”

語法

1
2
3
4
5
6
7
//- Pug
a.namecard
h2.name 阿榮
span.little_eng (Arong)
h5.job 前端工程師
hr
p.description 前端菜鳥,為了轉職努力學習中
1
2
3
4
5
6
7
8
9
10
11
<!-- SASS -->
$color_main: #f24
$color_background: #d1d1d1
$namecard_width: 350px
$namecard_height: 200px

.namecard
color: $color_main
backgound-color: $color_background
width: $namecard_width
height: $namecard_height

動態產生模組 mixin 概念

mixin 是將重複的 css 模組化,且可以帶入參數,依需求客製化模組,方便又保有彈性

語法範例 1

1
2
3
4
//- Pug
.block1
.block2
.block3
1
2
3
4
5
6
7
8
9
10
11
12
/* SASS */
@mixin block($length:40px, $color: black)
width: $length
height: $length
border: solid 2px $color

.block1
+block(70px, red)
.block2
+block(100px, blue)
.block3
+block(150px, green)

語法範例 2

1
2
3
4
//- Pug
h3 標題文字
h4 副標題
.button
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* SASS */
@mixin text($font-size: 30px, $color: red, $letter-spacing: 20px)
font-size: $font-size
color: $color
letter-spacing: $letter-spacing

h3
+text(30px, #333, 2px)
font-family: 微軟正黑體

h4
+text(20px, #777, 1px)
font-family: 微軟正黑體

@mixin size($w, $h)
width: $w
height: $h

.button
border: solid 1px
+size(300px, 200px)

常用 mixin 與累積資源

1
2
3
.block
.block1
h3 title
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
*
font-family: Helvetica, "Microsoft JhengHei"

html, body
margin: 0px
padding: 0px

@mixin indep
position: absolute

/* 垂直水平置中 */
@mixin center
position: absolute
left: 50%
top: 50%
transform: translateX(-50%) translateY(-50%)

@mixin trans($s)
transition: $s

@mixin size($w, $h)
width: $w
height: $h

@mixin fill
width: 100%
height: 100%

@mixin text($size, $spacing, $color)
font-size: $size
letter-spacing: $spacing
color: $color !important

.block
position: relative
border: solid 1px
+size(200px, 200px)

.block1
+center
+size(50px, 50px)
border: solid 1px


h3
+center
margin: 0px
+text(20px, 2px, red)