為什麼需要BEM
如果編寫專案的 CSS 程式碼只有你一個人,或者專案的 CSS 程式碼量很小,你可以用你喜歡,習慣的方式去組織你的 CSS 程式碼。但是專案更大,更復雜,有多人編寫專案的 CSS 程式碼(每個人有自己的風格),程式碼量大的時候,就需要一種統一形式去組織 CSS 程式碼,這時候 BEM 就派上用場了。
什麼是BEM
BEM(Block Element Modifier) 是一種命名CSS class的模式,使用這種模式可以讓 CSS 程式碼更加利於維護。標準的 BEM 寫法是 .block-name__element-name--modifier-name
。
Block
頁面上邏輯和功能獨立的,可複用的元件,可以巢狀並相互互動,但在語義上它們保持平等,可以存在頁面上不同的位置或不同專案中,保持樣式不變。
可以使用字母,數字,連字元進行命名,任何html元素都可以成為一個block,不依賴於頁面上的其他block或者element。
<header class="header"></header>
複製程式碼
.header {
color: #333;
background: #f5f5f5;
}
複製程式碼
Element
組成塊的一部分,內部的任何元素都與塊有關聯,不能在塊的外部使用。
<article class="article">
<h2 class="article__title"></h2>
<p class="article__content"></p>
</article>
複製程式碼
.article {
padding: 12px;
}
.article__title {
font-size: 1rem;
}
.article__content {
font-size: .9rem;
}
複製程式碼
Modifier
用來表示塊或者元素的狀態,外觀或者行為,不必須,可以選擇使用。
<button class="btn btn--disabled"></button>
複製程式碼
.btn {
color: #333;
background-color: #fff;
}
.btn--disabled {
color: #fff;
background-color: #6c757d;
}
複製程式碼
示例
這樣的卡片是一個單獨的塊
<div class="list-card">
<img class="list-card__img" />
<div class="list-card__content">
<a class="list-card__link"></a>
<p class="list-card__desc"></p>
<div class="list-card__stats">
<span class="list-card__stat"><i class="list-card__icon"></i></span>
<span class="list-card__stat"><i class="list-card__icon"></i></span>
<span class="list-card__stat"><i class="list-card__icon"></i></span>
<span class="list-card__date"></span>
</div>
</div>
</div>
複製程式碼
See the Pen BEM Demo by 輕鍵快碼 (@xrr2016) on CodePen.
常用CSS class名
包裹類: container, wrapper, outer, inner, box, header, footer, main, content, aside, page, section, block
狀態類: primary, secondary, success, danger, warning, info, error, Link, light, dark, disabled, active, checked, loading
尺寸類: large, middle, small, bigger, smaller
元件類: card, list, picture, carousel, swiper, menu, navs, badge, hint, modal, dialog
位置類: first, last, current, prev, next, forward, back
文字類: title, desc, content, date, author, category,label,tag
人物類: avatar, name, age, post, intro
結語
BEM 不是必須的,你依然可以選擇自己喜歡的方式編寫,組織你的 CSS 程式碼。使用 BEM 主要目的是為了在團隊開發中有一個統一的規範,更利於程式碼的維護,在別人接手你的程式碼,或者接手別的程式碼時能夠更加快速的理解程式碼。