好程式設計師web前端分享值得參考的css理論:OOCSS、SMACSS與BEM
好程式設計師 web前端分享值得參考的css理論:OOCSS、SMACSS與BEM
最近在
The Sass Way裡看到了Modular CSS typography一文,發現文章在開頭部分就提到了OOCSS、 SMACSS、 BEM、這3個詞。“如果還不知道這些是什麼,請先不要繼續看下去”,聯想到作者這樣友好(gāo lěng)的提醒,作為圍觀群眾,自然要有所回應。所以,本文在這裡分別介紹它們。
OOCSS、SMACSS及BEM都是有關css的方法論(準確地說,其中BEM應該是一個完整的前端開發理論,不僅限於css),可作為實現優秀css架構(css architecture)的指南。
css易於理解,但應用和維護並不簡單。在各種開發情景下,css都可能成為一個問題點。因此,我們編寫和組織css應認真、用心。
OOCSS
OOCSS (Object Oriented CSS),字面意思是物件導向的CSS,是由Nicole Sullivan提出的css理論,其主要的兩個原則是:
Separate structure and skin(分離結構和主題) Separate container and content(分離容器和內容)
用一個例子來說明。請看下面這樣的圖文排列:
本作的主角,帝國北部地方貴族施瓦澤男爵的養子,也是托爾茲士官學校特科班
“Ⅶ組”的成員。
.media{
1. <p><font size="3"> padding: 10px;</font></p>
2. <p><font size="3"> }</font></p>
3. <p><font size="3"> .media:after{</font></p>
4. <p><font size="3"> display: table;</font></p>
5. <p><font size="3"> clear: both;</font></p>
6. <p><font size="3"> content: " ";</font></p>
7. <p><font size="3"> }</font></p>
8. <p><font size="3"> .media-image-container{</font></p>
9. <p><font size="3"> float: left;</font></p>
10. <p><font size="3"> margin-right: 10px;</font></p>
11. <p><font size="3"> }</font></p>
12. <p><font size="3"> .media-image{</font></p>
13. <p><font size="3"> display: block;</font></p>
14. <p><font size="3"> }</font></p>
15. <p><font size="3"> .media-body{</font></p>
16. <p><font size="3"> overflow: hidden;</font></p>
17. <p><font size="3"> }</font></p>
18. <p><font size="3"> .media-shadow{</font></p>
19. <p><font size="3"> box-shadow: 1px 1px 3px rgba(0, 0, 0, .5);</font></p>
20. <p><font size="3"> }</font></p>
上面這段程式碼用
media表示了這種圖文排列的頁面元素。如果把構成它的html、css及javascript(如果有)看做一個整體,那就相當於這是一個元件,或者說物件(object)。它可以在站點的任何地方被重用。
這樣是如何體現
OOCSS的兩個原則的呢?
Separate structure and skin
分離結構和主題是在於將一些視覺樣式效果
(例如background、color)作為單獨的“主題”來應用。在上面的例子中的陰影效果,沒有被直接寫在media的樣式規則內,而是被單獨寫在了一個名為media-shadow的class中。因此,它成為了可選擇、可拆分的主題。如果不需要對應主題,什麼也不要加,如果需要,加上對應的class,就是這樣的思路。
Separate container and content
分離容器和內容要求使頁面元素不依賴於其所處位置。在上面的例子中,
css的選擇符都很短,無繼承選擇符(例如.header .media { }),所以,這個圖文排列的元件,可以在任何地方使用,且會有一致的外觀。
如果需要在特定的地方讓這個元件看起來不一樣一些,繼續為這個元件增加
class,將“不一樣的部分”作為可配置的選項。元件的外觀仍不依賴其所處位置。
操作指南
可以看出,
OOCSS風格的css可以描述為兩點:
增加
class 不使用繼承選擇符
OOCSS追求元件的複用,其class命名比較抽象,一般不體現具體內容。
SMACSS
SMACSS (Scalable & Modular Architecture for CSS),是由Jonathan Snook提出的css理論。其主要原則有3條:
Categorizing CSS Rules(為css分類) Naming Rules(命名規則) Minimizing the Depth of Applicability(最小化適配深度)
這些原則分別是什麼意思呢
?
Categorizing CSS Rules
這一點是
SMACSS的核心。SMACSS認為css有5個類別,分別是:
Base Layout(Major Components) Module(Minor Components) State Theme
Base Rules, 基礎樣式,描述的是任何場合下,頁面元素的預設外觀。它的定義不會用到class和ID。css reset也屬於此類。
Layout Rules, 佈局樣式。它和後面的Module Rules一同,描述的是頁面中的各類具體元素。元素是有層次級別之分的,Layout Rules屬於較高的一層,它可以作為層級較低的Module Rules元素的容器。左右分欄、柵格系統等都屬於佈局樣式。
Module Rules, 模組樣式。它可以是一個產品列表,一個導航條。一般來說,Module Rules定義的元素放置於前面說的Layout Rules元素之內。模組是獨立的,可以在各種場合重用。
State Rules, 狀態樣式,描述的是任一元素在特定狀態下的外觀。例如,一個訊息框可能有success和error兩種狀態,導航條中的任一項都可能有current狀態。
繼續
OOCSS中的例子,下面新增的讓元素不顯示的is-hidden就屬於State Rules:
...
1. <p><font size="3"> 複製程式碼</font></p>
2. <p><font size="3"> .is-hidden{</font></p>
3. <p><font size="3"> display: none;</font></p>
4. <p><font size="3"> }</font></p>
Theme Rules, 主題樣式,描述了頁面主題外觀,一般是指顏色、背景圖。Theme Rules可以修改前面4個類別的樣式,且應和前面4個類別分離開來(便於切換,也就是“換膚”)。SMACSS的Theme Rules不要求使用單獨的class命名,也就是說,你可以在Module Rules中定義.mod { }然後在Theme Rules中也用.mod { }來定義需要修改的部分。
Naming Rules
Naming Rules是說在想class等的命名時,考慮用命名體現樣式對應的類別。
按照前面
5種的劃分,Layout Rules用l-或layout-這樣的字首,例如:.l-header、.l-sidebar。
Module Rules用模組本身的命名,例如圖文排列的.media、.media-image。
State Rules用is-字首,例如:.is-active、.is-hidden。
Theme Rules如果作為單獨class,用theme-字首,例如.theme-a-background、.theme-a-shadow。
Base Rules不會用到class和ID,是以標籤選擇符為主的樣式,例如p、a,無需命名。
命名規則不需要嚴格遵守,可以根據實際情況和自身喜好做其他的約定。記錄自己的約定
(寫文件),然後遵守,就是可行的。
Minimizing the Depth of Applicability
字面翻譯是最小化適配深度。透過一個簡單的描述來說明:
/* depth 1 */
1. <p><font size="3"> .sidebar ul h3 { }</font></p>
2. <p><font size="3"> /* depth 2 */</font></p>
3. <p><font size="3"> .sub-title { }</font></p>
上下兩端
css的區別在於html和css的耦合度。可以想到,由於上面的樣式規則使用了繼承選擇符,因此對於html的結構實際是有一定依賴的。如果把h3元素搬到另一個位置,就有可能不再具有這些樣式。對應的,下面的樣式規則只有一個選擇符,因此不依賴於特定html結構,只要為元素新增class,就可以獲得對應樣式。
當然,繼承選擇符是有用的,它可以減少因相同命名引發的樣式衝突
(常發生於多人協作開發)。但是,我們不應過度使用,在不造成樣式衝突的允許範圍之內,儘可能使用短的、不限定html結構的選擇符。這就是SMACSS的最小化適配深度的意義。
看起來,這一點和
OOCSS的分離容器和內容的原則非常相似。
主要目標
SMACSS著力於實現兩個主要目標:
更語義化的
html和css 降低對特定html結構的依賴 BEM
BEM,即Block, Element, Modifier,是由Yandex(俄羅斯最著名的網際網路企業)的開發團隊提出的前端開發理論。BEM透過Block、Element、Modifier來描述頁面。
Block是頁面中獨立存在的區塊,可以在不同場合下被重用。每個頁面都可以看做是多個Block組成。
Element是構成Block的元素,只有在對應Block內部才具有意義,是依賴於Block的存在。
Modifier是描述Block或Element的屬性或狀態。同一Block或Element可以有多個Modifier。
這三部分結合在一起,可以體現在
class命名上,從而為開發者提供更友好、更有意義的css組織方式。其形式是:
.block { }
1. <p><font size="3"> .block_modifier { }</font></p>
2. <p><font size="3"> .block__element { }</font></p>
3. <p><font size="3"> .block__element_modifier { }</font></p>
再回到前面
OOCSS的那個圖文排列的例子,對應用BEM的寫法的話就是:
本作的主角,帝國北部地方貴族施瓦澤男爵的養子,也是托爾茲士官學校特科班
“Ⅶ組”的成員。
這樣的寫法的好處是,在
class命名上以約定的形式攜帶了更多有用資訊。在多人合作的時候,新接手這個專案的人,也可以很容易從class命名上分辨出來,哪些部分是Block,哪些是對應的Element,哪些是Modifier,並進一步推斷出哪部分html可以獨立使用。
BEM是完整的前端開發理論,這裡只是提到了它採用的css的class命名規則。可以看出,BEM的命名規則可以使程式碼更易於維護。
這些理論真的可以應用嗎
?
是的,而且有用。但是,請不要過於樂觀,任一種理論都只是對解決
css編寫、維護問題的一種嘗試,及其經驗總結。就實際具體的專案來說,你可能仍然會遇到困惑。這些理論最重要的是提供了一種思路(即使它們也提供開發模式的程式碼庫),你可能不直接應用它們,但應該透過它們認識到,在寫程式碼之前,需要多一些思考。
不直接編寫
css而是採用less、sass等預編譯器,也同樣需要合理的程式碼編寫和組織方式,因為可以從編譯後得到的css來分析,所以原則是相通的。
結語
在整理寫文字之前,我只初步瞭解過
OOCSS,而對另外2個還沒有印象...(嗯,其實很正常)
本文的
3個理論各有各的風格,沒有孰優孰劣之說,都是在編寫css時值得參考的內容。如果可以,非常推薦自己根據這些理論背後的意圖,想一個適合自己的方法。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913892/viewspace-2642267/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- CSS設計模式:OOCSS 和 SMACSSCSS設計模式Mac
- 好程式設計師Web前端分享前端CSS篇程式設計師Web前端CSS
- 淺談OOCSS、SMACSS、BEM三種設計模式與前端架構優化的關係CSSMac設計模式前端架構優化
- 好程式設計師web前端教程分享CSS技巧!程式設計師Web前端CSS
- 好程式設計師web前端分享CSS元素型別程式設計師Web前端CSS型別
- 好程式設計師web前端分享CSS基礎篇程式設計師Web前端CSS
- 好程式設計師分享如何看待CSS中BEM的命名方式?程式設計師CSS
- 好程式設計師web前端培訓分享CSS定位的教程程式設計師Web前端CSS
- 好程式設計師web前端分享CSS不同元素margin的計算程式設計師Web前端CSS
- 好程式設計師web前端分享CSS3 漸變程式設計師Web前端CSSS3
- 好程式設計師web前端分享主流CSS image比較程式設計師Web前端CSS
- 好程式設計師web前端技術分享css盒模型程式設計師Web前端CSS模型
- 好程式設計師web前端分享css初始化程式碼程式設計師Web前端CSS
- 好程式設計師web前端培訓分享怎樣學好css?程式設計師Web前端CSS
- 好程式設計師分享Css詳解bem書寫規範程式設計師CSS
- 好程式設計師web前端教程分享web中CSS絕對定位程式設計師Web前端CSS
- 好程式設計師web前端分享CSS3彈性盒程式設計師Web前端CSSS3
- 好程式設計師web前端分享css常用屬性縮寫程式設計師Web前端CSS
- 好程式設計師web前端分享CSS檔案引用的最優方法程式設計師Web前端CSS
- 好程式設計師web前端分享Css3的概念和優勢程式設計師Web前端CSSS3
- 好程式設計師web前端培訓分享HTML/CSS部分面試題程式設計師Web前端HTMLCSS面試題
- 好程式設計師web前端分享CSS學習:HSLA顏色模式程式設計師Web前端CSS模式
- 好程式設計師web前端分享CSS屬性組成及作用程式設計師Web前端CSS
- 好程式設計師web前端分享CSS基礎知識之position程式設計師Web前端CSS
- 好程式設計師web前端分享應該怎樣學好web前端?程式設計師Web前端
- 好程式設計師web前端分享web前端入門知識程式設計師Web前端
- 好程式設計師分享Web前端開發工具程式設計師Web前端
- 好程式設計師web前端分享Cookie知識程式設計師Web前端Cookie
- 好程式設計師web前端教程分享CSS預編譯器的再次理解程式設計師Web前端CSS編譯
- 好程式設計師Web前端教程分享CSS派生選擇器的講解程式設計師Web前端CSS
- 好程式設計師web前端分享前端 javascript 練習題程式設計師Web前端JavaScript
- 好程式設計師web前端教程分享HTML/CSS部分常見面試題程式設計師Web前端HTMLCSS面試題
- 好程式設計師web前端分享12個CSS高階技巧彙總程式設計師Web前端CSS
- 好程式設計師web前端分享CSS Bug、CSS Hack和Filter學習筆記程式設計師Web前端CSSFilter筆記
- 好程式設計師web前端教程分享web前端基礎知識程式設計師Web前端
- 好程式設計師web前端教程分享JavaScript面試題程式設計師Web前端JavaScript面試題
- 好程式設計師分享Web前端效能最佳化程式設計師Web前端
- 好程式設計師web前端分享邏輯運算程式設計師Web前端