CSS使用BEM命名規(guī)范

當(dāng)你看到一個class的時候牡昆,你想得到什么信息?###

  • 這個class用在什么地方征唬,作用是什么?
  • 是否在其他地方也有使用該class茁彭,修改會不會引起其他地方的樣式問題总寒?
  • class 是否在js中被使用?
  • ...

此時理肺,你最想一眼看到這個class就解決以上所有的問題摄闸,而BEM你值得擁有

什么是BEM

BEM(塊,元素妹萨,修飾符)由 Yandex 團隊提出的一種前端 CSS 命名方法論贪薪。是基于組件的Web開發(fā)的一種前端命名方法論,主要針對CSS眠副。其背后的想法是將用戶界面分為獨立的塊画切。即使使用復(fù)雜的UI,這也使界面開發(fā)變得容易和快速囱怕,并且允許重用現(xiàn)有代碼而無需復(fù)制和粘貼霍弹。

優(yōu)勢

  • 避免樣式?jīng)_突
  • 減小名稱長度
  • 提高可閱讀性
  • 增加樣式重用

怎么使用BEM

  1. Block

一個功能獨立的頁面組件,可以重復(fù)使用

塊不應(yīng)影響其環(huán)境娃弓,這意味著您不應(yīng)設(shè)置塊的外部幾何形狀(邊距)或位置

<!--
    good
-->
<div  class = "header" > </ div >

<!--
    bad
    red-text 是描述外觀
-->
<div  class = "red-text" > </ div >
  1. Element

塊的復(fù)合部分典格,不能單獨使用

元素全名的結(jié)構(gòu)為 block-name__element-name

<!-- 塊 `search-form` -->
<form class="search-form">
    <!-- `input button` 元素 在 `search-form` 塊中 -->
    <input class="search-form__input">
    <button class="search-form__button">Search</button>
</form>

一個元素始終是塊的一部分,而不是另一個元素台丛,因此元素名稱不可定義為 block__elem1__elem2 的層次結(jié)構(gòu)

<!--
    good
    遵循 `block-name__element-name`
-->
<form class="search-form">
    <div class="search-form__content">
        <input class="search-form__input">
        <button class="search-form__button">Search</button>
    </div>
</form>

<!--
    bad
    ' search-form__content__button ' 不遵循 `block-name__element-name`
-->
<form class="search-form">
    <div class="search-form__content">
        <input class="search-form__content__input">
        <button class="search-form__content__button">Search</button>
    </div>
</form>

元素始終是一個塊的一部分耍缴,您不應(yīng)該與該塊分開使用

<form class="search-form">
    <!-- 
        good
        元素在塊 search-form 的里面
     -->
    <input class="search-form__input">
    <button class="search-form__button">Search</button>
</form>

<form class="search-form"></form>
<!--
    bad 
    元素不在塊 search-form 的里面
-->
<input class="search-form__input">
<button class="search-form__button">Search</button>

  1. Modifier

定義塊或元素的外觀,狀態(tài)或行為的實體

  • Boolean
    修飾符全名的結(jié)構(gòu)遵循以下模式:
    • block-name_modifier-name
    • block-name--modifier-name
    • block-name_element-name_modifier-name
    • block-name_element-name--modifier-name
<form class="search-form search-form_focused">
    <input class="search-form__input">

    <!-- 'disabled' 是 'button' 的元素 -->
    <button class="search-form__button search-form__button_disabled">Search</button>
</form>
  • Key-value
    修飾符全名的結(jié)構(gòu)遵循以下模式:
    • block-name_modifier-name_modifier-value
    • block-name_modifier-name--modifier-value
    • block-name__element-name_modifier-name_modifier-value
    • block-name__element-name_modifier-name--modifier-value
<form class="search-form search-form_theme_islands">
    <input class="search-form__input">

    <!-- 
        good
        `button` 的修飾符 `size` 的值是 `m` 
    -->
    <button class="search-form__button search-form__button_size_m">Search</button>
