CSS 設計模式 - BEM
簡介
- CSS 寫法自由度高,難以維護
- 例如 Class 的命名就可以讓人一個頭兩個大
- 在大型專案或多人協作時,需要有一套規範讓團隊遵守,提升開發效率
BEM 是什麼
- CSS 命名 class 的一種規範
- 以元件的概念來命名
- 語義化,開發時能從 HTML 結構就能看出階層關係
- 讓 CSS 結構更為清晰,更好維護
- 不推薦使用 html 標籤和 id 撰寫 CSS 樣式
BEM 名稱來源
1. Block 區塊
- 在頁面上獨立存在,可重複使用的元件
- ex:
header
,footer
,menu
,card
2. Element 元素
_ _
雙底線:用來連接 Block 和 Element- Block 的子元件,無法存在 Block 之外
- ex:
menu__item
,list__item
3. Modifier 修飾符號
--
用雙中線來連接- 定義 Block / Element 的狀態或屬性
- 應該改變的是實體的外觀,行為或狀態,而不是替換它
- ex:
disabled
,checked
,fixed
,size big
,color yellow
範例:卡片元件

命名範例
*一般的命名方式

*使用 BEM 命名

搭配 SCSS 寫法 (推薦)
- 解決命名太長的困擾
- 前面重複的區塊名稱可以簡寫成&
- 修改 class 名稱更簡單
範例

常見問題:
Element 的子元素命名
- 當有一個巢狀超過兩層的元素需命名時
錯誤範例 ⬇
<nav class="menu"> <ul class="menu__list"> <li class="menu__list__item"> <a class="menu__list__item__link"></a> </li> <li class="menu__list__item"> <a class="menu__list__item__link"></a> </li> </ul></nav>
- 不需要在 class 名稱中完整呈現 HTML 結構
- 命名只是用來提示元素與 block(最外層元件)之間的關係
應該寫成 ⬇
<nav class="menu"> <ul class="menu__list"> <li class="menu__item"> <a class="menu__link"></a> </li> <li class="menu__item"> <a class="menu__link"></a> </li> </ul></nav>
參考文章 / 影片
# CSS # SCSS # BEM