css命名規範(推薦BEM思想,非常好的規範,是由Yandex團隊提出的一種前端命名方法論)
BEM由3部分組成:
- B ——— block(塊)
- E ——— element(元素)
- M ——— modifier(修飾符)
命名約定的模式如下:
<div class="block block--modifier">
<div class="block__element"></div>
</div>
複製程式碼
.block {}
.block--modifier {}
.block__element {}
複製程式碼
這裡的 block 就相當於一個模組,可以看作是名稱空間,modifier 是 block 的修飾符(使用兩個中劃線連線), element 是 block 下面的子元素(使用兩個下劃線連線)。
例1:下面的程式碼是定義了一個簡單的頭部導航,需求如下: 高亮顯示當前選單文字
<header class="header">
<nav class="nav">
<a class="active" href="/" title="首頁">首頁</a>
<a href="/product.html" title="產品中心">產品中心</a>
</nav>
</header>
複製程式碼
.header .nav .active {
color: blue;
}
複製程式碼
如果按平時去寫,可能會這樣定義,這樣寫就有兩點不好:
- 如果在寫後面的程式碼的時候也用到了 active 這個類,那可能導致樣式覆蓋或者衝突
- 在定義樣式的時候多層巢狀會額外增加元素查詢的效能開銷,雖然多層巢狀無法避免,但是能少則少
如果按照 BEM 規範去命名,則是這樣:
<header class="header">
<nav class="header__nav">
<a class="header__nav__a--active" href="/" title="首頁">首頁</a>
<a href="/product.html" title="產品中心">產品中心</a>
</nav>
</header>
複製程式碼
.header__nav__a--active {
color: blue;
}
複製程式碼
這樣一來不僅成功避免了上面的兩個問題,另一方面也增加了程式碼的可讀性,讓所以元素之間的關係變得更加緊密,如果別人熟悉 BEM 規範,那麼就能很輕易的知道這段程式碼是什麼意思,在團隊協作中也能提高開發效率。
例2:利用這個規範我們也可以定義自己css公共樣式:
// 公共按鈕樣式
.btn { ... }
.btn--lg { ... }
.btn--sm { ... }
.btn--xs { ... }
.btn--round { ... }
.btn--disabled { ... }
.btn--primary { ... }
.btn--success { ... }
.btn--warning { ... }
// 如果某個模組下的按鈕和上面的通用按鈕樣式不一樣,則可以繼續增加樣式定義
// 分享按鈕樣式
.share-btn { ... }
.share-btn--lg { ... }
.share-btn--sm { ... }
.share-btn--xs { ... }
// 公共標題樣式
.tit { ... }
.tit--h1 { ... } // 一級標題
.tit--h2 { ... } // 二級標題
.tit--h3 { ... } // 三級標題
// 全域性主題樣式
.global-theme--white { ... }
.global-theme--black { ... }
.global-theme--christ { ... }
// ...
複製程式碼
這樣的命名方式不僅看起來清爽,而且實用,方便維護。
當然也並不是所有的樣式都適合用這種方式命名
比如:
- 樣式重置(reset.css)
- 全域性通用的的樣式,比如:
.center { text-align: center; }
.right { float: right; }
.left { float: left; }
// ...
複製程式碼
這一類樣式並不屬於某一個模組,也沒有需要修飾的地方,就是單純的面向屬性的命名。 所以在專案中還需要結合真實場景,相互結合使用。
BEM 規範可以說一種高效、強大的命名約定,雖然看起來會很長,但是壓縮之後的程式碼的體積會小很多,同時也可以儘量精簡css的命名來優化。