</form>

<form class="search-form
             search-form_theme_islands
             search-form_theme_lite">
    <input class="search-form__input">

    <!-- 
        bad
        不可同時使用兩個不同值的相同修飾符 
    -->
    <button class="search-form__button
                   search-form__button_size_s
                   search-form__button_size_m">
   </button>
</form>

不能將修飾符與修飾的塊或元素隔離使用挽霉。修飾符應(yīng)更改實體的外觀防嗡,行為或狀態(tài),而不是替換它

<!--
    good
-->
<form class="search-form search-form_theme_islands">
    <input class="search-form__input">
    <button class="search-form__button">Search</button>
</form>

<!-- 
    bad
    缺少了塊名稱 'search-form' 
-->
<form class="search-form_theme_islands">
    <input class="search-form__input">
    <button class="search-form__button">Search</button>
</form>

在修飾符和元素名稱中添加塊名稱的好處

  • 有助于減少一個塊的元素和修飾符對另一個塊的實現(xiàn)的影響
  • 可更清楚的知道修飾符應(yīng)用于該DOM節(jié)點上的哪個實體
  • 唯一名稱使查找代碼或文件系統(tǒng)中的實體變得更加容易

什么時候應(yīng)該用 BEM 格式

  • 使用 BEM 的訣竅是侠坎,你要知道什么時候哪些東西是應(yīng)該寫成 BEM 格式的蚁趁。
  • 并不是每個地方都應(yīng)該使用 BEM 命名方式。當(dāng)需要明確關(guān)聯(lián)性的模塊關(guān)系時实胸,應(yīng)當(dāng)使用 BEM 格式他嫡。
  • 比如只是一條公共的單獨的樣式,就沒有使用 BEM 格式的意義:
.hide {
    display: none !important;
}

命名規(guī)范

雙下劃線風(fēng)格 block-name__elem-name--mod-name--mod-val

  • 名稱以小寫拉丁字母書寫庐完。
  • BEM實體名稱中的單詞由連字符(-)分隔钢属。
  • 元素名稱與塊名稱之間用雙下劃線(__)分隔。
  • 布爾修飾符用雙連字符(--)與塊或元素的名稱分隔门躯。
  • 修飾符的值與其名稱之間用雙連字符(--)分隔淆党。

重要提示: 注釋(--)中的雙連字符可能會在HTML文檔驗證期間導(dǎo)致錯誤。)
CamelCase style blockName-elemName_modName_modVal

  • 名稱以拉丁字母書寫。
  • 名稱中的每個單詞都以大寫字母開頭宁否。
  • 塊窒升,元素和修飾符名稱的分隔符與標(biāo)準(zhǔn)方案中的相同

React命名范式 BlockName-ElemName_modName_modVal

  • 名稱以拉丁字母書寫缀遍。
  • 塊和元素的名稱以大寫字母開頭慕匠。修飾符的名稱以小寫字母開頭。
  • 名稱中的每個單詞都以大寫字母開頭域醇。
  • 元素名稱與塊名稱之間用單個連字符(-)分隔台谊。
  • 修飾符的名稱和值之間的分隔符與標(biāo)準(zhǔn)方案中的相同。

沒有命名空間樣式 _available

  • 名稱以拉丁字母書寫譬挚。
  • 修飾符之前不包括塊或元素的名稱

此命名方案限制了mixs的使用锅铅,因為它無法確定修飾符屬于哪個塊或元素。

命名名稱使用簡寫

命名名稱使用全寫

常用的CSS命名

  1. vant 組件 css 命名
    使用的命名是雙下劃線風(fēng)格:block-name__element-name--modifier-name
