冷靜點梅林 已發佈 2019-10-27

淺談 BEM CSS - CSS 設計模式與架構

前言

BEM 是 Block Element Modifier 的縮寫,
BEM 是一種為了讓 CSS Class 更好維護的命名方式,藉由不同組件的命名 讓程式碼易懂、可重用,進而有效率地開發和維護。
雖然有些人討厭他的命名方式冗長,但是便於團隊協作。只要定義好了大的框架和命名,那麼團隊其他成員基於 BEM 的規範進行開發,理解成本降低,而且基本不存在樣式衝突的問題。

由來

Yandex 公司推出的 BEM,包括了規範以及其配套構建工具。如今提到的 BEM 主要是指其中的規範,在 BEM 最新的推廣頁中,對其的描述為:

BEM 是一種命名方法,能夠幫助你在前端開發中實現可複用的組件和代碼共享。

這次介紹 BEM 的命名方式是經過 Nicolas Gallagher 修改過的。

命名技術並不是原始的 BEM,但卻是一個我更喜歡的改進版。無論實際使用了什麼樣的符號,它們其實都是基於同樣的 BEM 原則。

BEM 表示法的格式大致如下:

/* block component 區塊*/
.block {
}

/* element 元素*/
.block__element {
}

/* modifier 修飾子*/
.block__element--modifier {
}

B - Block (區塊)

網頁是由多個區塊組合自成一區
想成是網頁構成的組件

  • 頁面獨立可重複使用
  • 每個 block 可獨立存在

image

header, container, menu, checkbox, input

功能:

  1. 負責描述功能
  2. 不使用元素選擇器和 ID 選擇器
  3. block 裡面不應該加樣式

E - Element (元素)

命名原則:要用 2 個底線__隔開作為 prefix。
也是頁面上的區塊,但比較像是區塊的內容,例如像是一個 menu 裡面的還有它的組成區塊。

  • 為 block 的子部分。
  • block 可以沒有 element,但 element 不可能沒有 block。
    爸爸可以沒兒子,但兒子不可能沒有爸爸。
    image

可能有看過類似於下面的 class 命名

menu__item 
list__item, 
checkbox__caption 
header__title

功能:

  1. 表達目的,而非狀態
  2. 無法獨立於父元素之外

M - Modifier (修飾符)

命名原則:在後面加上 2 個 -- 來辨識它是修飾符

.menu__item--active
.menu__item--sucess
.menu__item--danger

image

功能:

  1. 同一個 Block 或 Element 可以允許多組 Modifier
  2. 用來定義區塊或是元素的屬性或狀態

一個完整頁面組成如下圖:

  • 綠色:block
  • 青色:element
  • 紅色:modifier

image

並不是所有的 CSS 命名方式都要,遵照如此模式,只是我們應該要有具備良好的 CSS 架構概念如以下:

  1. 可預測
  2. 可重覆使用
  3. 可延展
  4. 可維護

而且當某些 CSS 設定可重複使用時,我們就應該獨立出來,讓此可以被重複使用。類似如:

.clearfix{
    clear:both
}
.caps { 
    text-transform: uppercase; 
} 

這條 CSS 不屬於任何一個 BEM 範疇,它僅僅只是一條單獨的樣式。

使用 BEM 的訣竅是,你要知道什麼時候哪些東西是應該寫成 BEM 格式的。因為某些東西確實是位於一個塊的內部,但這並不意味它就是 BEM 中所說的元素。

結論

很多情境都不是絕對的,如果太過於堅持一些原則,反而會變成干擾排版的障礙,畢竟本來原意就是希望好管理 CSS 專案,或是當我們看到用此命名方式,能夠迅速了解架構,更加速開發。

程式碼連結 & 圖片來源

Get BEM

BEM 設計模式

MindBEMding – getting your head ’round BEM syntax

關於筆者

暱稱:冷靜點梅林

介紹:網頁程式設計師 喜歡CSS動畫 Javascript 還在爬坡中

文章列表 文章列表