OOCSS
是所有 CSS 方法論最早提出的一個,主要由
Nicole Sullivan
提出,你可以參考作者撰寫的
WiKi
,OOCSS 就如同字面上的意思,主要依造物件導向 (Object-Oriented Programming, OOP) 方式來撰寫目標,這邊你可以把它理解為將 CSS 物件化、模組化,其主要概念為以下兩點:
Separate structure and skin:結構與樣式分離
-
例子:
.btn-primary
、
.rounded-top
-
Separate container and content:容器與內容分離
-
例子:
.container
、
.col-4
OOCSS 提倡的理念是樣式可重用性,在撰寫時需符合以下規則:
-
應盡量避免使用後代選擇器 (
.navbar ul
) 或 id 選擇器 (
#list
)
-
應盡量避免樣式依賴於結構 (低耦合概念),嘗試使用 class 替代 tag 選擇器
SMACSS
主要由
Jonathan Snook
提出,從名稱上的 Architecture 字樣可以得知他是以專案整體的結構來做考量,除了擁有與 OOCSS 類似的 HTML 與 CSS 分離概念,還有其最具特色的結構化命名概念,所謂的結構化命名是指將對象做結構分類並將其限制命名,藉此達到容易擴展及模組化目的,SMACSS 相比於 OOCSS 更偏向整個專案結構的分類及模組化你的 CSS,其中結構的分類有:
-
Layout
-
Module
-
State
-
Theme
結構分類的目的在於將 CSS 做有效的區隔,你可以把它想成像 7-1 模式的概念,並且結合了其命名限制概念,這邊你可以先參考就好,關於實際的用途將在下面各項規則做完整介紹:
-
Base:不須特別提供前綴,且不會使用到 class、id 選擇器,目的在於設定元素基本樣式
-
例子:
html
、
*:before
、
img
-
Layout:使用
l-
或
layout-
為次要佈局樣式提供前綴,目的在於將佈局樣式與其他樣式做區隔
-
例子:
.l-header
、
.l-sidebar
、
.l-grid
-
Module:使用模組本身命名為子模組樣式提供前綴,目的在於快速了解其相關性
-
例子:
.card
、
.card-header
、
.card-body
-
State:使用
is-
為狀態樣式提供前綴,透過語意化方式了解當前狀態
-
例子:
.is-active
、
.is-hidden
、
.is-collapsed
-
Theme:不須特別提供前綴,使用對象本身的名稱覆蓋其原先的主題樣式
-
例子:
.l-header-dark
、
.card-dark
meyerweb
或
normalize
版本的重製文件,或者是一些全域型的樣式設定,在撰寫時可參照以下規則:
-
可使用元素選擇器、後代選擇器、子選擇器以及任何偽類將基本樣式應用於元素
-
不應該使用 class、id 選擇器設置元素預設樣式
-
不應該使用
@important
設置元素預設樣式 (權重過高,無法覆蓋)
可參考以下:
1 2 3 4 5 6 7 8 9 10 11 12 13
|
html, form { margin: 0; padding: 0; }
*, *:before, *:after { box-sizing: border-box; }
img { max-width: 100%; height: auto; }
|
BEM
主要由
Yandex
公司所推出,其概念為透過命名方式將網頁獨立的區塊包裝成元件,有別於 OOCSS 或 SMACSS 需了解其中的組件化思維才能動作,BEM 透過最簡單且最直接的方式將原本抽象的組件化過程實踐在網頁裡頭,該方法論是基於三個要點所組成,分別為:
-
Block:盡量以工具性質來命名對象
-
例子:
.list
、
.card
、
.navbar
-
Element:使用
__
兩個下劃線 (underline) 連接 Block 對象
-
例子:
.list__item
、
.card__img
、
.navbar__brand
-
Modifier:使用
--
兩個連字符 (hyphen) 連結 Block 或 Element 對象
-
例子:
.list__item--active
、
.card__img--rounded
、
.navbar--dark
在 BEM 並沒有那些抽象的規則,任意對象都能透過其命名包裝成元件,且 BEM 是基於功能導向 (Function-Oriented Programming, FOP) 而設計的,不存在像是
.pl-5
這種難以理解的 class 名稱,為了保證 BEM 能夠合理的將對象模組化,請務必遵守以下規則:
-
嚴禁使用 class 除外的選擇器撰寫樣式
-
不要過度模組化,應適當拿捏對象的模組化深度