<div class="van-doc">
    <div class="van-doc-header">
        <div class="van-doc-row">
            <div class="van-doc-header__top">
                <a class="van-doc-header__logo">搜索</a>
                <ul class="van-doc-header__top-nav">
                    <li class="van-doc-header__top-nav-item">
                        <a class="van-doc-header__logo-link">
                    </li>
                </ul>
            </div>
        </div>
    </div>
    <div class="van-doc-container van-doc-row van-doc-container--with-simulator">
        ......
    </div>
</div>
  1. weui 組件 css 命名
    使用的命名是 React命名風(fēng)格:block-name__element-name_modifier-name
<div class="page button js_show">
    <div class="page__hd">
        <h1 class="page__title">Button</h1>
        <p class="page__desc">按鈕</p>
    </div>
    <div class="page__bd">

        <div class="button-sp-area">
            <a class="weui-btn weui-btn_primary">頁面主操作</a>
            <a class="weui-btn weui-btn_loading">頁面主操作</a>
            <a class="weui-btn weui-btn_disabled>頁面主操作</a>
            <a class="weui-btn weui-btn_default">頁面次要操作</a>
            <a class="weui-btn weui-btn_warn">警告類操作</a>
        </div>
        ....
        <div class="button-sp-area cell">

校驗 BEM 規(guī)范工具

stylelint-selector-bem-pattern

相關(guān)參考

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末减宣,一起剝皮案震驚了整個濱河市盐须,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌漆腌,老刑警劉巖贼邓,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異闷尿,居然都是意外死亡塑径,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門填具,熙熙樓的掌柜王于貴愁眉苦臉地迎上來统舀,“玉大人,你說我怎么就攤上這事劳景∮颍” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵盟广,是天一觀的道長描融。 經(jīng)常有香客問我,道長衡蚂,這世上最難降的妖魔是什么窿克? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮毛甲,結(jié)果婚禮上年叮,老公的妹妹穿的比我還像新娘。我一直安慰自己玻募,他們只是感情好只损,可當(dāng)我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般跃惫。 火紅的嫁衣襯著肌膚如雪叮叹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天爆存,我揣著相機與錄音蛉顽,去河邊找鬼。 笑死先较,一個胖子當(dāng)著我的面吹牛携冤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播闲勺,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼曾棕,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了菜循?” 一聲冷哼從身側(cè)響起翘地,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎癌幕,沒想到半個月后衙耕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡序芦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年臭杰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谚中。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡渴杆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出宪塔,到底是詐尸還是另有隱情磁奖,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布某筐,位于F島的核電站比搭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏南誊。R本人自食惡果不足惜身诺,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望抄囚。 院中可真熱鬧霉赡,春花似錦、人聲如沸幔托。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至嗓化,卻和暖如春棠涮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背刺覆。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工严肪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人隅津。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓诬垂,卻偏偏與公主長得像劲室,于是被迫代替她去往敵國和親伦仍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,543評論 2 349

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

  • BEM 是對 CSS 命名的一種規(guī)范很洋,推崇將 WEB 頁面模塊化充蓝,從而提高代碼的重用度,減少后期維護的成本喉磁。原文 ...
    Jadyn閱讀 5,866評論 0 12
  • 什么是BEM BEM是Block(塊)谓苟、Element(元素)、Modifier(修飾符)的簡寫协怒,是一種組件化的 ...
    前白閱讀 510評論 0 1
  • BEM 基于組件方式的web開發(fā)方法涝焙,基本思想是將用戶界面分成獨立的模塊。 Block(塊) 通常指模塊孕暇,組件 B...
    xwwawj閱讀 933評論 0 2
  • 什么是 BEM 命名規(guī)范 Bem 是塊(block)仑撞、元素(element)、修飾符(modifier)的簡寫 塊...
    甘草倚半夏閱讀 696評論 0 0
  • [規(guī)范]css BEM書寫規(guī)范 BEM是基于組件的web開發(fā)方法妖滔。其思想是將用戶界面分隔為獨立的塊隧哮,從而使開發(fā)復(fù)雜...
    Maco_wang閱讀 967評論 0 1