---
# System prepended metadata

title: 學習Sass#3 Sass/CSS 設計模式 SMACSS
tags: [Sass]

---

# 學習Sass#3 Sass/CSS 設計模式 SMACSS
###### tags: `Sass`

## SMACSS

CSS 模組化的方式之一

## SMACSS 核心架構

* Base
* Layout
* Module
* State
* Theme

## Base 

網頁的基本樣式，好比常用的 [CSS RESET](https://meyerweb.com/eric/tools/css/reset/)，就是屬於 BASE 的其中一種

有時候除了用到 CSS RESET 以外，我們可能依照需求再另外撰寫特定的基本樣式，而我們將這 Base 相關設定獨立撰寫成一個叫做 `_base.scss` ， 將這個 `_base.scss` 放在 CSS RESET 獨立檔案的下面

![](https://i.imgur.com/VEpnKXe.png)

---

## Layout

主要用在<font color='red'>共用的頁面</font>，例如網頁上常用到的 navbar 、 header 、 footer 等等每個頁面都會出現的部分，我們會將這部分的 CSS 寫在這個檔案中，並將這個檔案檔名叫做 `_layout.scss`

![](https://i.imgur.com/ojcbabE.png)

### 統一名稱 - 新增前綴詞

layout 還有一個觀念就是通常放在 layout 的樣式 className 都會加上一個 `l-` ， `l-` 意思是在 layout 的樣式，目的是在於 layout 專門放重複的樣式，但是 HTML 區塊樣式相同但是代表的東西可能不同當然 className 也可能不會相同因為這樣管理並不容易，這時如果特別為不同 className 設立相同的 CSS ，並不會達到簡化程式碼的目的，

![](https://i.imgur.com/GXMmHSi.png)

從這個範例可以看到 `carTwocard` 跟 `carcard` 都是同一個樣式，就只是因為 html 的 className 不同就多寫了，這樣很麻煩於是乎我們可以把這兩個區塊的 className 改成 1-card ，這樣 l- 可以知道這些標籤再 layout 並且可以減少撰寫的內容並套用同樣內容

---

## Module

假如有三個按鈕， 這三個按鈕的 padding 、 margin 都相同，但是只有顏色不同，我們勢必 CSS 會為這個顏色多寫三個 class ， 不過 padding 跟 margin 都是相同的，所以也是多寫了不少同樣的樣式，於是我們可以為這些同樣的樣式設立一個 className ， 再直接將 className 套用就好了

### 實際案例

![](https://i.imgur.com/2pBoKHp.png)

在使用 bootstrap5 的按鈕，你可以看到 className 不同的樣式有多個不同的 className ， `btn` 為一個 bootstrap 基本按鈕 `btn-secondary` 為基本按鈕再套用綠色還有 padding 、 margin 等相關設定，所以我們只要將想要的寫成 className 設定檔案並且直接在 html 套用 class 就好了，就不用多寫了 CSS 寫重複的屬性，關鍵在於抽出基本樣式，新增的 class 就是為需求客製化

### 操作

#### 撰寫 module

![](https://i.imgur.com/2NTOBUs.png)

#### 套用

![](https://i.imgur.com/Qw0XzeL.png)

---

## State 

專門放一些按鈕可能會有狀態的切換或是訊息提示，跟 Module 差不多意思，通常會加入 `is-` 當作前綴詞

![](https://i.imgur.com/hdgDUVe.png)

## 參考
[CSS 的模組化方法：OOCSS、SMACSS、BEM、CSS Modules、CSS in JS](https://cythilya.github.io/2018/06/05/css-methodologies/)
[淺談 CSS 設計模式-SMACSS 篇](https://israynotarray.com/css/20200516/2341336904/)