BEM是一套CSS國際命名規範,是一個很是有用的功能強大且簡單的命名約定,它能使前端代碼更易讀,易於理解易於擴展。BEM是塊(block)、元素(element)、修飾符(modifier)的縮寫。前端
<form class="site-search">
<input type="text" class="site-search__input">
<input type="button" class="site-search__button" value="search">
</form>複製代碼
將總體的搜索框命名爲site-search做爲一個模塊,模塊下的兩個子節點就在後面加上兩根下劃線,加上本身的名字 input 和 button,這樣的命名方式,即便咱們沒有看到網頁內容,只看了CSS樣式名字,也能感覺到頁面結構和頁面元素之間的關係。
若是要說明按鈕button是灰色的,咱們還能夠加上修飾的類名modifier,好比能夠是site-search__button--gray。segmentfault
你是否遇到過寫CSS樣式名抓耳撓腮的時候?你是否遇到過團隊合做時看不清別人代碼,只能無奈的說「這個CSS重寫一遍比修改老文件快」?
BEM命名法則給咱們帶來了如下的便利:bash
BEM的關鍵特徵就是塊的獨立性。按照CSS的建議,能夠在網頁上的任何位置放置一個塊,並確保不會受到周圍環境的影響。並且,若是您最近須要將另外一個塊嵌套到當前塊中,則它們的徹底兼容性將獲得保證。換句話說,在維護Web應用程序時,您能夠在整個頁面上移動塊,添加其餘項並將其組合起來。模塊化
淘票票界面寫的挺美觀的,可是最近看了看淘票票的CSS命名方式,以爲稍有不妥。
好比淘票票最頂部的索引橫條。ui
如下是淘票票對於頂部導航欄的CSS命名,爲了讓你們更好看清頁面結構,我對頁面元素進行了簡單的處理,以及添加了幾行註釋:spa
<div class="head-wrap" data-spm="header">
<div class="head-content center-wrap">
<!-- logo:淘票票logo的放置 -->
<h1 class="logo">
</h1>
<!-- cityWrap:有一欄顯示當前城市 -->
<div class="cityWrap M-cityWrap">
</div>
<!-- nav-wrap:幾個切換頁面的地方 -->
<div class="nav-wrap">
<ul class="nav">
<li class="J_NavItem current ">
<a href="#" target="_top">首頁</a>
</li>
</ul>
</div>
<!-- entrance-wrap:最右邊的兩個導骯 -->
<div class="entrance-wrap">
<ul class="entrance">
<li class="entrance-item">
<a class="phone" href="#" target="_blank">手機購買</a>
</li>
<li class="entrance-item">
<a class="service">客服諮詢</a>
</li>
</ul>
</div>
</div>
</div>複製代碼
這裏存在兩個較爲嚴重的問題:
一、頁面結構不清晰。從CSS的命名方式上來看,很難看得出上面這些類是放在一塊的,同一模塊中的內容缺乏聯繫。
二、CSS命名與頁面內容掛鉤,代碼複用性低。觀察以上的命名方式,好比cityWrap、entrance、phone之類的,命名方式都和頁面內容掛鉤,這種命名方式缺點就是不能挪到其餘地方進行復用。由於其餘頁面可能沒有城市、入口、手機這些內容。或者,萬一頁面元素要進行更改,好比把城市(cityWrap)改爲國家(country),爲了保持CSS和頁面內容的統一性,就要更改全部的CSS樣式,給代碼的維護增長了不小的困難。
個人更改建議是使用BEM命名法則,將頁面元素模塊化.
整個導航欄做爲一個模塊,模塊能夠分爲典型的三層:head、body、footer,分別存放logo、導航條內容、尾部的其餘功能:3d
<!-- 整個導航欄堪稱一個模塊Block,由三個子節點Element -->
<div class="head-wrap" data-spm="header">
<div class="head-wrap__hd">
<h1 class="head-wrap__logo">
</h1>
</div>
<div class="head-wrap__bd">
<div class="head-wrap__bd__title">南昌</div>
<div class="head-wrap__bd__content">
<ul class="head-wrap__bd__item">
<li class="head-wrap__bd__items">首頁</li>
</ul>
</div>
</div>
<div class="head-wrap__ft">
<ul class="head-wrap__ft__item">
<li class="head-wrap__ft__items"><a>手機購買</a></li>
</ul>
</div>
</div>複製代碼
導航條當作一整個模塊Block,該模塊有三個子節點元素Elemet,通過這種命名方式,即便不看頁面元素,只看CSS元素的類名,是否是也能猜出大概結構來呢?並且不使用頁面的內容做爲命名方式,這樣的話,之後有相似結構的頁面,也能直接複用這一套CSS樣式,同時,清晰的命名方式也讓頁面維護變得更爲簡單。code
Segmentfault 文章地址:segmentfault.com/a/119000001…orm