css 命名規範 BEM

在項目的開發過程中, 咱們每每由於日益複雜的css代碼而感到力不從心. 如何合理的組織css代碼成爲了咱們前端開發過程當中必須考慮到的環節.css

在讀element源代碼的時候, 瞭解到了BEM的命名風格.前端

使用 BEM 命名規範,理論上講,每行 css 代碼都只有一個選擇器。
BEM表明 「塊(block),元素(element),修飾符(modifier)」,咱們經常使用這三個實體開發組件。
在選擇器中,由如下三種符號來表示擴展的關係:git

-   中劃線 :僅做爲連字符使用,表示某個塊或者某個子元素的多單詞之間的鏈接記號。
--  雙中劃線線:用來描述一個塊或者塊的子元素的一種狀態
__  雙下劃線:雙下劃線用來鏈接塊和塊的子元素

type-block__element--modifier

塊(block)github

一個塊是設計或佈局的一部分,它有具體且惟一地意義 ,要麼是語義上的要麼是視覺上的。佈局

在大多數狀況下,任何獨立的頁面元素(或複雜或簡單)均可以被視做一個塊。它的HTML容器會有一個惟一的CSS類名,也就是這個塊的名字。ui

針對塊的CSS類名會加一些前綴( ui-),這些前綴在CSS中有相似 命名空間 的做用。spa

一個塊的正式(其實是半正式的)定義有下面三個基本原則:設計

CSS中只能使用類名(不能是ID)。
每個塊名應該有一個命名空間(前綴)
每一條CSS規則必須屬於一個塊。code

元素(element)orm

塊中的子元素是塊的子元素,而且子元素的子元素在 bem 裏也被認爲是塊的直接子元素。一個塊中元素的類名必須用父級塊的名稱做爲前綴。

修飾符(modifier)

一個「修飾符」能夠理解爲一個塊的特定狀態,標識着它持有一個特定的屬性。

用一個例子來解釋最好不過了。一個表示按鈕的塊默認有三個大小:小,中,大。爲了不建立三個不一樣的塊,最好是在塊上加修飾符。這個修飾符應該有個名字(好比:size )和值( small,normal 或者 big )。

element 的源碼當中充分實現了這種命名方式, 在使用scss的狀況下

/* BEM
 -------------------------- */
@mixin b($block) {
  $B: $namespace+'-'+$block !global;

  .#{$B} {
    @content;
  }
}

@mixin e($element) {
  $E: $element !global;
  $selector: &;
  $currentSelector: "";
  @each $unit in $element {
    $currentSelector: #{$currentSelector + "." + $B + $element-separator + $unit + ","};
  }

  @if hitAllSpecialNestRule($selector) {
    @at-root {
      #{$selector} {
        #{$currentSelector} {
          @content;
        }
      }
    }
  } @else {
    @at-root {
      #{$currentSelector} {
        @content;
      }
    }
  }
}

@mixin m($modifier) {
  $selector: &;
  $currentSelector: "";
  @each $unit in $modifier {
    $currentSelector: #{$currentSelector + & + $modifier-separator + $unit + ","};
  }

  @at-root {
    #{$currentSelector} {
      @content;
    }
  }
}
相關文章
相關標籤/搜索