---
tags: CSS, 六角筆記王
title: CSS - 預處理器 SASS/SCSS
---
# CSS - 預處理器 SASS/SCSS

## 預處理器
- 相容一般寫法
- 具有類似變數、迴圈與函式等寫法
## ▶ SASS/SCSS
- SASS 無分號與括號
- SCSS 與一般 CSS 相同,相容性高
### ✏ 編譯
由於 SASS 需要經由編譯才能產生出正常的 CSS,在一開始的大圖中,可以看到 :
- 多數檔案名稱前方有個 `_` 符號,代表它是需要被編譯的檔案
- 在正式 CSS 檔案中不需要產生
- 可以在編輯器中,調整 CSS 存放路徑與檔名
- 若有看到 `.map` 這是編譯過程中,檢查有無錯誤用的
推薦編譯方式 :
- 使用 VScode,安裝套件 Live Sass Compiler
- 使用 Codepen,CSS 選項調整成 SASS/SCSS
### ✏ 變數
類似於 JavaScript 定義變數,變數名稱前加上 `$` 號,並寫下變數名稱。
```scss
$primary: #000000;
a {
color: $primary;
}
```
像這樣,a 連結的顏色就會被變更為 `$primary` 這個自定義變數的值。日後要變更顏色時,只要更動變數值即可。
### ✏ 嵌套
傳統寫 CSS 時,可能需要設定某個群組內層,像是這樣 :
```css
.section {
padding: 10px;
}
.section h2 {
color: red;
}
```
改用 SASS/SCSS,可以這樣寫 :
```sass
.section {
padding: 10px;
h2 {
color: red;
}
}
```
編譯出來的結果,會是一樣的,大幅提高閱讀性並且好管理。也能搭配 CSS 選擇器使用。
### ✏ 連接符號 `&`
若使用 BEM 寫法,同類型不同狀態或區塊的 class,可以這樣寫 :
```sass
// 此為 BEM 命名概念,可以產生出
// .list .list__item .list__item.active
.list {
margin-left: 10px;
&__item {
padding: 10px;
&.active {
color: red;
}
}
}
// 或是可以這樣寫,可以產生出 .pt-2
.pt {
&-2 {
padding-top: 1rem;
}
}
```
### ✏ 迴圈
假設 class 是相同類別時,可以利用迴圈的概念,這邊需要用到變數才能進行。
```sass
$space: (
"1": 0.5rem,
"2": 1rem,
);
@each $name, $value in $space {
.pt-#{$name} {
padding-top: $value;
}
}
```
範例可以產生出 .pt-1 與 .pt-2,將它們拆解可以分成 :
- `$space`,變數可以這樣寫,具有多個屬性名稱與值,類似物件概念
- `@each`,告知 SASS 使用迴圈
- `$name`,自定義參數,只使用在這個迴圈,第一個參數指向屬性名稱
- `$value`,自定義參數,只使用在這個迴圈,第二個參數指向屬性值
- `in`,迴圈關鍵字
### ✏ 變數內容合併、取得、移除
若有多個變數內容需要整併或移除,可以利用 sass 其中一個功能,maps function 來達到目的,比較常用的有這些 :
- `map-get`,取得變數中的某一屬性與值
- `map-merge`,合併變數中所有屬性與值
- 若有相同屬性名稱,則以後者為主
- `map-remove`,刪除變數中某一屬性與值
- [範例,可以點我看編譯後結果](https://codepen.io/hsuan333/pen/poPXQLV)
```sass
// 假設有一組預設字體大小
$default-font-size: (
smaller: 12px,
small: 14px,
medium: 1rem,
);
// 需要增加的字體大小
$font-size: (
large: 20px,
larger: 24px,
huge: 36px,
huger: 48px,
);
// 移除內容,若不需要某一個值,可以使用 map-remove
$default-font-size: map-remove($default-font-size, smaller);
// 合併內容,$merge 名稱可自定義
$merge: map-merge($default-font-size, $font-size);
// 利用 @each 產生結果
@each $name, $value in $merge {
.fz-#{$name} {
font-size: $value;
}
}
// 取得內容,好處是統一在變數中做修改,而非直接定義
h1 {
font-size: map-get($font-size, "huger");
}
```
### ✏ 混入
```sass
// 先定義一組變數
$grid-breakpoints: (
"sm": 576px,
"md": 768px,
"lg": 992px,
"xl": 1200px,
"xxl": 1400px
);
// 定義 mixin 的名稱與參數名
@mixin media-breakpoint-up($breakpoint) {
@media (min-width: map-get($grid-breakpoints, $breakpoint)) {
@content;
}
}
// 意思是裝置大小在 md 以上就為藍色
a {
@include media-breakpoint-up(md) {
color: blue;
}
}
```
上述範例可以拆解成 :
- `@mixin`,告知 SASS 使用 mixin
- `media-breakpoint-up`,這是自定義名稱
- `$breakpoint`,這是自定義參數
- `map-get`,map function 其中一個功能,可以從變數取得值
- `@content`,後續要放入的內容
- `@include`,插入 mixin 的名稱
## 參考來源
> 1. [Alphacamp - Sass/SCSS 基本語法介紹,搞懂CSS 預處理器](https://tw.alphacamp.co/blog/css-preprocessor-sass-scss)
> 2. [yuski - SASS : SASS Maps - get、merge、remove](https://ithelp.ithome.com.tw/articles/10207093)