css BEM書寫規範

midsummer發表於2018-12-16

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。塊可以互相巢狀,可以巢狀任意多層。

特點:

  1. 塊的名稱用於描述它的目的。如 menu、button
  2. 塊不能影響所在環境。這意味著不能為塊設定margin或position
  3. 只能使用class命名選擇器,而不能使用標籤或id選擇器
  4. 不依賴於頁面內其他塊或元素

Element(元素)

Element是Block的一部分,沒有獨立存在的意義。任何一個Element語義上是和Block繫結的。

特點:

  1. 與塊使用'__'連線。 如: block__item
  2. 用於描述它的目的。如:item、text
  3. 元素可以彼此巢狀,可以巢狀任意多層
  4. 元素總是屬於塊的一部分。所以類似於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

相關文章