BEM:一套CSS命名的方法論

Block Element Modifier is a methodology that helps you to create reusable components and code sharing in front-end development

什么是BEM官边?(前端領(lǐng)域)

  • BEM是Block鞋邑,Element和Modifier的簡(jiǎn)稱背捌。
  • Block即塊崎坊,Element即元素,Modifier即修飾符。
  • 良好的溝通是建立在相同的認(rèn)知這個(gè)基礎(chǔ)上的。所以器瘪,不要擔(dān)心看不懂BEM。接下來(lái)會(huì)對(duì)BEM的命名規(guī)則進(jìn)行說(shuō)明:
  • Block(塊):有自身意義的一個(gè)獨(dú)立的實(shí)體绘雁。舉個(gè)??:
    Block

    根據(jù)表達(dá)內(nèi)容(即自身意義上)可以劃分為:Header橡疼、Container、Footer庐舟、LOGO
    此時(shí)可以定義出以下類選擇器名稱:header欣除、container、footer挪略、logo
    至于Input 和 Button 的劃分历帚,放到??說(shuō)。
  • Element(元素):語(yǔ)義上與塊相關(guān)杠娱,但是自身沒有獨(dú)立含義的塊的一部分挽牢。接著舉??:
    Element

    紅色下滑線標(biāo)注的即為Elements,藍(lán)色的是Elements所屬的Block摊求。
    MenuItem是Menu的一部分禽拔,單獨(dú)的MenuItem沒有獨(dú)立含義。
    Containers 和 其中的Pie Graph、Image因?yàn)槎际蔷哂袑?shí)意的元素睹栖,所以都是Block硫惕。
    Block中的Input 和 Button 也是Element。why野来?試想恼除,兩個(gè)元素脫離container且互相獨(dú)立開后,不難發(fā)現(xiàn)曼氛,input 和 button 就只剩下其本身的語(yǔ)義對(duì)應(yīng)功能豁辉,缺失了自身的實(shí)際意義。
  • Modifier(修飾符):塊或元素上的標(biāo)識(shí)舀患。用于標(biāo)識(shí)表現(xiàn)方式或者行為秋忙。舉??:


    Modifier

    Search塊的背景主題顏色是藍(lán)色,即可以寫作search theme blue;
    Input元素onfocus時(shí)构舟,即可以寫作input highlight;
    Button元素的處于禁用狀態(tài)時(shí),即可以寫作button disabled堵幽。

使用BEM會(huì)有哪些好處狗超?

  • 利于CSS代碼的維護(hù),使得css結(jié)構(gòu)更更友好朴下、更有意義(熟悉規(guī)則之后)

更加官方的解釋 http://getbem.com/faq/

BEM的使用規(guī)則

  • Block
    • 對(duì)象(實(shí)際的DOM)
      • 只要接收了一個(gè)類選擇器的節(jié)點(diǎn)都可以是一個(gè)Block
    • CSS中的應(yīng)用標(biāo)準(zhǔn)
      • 可以使用拉丁字母努咐,數(shù)字和破折號(hào)
      • 只使用類選擇器,意味著不能有標(biāo)簽選擇器和id選擇器
      • 同頁(yè)面中殴胧,不依賴其它的Block或者Element
HTML
<div class='block'></div>
CSS
.block{}

??和官方的示例有些出入渗稍,在我的理解中,命名方式其實(shí)可以直接合并到CSS的說(shuō)明中团滥,集合成為一個(gè)應(yīng)用時(shí)的規(guī)則

  • Element
    • 作用對(duì)象
      • Block中的節(jié)點(diǎn)都可以作為Element竿屹,且這些節(jié)點(diǎn)會(huì)有相同的上下文語(yǔ)義
    • CSS中的應(yīng)用標(biāo)準(zhǔn)
      • 可以包含拉丁字母,數(shù)字灸姊、破折號(hào)和下劃線
      • 由Block的名字加上兩個(gè)下劃線再加上Element的名字組成
      • 其他規(guī)則同block中的CSS命名標(biāo)準(zhǔn)一致
