BEM規(guī)范入門

背景

經(jīng)常我們在給一個大型網(wǎng)站寫頁面的css時候题禀,經(jīng)常會出現(xiàn)如下的css編寫效果。

  .container .form .input  .warpper .icon {
        /*寫入你需要的css*/
    }  

  .container .form .text  {
       /*寫入你需要的css*/
  }

 .page .warpper .layout .content{
       /*寫入你需要的css*/
  }

這樣的css編寫效果就是傳統(tǒng)的命名空間的方式寫css峭跳,它很好得解決了編寫單純?nèi)謈ss互相影響的問題,但是另外一方面它也引申出了一些問題:

  • 維護css的時候,只看HTML误证,我們無法知道當前css的作用范圍,css的表現(xiàn)不夠一目了然修壕。
  • 如果我要覆蓋css的樣式愈捅,可能我就需要利用css的優(yōu)先級的規(guī)則去覆蓋原有的css,這樣就會導致css優(yōu)先級競爭慈鸠。
  • css編寫的時候復用性不高蓝谨,當存在多個樣式一致的時候,我們可能會選擇減少命名空間的方式來提升當前css的作用范圍青团,但是可能會導致css樣式?jīng)_突的問題譬巫。

由于我們的行業(yè)很棒,我們有很多推薦的解決方案督笆。因為專家們的紛紛加入芦昔,于是我們有 BEM,OOCSS娃肿,SMACSS咕缎,Atomic Design 等許多選擇。

CSS 規(guī)范究竟在解決什么問題

  • 我必須 立即知道編輯一個 class 是否安全咸作,會不會干擾其他 CSS锨阿。這是最重要的,特別是當我需要在短時間內(nèi)進行修改時记罚。我不想因為改變一處而破壞別的東西墅诡。
  • 我必須立即知道一個 class 放在這個偉大工程中的什么地方,以防止大腦過載桐智。這樣我就可以快速修改 style末早,而不必在整個工程里前后引用。
  • class 必須 盡可能少说庭,因為看到一長串的 class 時我頭很暈然磷。
  • 我必須 立即知道一個組件是否使用了 JavaScript,所以如果我改變了它的 CSS刊驴,我不會意外地破壞任何組件姿搜。

在我的探索中寡润,BEM規(guī)范進入了我的視線。

什么是BEM

如果你從未接觸過BEM舅柜,那么你第一次接觸到BEM的時候它是長這個樣子的梭纹。


.block { /* styles */ }
.block__element { /* styles */ } 
.block--modifier { /* styles */ }

期中的BEM分別對應blockelementmodifier致份。

什么是塊

在規(guī)范中变抽,塊表示一個組件的意思,這樣看上去有點抽象氮块,我們可以通過例子來學習绍载,假設(shè)你要寫一個按鈕的組件。我們只需要設(shè)置了一個 .button 類的按鈕滔蝉,然后可以在任何<button>按鈕上使用該類击儡,就可以生成該組件的傳統(tǒng)樣式。

使用.button而不是用button的原因是因為類允許無限的可重用性蝠引,而即使是最基本的元素也可能改變樣式曙痘。

但是在實際的項目使用中,我們會發(fā)現(xiàn)一個按鈕可能是大按鈕立肘,可能是小按鈕边坤,也可能是紅色的,或者黃色的谅年。于是就引申出了BEM的modifier茧痒。

什么是修飾符

修飾符是改變某個塊的外觀的標志。要使用修飾符融蹂,可以將 --modifier 添加到塊中旺订。
假如我們要添加一個默認按鈕,一個主要按鈕超燃,一個大按鈕区拳,一個小按鈕,一個主要的小按鈕意乓。
我們可以這樣:

 <button class=".button .button--default"></button>  
 <button class=".button .button--primary"></button>
 <button class=".button .button--large"></button>   
 <button class=".button .button--small"></button> 
 <button class=".button .button--primary .button--small"></button> 
       

如果會scss或任何其他預處理器的mixin樱调,我們就可以減少一些class,寫成這樣:

 <button class=".button--default"></button>  
 <button class=".button--primary"></button>
 <button class=".button--large"></button>   
 <button class=".button--small"></button> 
 <button class=".button--small--primary"></button> 

什么是元素

元素是塊的子節(jié)點届良。為了表明某個東西是一個元素笆凌,你需要在塊名后添加 __element。所以士葫,如果你看到一個像那樣的名字乞而,比如 form__row ,你將立即知道 .form 塊中有一個 row 元素慢显。

<form class="form" action="">
   <div class="form__row"> 
  </div> 
</form> 
<style>
   .form__row { /* styles */ }
</style>

BEM 元素有兩個優(yōu)點 :

  1. 你可以讓 CSS 的優(yōu)先級保持相對扁平爪模。
  2. 你能立即知道哪些東西是一個子元素欠啤。

總結(jié)

以上就是簡單的BEM規(guī)范和使用方法的簡單介紹∥莨啵基本的BEM規(guī)范的使用可以解決之前提到的一些問題:

  1. class 的數(shù)量必須盡可能少 跪妥,防止了css的優(yōu)先級競爭
  2. 立即知道一個 class 放在這個偉大工程中的什么地方声滥,以防止大腦過載。

但是還有在實際應用中還有一些問題沒有解決侦香。

  1. 我必須 立即知道組件是否使用 JavaScript 落塑。
  2. 我必須 立即知道編輯一個 class 是否安全,會不會干擾其他 CSS。

剩下的問題罐韩,我們就需要命名空間配合BEM來解決憾赁。

附錄:

編寫模塊化CSS:BEM
編寫模塊化的CSS:命名空間

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市散吵,隨后出現(xiàn)的幾起案子龙考,更是在濱河造成了極大的恐慌,老刑警劉巖矾睦,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晦款,死亡現(xiàn)場離奇詭異,居然都是意外死亡枚冗,警方通過查閱死者的電腦和手機缓溅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赁温,“玉大人坛怪,你說我怎么就攤上這事」赡遥” “怎么了袜匿?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長稚疹。 經(jīng)常有香客問我居灯,道長,這世上最難降的妖魔是什么内狗? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任穆壕,我火速辦了婚禮,結(jié)果婚禮上其屏,老公的妹妹穿的比我還像新娘喇勋。我一直安慰自己,他們只是感情好偎行,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布川背。 她就那樣靜靜地躺著贰拿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪熄云。 梳的紋絲不亂的頭發(fā)上膨更,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音缴允,去河邊找鬼荚守。 笑死,一個胖子當著我的面吹牛练般,可吹牛的內(nèi)容都是我干的矗漾。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼薄料,長吁一口氣:“原來是場噩夢啊……” “哼敞贡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起摄职,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤誊役,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后谷市,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛔垢,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年迫悠,在試婚紗的時候發(fā)現(xiàn)自己被綠了啦桌。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡及皂,死狀恐怖甫男,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情验烧,我是刑警寧澤板驳,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站碍拆,受9級特大地震影響若治,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜感混,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一端幼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧弧满,春花似錦婆跑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽犀忱。三九已至,卻和暖如春扶关,著一層夾襖步出監(jiān)牢的瞬間阴汇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工节槐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留搀庶,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓铜异,卻偏偏與公主長得像哥倔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子熙掺,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容