淺談OOCSS、SMACSS、BEM三種設計模式與前端架構優化的關係
淺談OOCSS、SMACSS、BEM三種設計模式與前端架構優化的關係
物件導向的OOCSS,是由Nicole Sullivan提出的css理論,雖說是理論,實則更像一種程式設計師約定的規範。
<div class=”demo-list”>
<ul>
<li><a href=”#”>…</a></li>
<li><a href=”#”>…</a></li>
<li><a href=”#”>…</a></li>
</ul>
</div>
對a修改樣式可能用.demo-list ul li a選擇,效率比較低,另一方面一旦在後期過程中對列表html進行重構,css也需要重構,耦合性變得很強,維護困難。
OOCSS推薦的寫法是在a標籤加上demo-a樣式,可以通過.demo-list .demo-a的方式來控制解耦。
提取公共樣式很多框架都是這種模式,Bootstrap按鈕.btn-info、.btn-warning等。
SMACSS通過一個靈活的思維過程來檢查你的設計過程和方式是否符合你的架構,更像一種規範~
1為css分類
2命名規範
3最小化適配深度
1為css分類
為css分類這一點是SMACSS的核心。SMACSS認為css有5個類別,分別是:
1 Base
2 Layout
3 Module
4 State
5 Theme or Skin
SMACSS還約定了一個字首l-/layout-來標識佈局的class
.layout-header {}
.layout-container {}
.layout-sidebar {}
.layout-content {}
.layout-footer {}
SMACSS中的模組具有自己的一個命名,隸屬於模組下的類皆以該模組為字首
.todolist{}
.todolist-title{}
.todolist-image{}
.todolist-article{}
SMACSS狀態規範,這個應該很多前端開發者都很好理解,描述的是任一元素在特定狀態下的外觀。
is-hidden
主題規範,描述了頁面主題外觀,一般是指顏色、背景圖。Theme Rules可以修改前面4個類別的樣式,且應和前面4個類別分離開來(便於切換,也就是“換膚”)。SMACSS的Theme Rules不要求使用單獨的class命名,也就是說,你可以在Module Rules中定義.header{ }然後在Theme Rules中也用.header { }來定義需要修改的部分(後載入覆蓋前載入樣式內容)
2命名規範
按照前面5種的劃分:
Base Rules(Pass)
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。
3最小適配深度
/* depth 1 */ .sidebar ul h3 { }
/* depth 2 */ .sub-title { }
兩段css的區別在於html和css的耦合度(這一點上和OOCSS的分離容器和內容的原則不謀而合)。可以想到,由於上面的樣式規則使用了繼承選擇符,因此對於html的結構實際是有一定依賴的。如果html發生重構,就有可能不再具有這些樣式。對應的,下面的樣式規則只有一個選擇符,因此不依賴於特定html結構,只要為元素新增class,就可以獲得對應樣式。
當然,繼承選擇符是有用的,它可以減少因相同命名引發的樣式衝突(常發生於多人協作開發)。但是,我們不應過度使用,在不造成樣式衝突的允許範圍之內,儘可能使用短的、不限定html結構的選擇符。這就是SMACSS的最小化適配深度的意義。
BEM,即Block,Element,Modifier,是由Yandex(俄羅斯最著名的網際網路企業)的開發團隊提出的前端開發理論。BEM通過Block、Element、Modifier來描述頁面(關鍵就是為了解決多人協作的命名問題)。
Block是頁面中獨立存在的區塊,可以在不同場合下被重用。每個頁面都可以看做是多個Block組成。
Modifier是描述Block或Element的屬性或狀態。同一Block或Element可以有多個Modifier。
在用 jQuery 可以常常看到這樣的寫法:$(‘.nav–main a’),一旦css發生重構,javascript程式碼也將變得難以維護,分不清那些程式碼是否會受到影響。
所以用 HTML 的屬性去選取 DOM 節點會更好,如果非要用 CSS 的 class 那也可以多寫一個 js- 的 prefix,以表示這個節點有被 Javascript 使用,例如:
<li><a class=`nav-a js-nav-a`></a></li>
<li><a class=`nav-a js-nav-a`></a></li>
<li><a class=`nav-a js-nav-a`></a></li>
三種設計模式都有共同的特點,那便是讓html與css更好的解耦,抽取樣式中可複用的部分,使你的html程式碼更具語義。瞭解這些設計模式無疑會使css程式碼更具模組化,多人協作的時候也能有效避免那些命名問題帶來的困擾又或者說提供一些解決的思路。最重要是提取精華,靈活應用,更加的規範規模化,在達到提高效率的同時兼顧效能。
相關文章
- 好程式設計師web前端分享值得參考的css理論:OOCSS、SMACSS與BEM程式設計師Web前端CSSMac
- 淺談23種設計模式之單例設計模式設計模式單例
- 簡單介紹常見的三種架構設計模式及其優缺點!架構設計模式
- 【iOS印象】漫談 iOS App 架構與設計模式iOSAPP架構設計模式
- 淺談Laravel中的設計模式(三) Container 容器Laravel設計模式AI
- 淺談前端MVC與MVVC模式前端MVC模式
- 淺談前端優化的幾個思路前端優化
- 淺談JVM整體架構與調優引數JVM架構
- 淺談高併發-前端優化前端優化
- 淺談設計模式——單例模式設計模式單例
- 淺談設計模式——工廠模式設計模式
- 好程式設計師淺談大資料與Hadoop有什麼關係程式設計師大資料Hadoop
- [淺談設計模式(三)] 讓你一分鐘讀懂設計模式設計模式
- 【淺談設計模式(三)】讓你一分鐘讀懂設計模式設計模式
- 架構與資料庫的關係架構資料庫
- 【淺談架構14/100】架構的緣起與目標架構
- 淺談Nginx伺服器的內部核心架構設計!Nginx伺服器架構
- 淺談Nginx伺服器的內部核心架構設計Nginx伺服器架構
- Dubbo架構設計與原始碼解析(三)責任鏈模式架構原始碼模式
- 淺談:服務架構進化論架構
- 淺談hdfs架構與資料流架構
- 設計,架構,框架之間是什麼關係?架構框架
- InnoDB架構淺談架構
- 淺析專網通訊領域的前端架構設計前端架構
- 淺談網站效能之前端效能優化網站前端優化
- 【JavaScript】淺談前端模組化與元件化JavaScript前端元件化
- 架構設計思想-微服務架構設計模式架構微服務設計模式
- 淺談java之設計模式(1)Java設計模式
- 淺談基於 Laravel 開發的 MeEdu 的微服務架構設計Laravel微服務架構
- 淺談OC物件初始化的三種姿勢物件
- 淺談OB高可用架構下的RTO與RPO架構
- 前端架構設計的方法論前端架構
- 設計模式-UML關係基礎設計模式
- 很全!淺談幾種常用負載均衡架構負載架構
- 淺談MySQL的B樹索引與索引優化MySql索引優化
- 淺談前端響應式設計(一)前端
- 淺談前端響應式設計(二)前端
- 淺談業務中臺前端設計前端