BEM是基於元件的web開發方法。其思想是將使用者介面分隔為獨立的塊,從而使開發複雜的UI介面變得更簡單和快,且不需要貼上複製便可複用現有程式碼。 BEM由Block、Element、Modifier組成。 選擇器裡用以下連線符擴充套件他們的關係:
- `__:雙下劃線用來連線塊和塊的子元素
- ` :僅作為連字元使用,連線塊或元素或修飾符的多個單詞(也可以直接寫成駝峰式)
- --:雙中劃線用來連線塊或元素的狀態(也可使用‘_’單下劃線表示)
示例: block-name_modifier-name block-name__element-name--modifier-name block-name_modifier-name--modifier-value block-name__element-name--modifier-name--modifier-value
基本概念
Block(塊)
程式碼片段可能被複用且這段程式碼不依賴其他元件即可用Block。塊可以互相巢狀,可以巢狀任意多層。
特點:
- 塊的名稱用於描述它的目的。如 menu、button
- 塊不能影響所在環境。這意味著不能為塊設定margin或position
- 只能使用class命名選擇器,而不能使用標籤或id選擇器
- 不依賴於頁面內其他塊或元素
Element(元素)
Element是Block的一部分,沒有獨立存在的意義。任何一個Element語義上是和Block繫結的。
特點:
- 與塊使用'__'連線。 如: block__item
- 用於描述它的目的。如:item、text
- 元素可以彼此巢狀,可以巢狀任意多層
- 元素總是屬於塊的一部分。所以類似於block__item1__item2的命名是不合法的
Modifier(修飾符)
Modifier是Block或Element上的標記。使用它們來改變樣式,行為或狀態。 與塊或元素連線符為'--'。
應用
相對另外的Blocks定位Block
最好的方式是混合使用block和element。解決block上不能設定margin、position。 例:
<body class="page">
<!-- header and navigation-->
<header class="header page__header">...</header>
<!-- footer -->
<footer class="footer page__footer">...</footer>
</body>
複製程式碼
.page__header {
padding: 20px;
}
.page__footer {
padding: 50px;
}
複製程式碼
Block內定位Elements
通過額外建立Block的子Element來定位巢狀。 例:
<body class="page">
<div class="page__inner">
<!-- header and navigation-->
<header class="header">...</header>
<!-- footer -->
<footer class="footer">...</footer>
</div>
</body>
複製程式碼
.page__inner {
margin-right: auto;
margin-left: auto;
width: 960px;
}
複製程式碼
關於命名
選擇器的命名必須完整且精確地描述它代表的BEM實體。 例:
.button {}
.button__icon {}
.button__text {}
.button_theme_islands {}
複製程式碼
我們可直接指導我們在處理一個塊元素。在html使用如:
<button class="button button_theme_islands">
<span class="button__icon"></span>
<span class="button__text">...</span>
</button>
複製程式碼
而下面的css就很難讓我們做出相同的判斷:
.button {}
.icon {}
.text {}
.theme_islands {}
複製程式碼
在我的git專案miniui中採用了BEM規範,使用sass實現了BEM。有興趣可以檢視:github.com/banyaner/mi…
參考: en.bem.info