HTML
<div class='block'>
...
<div class='block__elem'></div>
</div>
CSS
//good
.block__elem { color: #042; } 
//bad
.block .block__elem { color: #042; }
div.block__elem { color: #042; }

示例中出現(xiàn)了依賴于標(biāo)簽選擇器和依賴于其他Block的情況

  • Modifier
    • 作用對(duì)象
      • 即可以是Block也可以是Element(目的是通過(guò)新增而不是修改原有選擇器的方式拱燃,來(lái)為Block、Element擴(kuò)展新的樣式)
    • CSS中的應(yīng)用標(biāo)準(zhǔn)
      • 由Block的名字或者Element的名字加上兩個(gè)破折號(hào)組成
      • 其他規(guī)則同Element中的CSS命名標(biāo)準(zhǔn)一致
HTML
//good
<div class="block block--mod">...</div>
<div class="block block--size-big block--shadow-yes">
  <div class='block__elem block__elem--mod'>...</div>
</div>
//bad
<div class="block--mod">...</div>
CSS
.block{}
.block--mod {}
.block__elem {}
.block__elem--mod {}
.block--size-big {}
.block--shadow-yes {}

示例中出現(xiàn)了單獨(dú)用Modifier描述標(biāo)簽的情況力惯。
根據(jù)BEM的原則block--mod 應(yīng)該是對(duì)block的補(bǔ)充碗誉。
如果想讓該Block既保持原有的樣式又能有新的樣式,只能讓
block--mod中增加block的內(nèi)容父晶,但是這樣就會(huì)導(dǎo)致哮缺,樣式之間又變的耦合了。

使用BEM小小實(shí)踐一下

場(chǎng)景

  • 當(dāng)前有個(gè)頁(yè)面菜單組件甲喝,整體為白色主題尝苇,要求鼠標(biāo)點(diǎn)擊過(guò)后,菜單子項(xiàng)會(huì)有樣式變化

分析

  • 菜單即為Block
  • 菜單的子項(xiàng)為Elements
  • 菜單有一個(gè)Modifier為 theme white
  • 菜單的子項(xiàng)有一個(gè)Modifier 為 active

代碼

HTML
<div class='menu menu--theme-white'>
  <div class='menu__item'></div>
  <div class='menu__item'></div>
  <div class='menu__item'></div>
  <div class='menu__item menu__item--active'></div>
</div>
CSS
.menu {}
.menu--theme-white {}
.menu__item {}
.menu__item--active {}

結(jié)束語(yǔ)

可以看到,BEM通過(guò)描述了一個(gè)簡(jiǎn)單的命名方法茎匠,來(lái)讓代碼更加易讀格仲、易理解,讓協(xié)作更加容易诵冒。盡管可能在一個(gè)大型項(xiàng)目的引入的初期凯肋,會(huì)給人帶來(lái)CSS類名冗長(zhǎng)的印象,但是我相信最終它會(huì)通過(guò)這種明確汽馋、健壯的命名結(jié)構(gòu)證明自己的價(jià)值侮东。
至于在實(shí)際項(xiàng)目中如何選擇,還是仁者見仁智者見智豹芯。畢竟這只一個(gè)工具悄雅。

本文參考自以下

Get BEM
BEM的定義

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市铁蹈,隨后出現(xiàn)的幾起案子宽闲,更是在濱河造成了極大的恐慌,老刑警劉巖握牧,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件容诬,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡沿腰,警方通過(guò)查閱死者的電腦和手機(jī)览徒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)颂龙,“玉大人习蓬,你說(shuō)我怎么就攤上這事〈肭叮” “怎么了躲叼?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)企巢。 經(jīng)常有香客問我押赊,道長(zhǎng),這世上最難降的妖魔是什么包斑? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任流礁,我火速辦了婚禮,結(jié)果婚禮上罗丰,老公的妹妹穿的比我還像新娘神帅。我一直安慰自己,他們只是感情好萌抵,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布找御。 她就那樣靜靜地躺著元镀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪霎桅。 梳的紋絲不亂的頭發(fā)上栖疑,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音滔驶,去河邊找鬼遇革。 笑死,一個(gè)胖子當(dāng)著我的面吹牛揭糕,可吹牛的內(nèi)容都是我干的萝快。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼著角,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼揪漩!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起吏口,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤奄容,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后产徊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嫩海,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年囚痴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片审葬。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡深滚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出涣觉,到底是詐尸還是另有隱情痴荐,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布官册,位于F島的核電站生兆,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏膝宁。R本人自食惡果不足惜鸦难,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望员淫。 院中可真熱鬧合蔽,春花似錦、人聲如沸介返。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至刃宵,卻和暖如春衡瓶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背牲证。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工哮针, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人从隆。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓诚撵,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親键闺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子寿烟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348