BEM命名規範
阿新 • • 發佈:2017-08-07
並且 樣式 例子 uri value 規範 pan 宋體 val
謹以此文告誡自己浪費12個小時的教訓。
BEM的意思是塊(block)、元素(element)、修飾符(modifier),是由Yandex團隊提出的一種前端命名方法論。這種命名方法讓你的css類對其他開發者來說更加透明而且更有意義。在此介紹的是在原始的BEM的基礎上改進的版本。
命名約定模式如下:
.block{}
.block_element{}
.block_modifier{}
block代表更高級別的抽象或組件。
block_element代表block的後代,用於形成一個完整的block。
block_modifier代表block的不同狀態,或不同版本。
之所以使用兩個連字符和下劃線而不是一個,是為了讓你自己的塊可以用單個連字符來界定,如:
.sit-search{} /*塊*/
.sit-search_field{} /*元素*/ ..sit-search--full{} /*修飾符*/
用常規的css方式命名:
<form class="sit-search full"> <input type="text" class="field"> <input type="submit" value="search" class="button"> </form>
這些類名太不精確了,不能告訴我們足夠的信息,用BEM記號法是下面這樣:
<form class="sit-search sit-search--full"> <input type="text" class="sit-search_field"> <input type="submit" value="search" class="sit-search_button"> </form>
我們能清晰的看到有個叫.search的塊,內部是一個.sit-search_field並且sit-search還有另一種形態.sit-search--full。
再舉個例子,用BEM寫的代碼:
<div class="media"> <img arc="logo.png" alt="Foo Corp logo" class="media_img--rev"> <div class="media_body"> <h3 class="alpha">Welcome to Foo Corp</h3> <p class="lede">Foo Corp is the best,seriously!</p> </div> </div>
這段代碼一眼就能看明白media是一個塊,而media_img--rev是加了修飾符的media_img的變體,屬於media的元素,而media_body是一個尚未被改變過的屬於media的元素。
沒必要在每個地方都用上BEM,如:
.caps{text-transform:uppercase;}
這條不屬於任何一個BEM範疇,僅是一個單獨的樣式。
另一個沒有使用BEM的是:
.sit-logo{}
這是一個logo,可以把它寫成BEM格式:
.header{}
.header_logo{}
但沒必要這麽做,這個例子中網站logo恰巧在header內部,它也有可能在側邊欄或頁腳裏,一個元素的範圍可能開始於上下文,因此要確定只在需要用到BEM的地方才使用它。
BEM最難的部分之一是明確作用域從哪開始到哪結束,以及什麽時候使用它。隨著接觸的多了,慢慢就知道怎麽用了。BEM是一個非常有用、強大、簡單的命名約定,以至於讓你的前端代碼更容易閱讀和理解,更容易協作、控制,更加健壯和明確而且更加嚴密。
PS:此文原為一大神整理而來,印象深刻,固而,想在此記錄下來。原文出處不知。
BEM命名規範