# BEM
> Block__Element--Modifier
## 命名規範
```css
.block {} // 塊
.block__element {} // 元素
.block--modifier {} // 修飾符
```
* B(block):某一塊展示/功能區域,例如:.nav。
* E(element):這塊展示/功能區裡的某個元素,例如: .nav__item。
* M(modifier):某個元素或某個區塊的狀態,例如:.nav--hide, .nav__item--active 等。
### 範例
```html
<nav class="nav">
<a href="#" class="nav__item nav__item--active">當前狀態</a>
<a href="#" class="nav__item nav__item--hover">hover 狀態</a>
<a href="#" class="nav__item nav__item--normal">正常狀態</a>
</nav>
```
```css
.nav {
&__item {
&--active {
}
&--hover {
}
&--normal {
}
}
}
```
## 使用規則
:::info
BEM 命名和 DOM 沒有很嚴格的關係,所以無論子元素的嵌套程度有多深都沒有關係。命名約定只是用來幫助你辨識子元素和父層元件的關係
:::
:::danger
避免多個元素級的命名 ~~Block__Element__Element--Modifier~~
:::
:-1: bad example
```html
<div class="c-card">
<div class="c-card__header">
<!-- Here comes the grandchild… -->
<h2 class="c-card__header__title">Title text here</h2>
</div>
<div class="c-card__body">
<img class="c-card__body__img" src="some-img.png" alt="description">
<p class="c-card__body__text">Lorem ipsum dolor sit amet, consectetur</p>
<p class="c-card__body__text">Adipiscing elit.
<a href="/somelink.html" class="c-card__body__text__link">Pellentesque amet</a>
</p>
</div>
</div>
```
:+1: good example
```html
<div class="c-card">
<div class="c-card__header">
<h2 class="c-card__title">Title text here</h2>
</div>
<div class="c-card__body">
<img class="c-card__img" src="some-img.png" alt="description">
<p class="c-card__text">Lorem ipsum dolor sit amet, consectetur</p>
<p class="c-card__text">Adipiscing elit.
<a href="/somelink.html" class="c-card__link">Pellentesque amet</a>
</p>
</div>
</div>
```
## 命名空間與元件 BEM 的搭配使用
### 範例
```html
<ul class="l-grid">
<li class="l-grid__item">
<div class="c-card">
<div class="c-card__header">
[…]
</div>
<div class="c-card__body">
[…]
</div>
</div>
</li>
<li class="l-grid__item">
<div class="c-card">
<div class="c-card__header">
[…]
</div>
<div class="c-card__body">
[…]
</div>
</div>
</li>
<li class="l-grid__item">
<div class="c-card">
<div class="c-card__header">
[…]
</div>
<div class="c-card__body">
[…]
</div>
</div>
</li>
<li class="l-grid__item">
<div class="c-card">
<div class="c-card__header">
[…]
</div>
<div class="c-card__body">
[…]
</div>
</div>
</li>
</ul>
```
## 參考資料
* [GitHub - chris-pearce/css-guidelines: Sensible CSS Guidelines for large scale projects 🚀](https://github.com/chris-pearce/css-guidelines?tab=readme-ov-file#bem-like-naming)
* [GitHub - zhaotoday/bem: CSS 命名规范 - BEM 的使用。](https://github.com/zhaotoday/bem?tab=readme-ov-file)
* [和BEM的战斗:10个常见问题及如何避免](https://segmentfault.com/a/1190000006135647)