BEM 是一種前端項目開發的方法學,由 Yandex 公司提出。css
BEM 的名稱來源於該方法學的三個組成部分的英文首字母,分別是塊(Block)、元素(Element)和修飾符(Modifier)。html
這裏推薦一篇關於使用 BEM 的組件命令規範的示例文章:bem naming cheat sheet by 9elements。前端
其中介紹了包括:麪包屑、按鈕、卡片、列表、導航、佈局、表單控件等一些組件的結構、命令示例。git
BEM(Block Element Modifier,塊元素修飾符)方法是 CSS 類的命名約定,旨在經過定義命名空間來解決範圍問題來使 CSS 更具可維護性。github
它原則上建議爲獨立的 CSS 類命名,而且在須要層級關係時,將關係也體如今命名中,這天然會使選擇器高效且易於覆蓋。markdown
block
表明了更高級別的抽象或組件。block__element
表明 .block
的後代,用於造成一個完整的 .block
的總體。block--modifier
表明 .block
的不一樣狀態或不一樣版本。.block {}
.block__element {}
.block--modifier {}
複製代碼
-
)分隔。__
)分隔。--
)來分隔。<ul class="menu">
<li class="menu__item menu__item--selected">Item 1</li>
<li class="menu__item">Item 2</li>
<li class="menu__item">Item 3</li>
</ul>
複製代碼
CSS 以下:模塊化
.menu {
list-style: none;
}
.menu__item {
font-weight: bold;
}
.menu__item--selected {
color: plum;
}
複製代碼
分析oop
.menu
封裝一個獨立的實體,它自己是有意義的。雖然塊能夠嵌套並相互交互,但在語義上它們是相等的;沒有優先級或等級制度。.menu__item
塊的一部分,沒有獨立的意義。任何元素在語義上都與其塊相關聯。.menu__item--selected
塊或元素上的修飾符。使用它們來改變外觀、行爲或狀態。BEM 的優勢在於所產生的 CSS 類名都只使用一個類別選擇器,能夠避免傳統作法中因爲多個類別選擇器嵌套帶來的複雜的屬性級聯問題。佈局
換句話說,其全部樣式規則的特異性(specificity) 都是相同的,也就不存在複雜的優先級問題,簡化了層疊規則。若是你還不是很瞭解特異性的話,能夠查閱以前寫的一篇 CSS 繼承、級聯和特異性。post
細分後,能夠從模塊化、可重用性、結構三部分進行理解:
除了 BEM 之外,還有其餘一些經常使用命名規範如:OOCSS、SMACSS 等。
OOCSS 表示的是面向對象 CSS(Object Oriented CSS),是一種把面向對象方法學應用到 CSS 代碼組織和管理中的實踐
OOCSS 有兩個重要的原則
SMACSS 表示的是可擴展和模塊化 CSS(Scalable and Modular Architecture for CSS)。
SMACSS 把 CSS 樣式規則分紅若干個不一樣的類別: