---
# System prepended metadata

title: CSS 工具選擇

---

# CSS 工具選擇

## PostCSS vs SASS
![](https://i.imgur.com/yU1sJOd.png)


###### 優點
| SASS | PostCSS | 
| ------------ | ------------ | 
| 強大的功能     | 基於 JavaScript 的開箱即用     | 
| 擴展 CSS，保持與 CSS 標準規範的兼容性 | 快速且靈活性高     | 
| 可以自定義函式，並輕鬆調用。產生更清晰、更可重用的程式。 | PostCSS 允許您使用純 CSS 編寫，不用學習新語法     | 


###### 缺點
| SASS | PostCSS | 
| ------------ | ------------ | 
| 需要 Ruby 或 LibSass     | 插件通常基於不同的 postcss 版本，不能正常協同工作 | 
| 提供的功能太多，compile 時間較長   | 有些插件需要按一定的順序運作     | 


###### 實際需求
- 模組化樣式
- React / Vue / HTML /AEM 不同環境的應用性
- 取用的便利性
- 後續維護性（插件/版本差異）


## 結論：使用SASS
SASS 雖然需要較長時間的 compile，但較少版本問題，應用層面也較廣，能夠快速移植到不同的環境中，在 CSS 開發上也有助於釐清架構與維護。

未來可再根據需要規範 SASS 的架構與


---


## 什麼是SASS?

隨著網頁開發複雜度逐漸地提高，在開發大型專案時，許多網頁開發者開始發現傳統 CSS 有一些問題：

1. 沒有變數與可重複使用樣式的寫法
2. 模組化開發時，不能採用嵌套的寫法，需要寫很多重複的選擇器。


Sass 的**變數(variables)**、**語言嵌套(nested)**、**混合函式(mixin)**、**函式**等，並且完整的實現了表格形式。Sass 幫助複雜的樣式。更多條理，並輕鬆在項目內部或跨項目共享設計。



## 使用方式
### 安裝
在終端機輸入
```npm install -g sass```

在專案資料夾下建立一個 main.scss 的檔案，並且在該檔案的位置下終端機執行：
```sass --watch main.scss output.css```



### 寫法

###### CSS
``` css
nav ul {
    margin: 0;
    padding: 0;
    list-style: none;
}

nav li {
    display: inline-block;
}

nav li a {
    text-decoration: underline;
}
```

###### Sass
``` sass
nav
    ul
        margin: 0
        padding: 0
        list-style: none
    li
        display: inline-block
        
        a
            text-decoration: underline
```

### 引入方式
使用底線不會被編譯成 css 檔案，會在引入時被合併成一隻檔案

###### 檔案
``` sass
_variable.sass
_mixin.sass

components/_button.sass

main.sass
```

###### main.sass
``` sass
@import 'variable'
@import 'mixin'


@import 'components/button'

```


---

## SASS 的便利性

### 1. @variable

可根據設計稿，設定初始參數組合

``` sass
$btn-config:(
	default:(
		class: 'default',
		color: #333,
		bg: #fff,
		border-color: #ccc
	),
	primary:(
		class: 'primary',
		color: #fff,
		bg: #009AFF,
		border-color: #009AFF
	),
	danger:(
		class: 'danger',
		color: #fff,
		bg: #D84315,
		border-color: #009AFF
	)
);
```

### 2. @mixin
設定共用樣式，與不同狀態的樣式設定
``` sass
.btn{
    /*......*/
    &:hover,&:focus{
        color: #333;
        background-color: #e6e6e6;
    }
}

@mixin button-set($color,$background,$border-color){
    color:$color;
    background-color:$background;
    border-color:$border-color;
    &:hover,&:focus,&:active{
        color:$color;
        background-color:darken($background,5%);
        border-color:darken($border-color,5%);
    }
}
```
### 3. @each + @map

透過 @each 取得 variable 設定，並 mapping 到共用樣式
``` sass
/* @each+map-get()+@include */
//$key,$value

@each $keyname, $value in $btn-config{
    $class:map-get($value,class);
    $color:map-get($value,color);
    $bg:map-get($value,bg);
    $border-color:map-get($value,border-color);
    
    .btn-#{$class}{
        @include button-set($color,$background,$border-color)
    }
}
```

###### HTML
未來只要修改參數設定、靠既有 **1** 組共用樣式與 **1** 個迴圈，就能產出各種需要的按鈕
``` html
<button class="btn">這是一個按鈕</button>
<button class="btn btn-primary">這是一個按鈕</button>
<button class="btn btn-danger">這是一個按鈕</button>
```

---

## SASS Guideline
[https://sass-guidelin.es/zh/](https://https://sass-guidelin.es/zh/) 
![](https://i.imgur.com/U0EimzA.png)


## Reference
- [Sass vs PostCSS](https://www.slant.co/versus/764/767/~sass_vs_postcss)
- [https://sass-lang.com/](https://sass-lang.com/)
- [SASS教學 ＋SCSS：CSS 再進化，掌握語法攻略！](https://frankknow.com/sass-tutorial/)
- [SCSS/CSS 學習筆記](https://hackmd.io/@yuci0213/r17cT6NiL)