【HTML設計思想 / クラス命名】最高に管理が楽なわたし的BEM

## はじめに

[爆速コーディング](https://qiita.com/natsu_meee/items/2046798f794686b9f437)の記事で HTML の設計を楽にするため・HTML をブロック管理する感覚を掴むためにに BEM を取り入れることをおすすめしました。
Block, Element, Modifier という設計概念を持つ BEM の中でも、さらに様々な BEM 命名規則が存在するようですが（これらを今回は「BEM 系」とします。）、私が上記記事で BEM と指したのは BEM の中でも**MindBEMding**というもので、現在「BEM 系」の中で最もポピュラーなものです。「BEM」と呼んだら多くは**MindBEMding**を指します。

しかし私が実際に HTML／CSS 設計に取り入れているのは**MindBEMding**ではありません。（オススメしておいて・・・）

一貫性をもって管理しやすい**MindBEMding**にもデメリットと思われる点があり、そこを解消したのが現在私が取り入れている命名規則です。
Block, Element, Modifier の設計思想には変わりがありません。命名規則だけが変わります。

BEM設計はブロック（モジュール）管理ができる考え方として良い設計だと思っていたため、シンプルで管理しやすい = 楽な命名規則を求め、BEMをもとにした命名規則は色々試しました。
様々なプロジェクトで試してPDCAを回して、やっと現在の命名規則に落ち着きました。
自信を持っておすすめできる命名規則ですので、命名に悩む方にはぜひお試し頂きたいです！

BEM の設計概念をある程度理解した上であれば取り入れやすい命名規則なので、ぜひ本記事を参考にして頂けたら幸いです。

**広まれ〜〜！**

### まとめへショートカット
[わたし的BEM命名規則まとめ](https://qiita.com/natsu_meee/items/57bb1f6a183b62832382#%E3%81%BE%E3%81%A8%E3%82%81)

ちなみに、私の命名規則ってこれと同じじゃん！と思える既存の命名規則見つけて喜んでいたのですが、本記事を書くにあたって、よく説明を確認したらちょっと違いました。
一緒だと思っていたので、本記事はもともとそちらの紹介にするつもりだったのですが。。
仕方がないので、「わたし的BEM」に改めました。

ここまで出来たら良いよね・・・でもめっちゃクラス名長くなるなあっていう Chainable BEM Modifiers。
[Chainable BEM](https://www.slideshare.net/jordanlewiz/chainable-bem-modifiers)

ああ、私のクラス命名もChainable BEMと呼びたかった。

## MindBEMding の復習

BEM の基礎を復習したい方へ
前回 BEM の概要をご説明しました！

- [クラス命名を BEM に頼ってみる](https://qiita.com/natsu_meee/items/2046798f794686b9f437#%E3%82%AF%E3%83%A9%E3%82%B9%E5%91%BD%E5%90%8D%E3%82%92bem%E3%81%AB%E9%A0%BC%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B)

MindBEMdingは長いクラス名になってしまうため、コードが読みづらくなるのがデメリットだと言われています。

## わたし的 BEM の命名規則

Block, Element は**MindBEMding**と異なる点はありません。全てが同じです！
Modifire だけ異なります。

**MindBEMding**とコードを比べながらご説明出来ればと思います。


たとえばこのようなボタンのパターンがあった場合
![example_button.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554362/27acbca4-b2aa-5f1a-f24e-7e513f63b7ba.png)

BEM の設計概念上では、ボタンという要素を Block とし、そのボタンのバリエーション・パターンとして存在する「青背景」を Modifier とします。

この BEM 設計の上、**MindBEMding**だと以下の様にクラス命名・スタイル管理ができます。

### MindBEMding

```html:index.html
<button class="button">標準ボタン</button>
<button class="button button--blue">青ボタン</button>
```

```scss:style.scss
.button {
  width: 100px;
  padding-top: 8px;
  padding-bottom: 8px;
  border: none;
  background-color: grey;
  color: #fff;
}

.button--blue {
  background-color: blue;
}
```

クラス名に着目して、「button」も「blue」も文字数が少ないため今回は気になりませんが
これが「main-visual」と「registerer」だったら・・・
（例えで作りましたが、会員登録者にのみ見えるメインビジュアルを実装したい場合にありそうなクラス名です。）

`<div class="main-visual main-visual--registerer">`

となりますし、ここに Element まであると

`<div class="main-visual__text main-visual__text--registerer">`

こんなにタグが長くなっちゃうんです！
こんなのがたくさんあったら、**コードが冗長に見えます**よね。そのため嫌煙されることがあるのです。

わたし的 BEM はこの冗長化を解決しています。
先程のボタンは以下の様にクラス命名・スタイル管理ができます。

### わたし的 BEM

```html:index.html
<button class="button">標準ボタン</button>
<button class="button --blue">青ボタン</button>
```

```scss:style.scss
.button {
  width: 100px;
  padding-top: 8px;
  padding-bottom: 8px;
  border: none;
  background-color: grey;
  color: #fff;

  &.--blue {
    background-color: blue;
  }
}

// アンチパターン: 一見Modifierは汎用的に使えそうなクラスに見えるが、`.button--blue`の設計を保つべき。
// よって汎用的なクラスにはせず、あえて`.button`のサブクラスとして置かれた場合のみにスタイルが聞くようにセレクタを指定する。
// .--blue {
//  background-color: blue;
// }

```

Modifier が`.block--modifire`ではなく、`.--modifire`のみになってすっきりしました。
Element がある場合も`.block__element--modifier`が`.modifier`になります。

またコードにはアンチパターンも記載しています。
**MindBEMding**から命名規則が変わったことで汎用的な`.--blue`クラスとしてもスタイル指定が出来ますが、あえて「ボタンの青背景パターン」としてしか使えないようにセレクタを限定することが BEM 設計を保つために重要なポイントです。

これで先程は冗長だったコードも短く出来ます！

```html:index.html
<div class="main-visual main-visual--registerer"></div>
<p class="main-visual__text main-visual__text--registerer"></p>

=>

<div class="main-visual --registerer"></div>
<p class="main-visual__text --registerer"></p>
```

文字数が減ったことはもちろんですが、ぱっとタグを見たときも見やすくなったと思います。
読みやすさ = 管理しやすさ・触りやすさです。とっても大事！
**MindBEMding**から比べても Modifier のみの違いなので、地味な変化ではありますがこれがファイル全体への変更となると大きく変わってきます。


## まとめ
最後にわたし的BEM命名規則のまとめです。

- Blockクラスは`.block`（**MindBEMding**と同じ）
- Elementクラスは`.block__element`であり、親Blockの中でのみ存在できる。（**MindBEMding**と同じ）
- Modifireクラスは`.--modifier`
- セレクタとしては、`.--modifier`に直接スタイルを付けることはしない。汎用的なクラスとはせず、Blockクラスまたは、Elementクラスと共に用いられたときのみにスタイルが効くように指定する。
- Block, Element, Modifier それぞれ複数単語から成るときにはケバブケース（全て小文字&単語をハイフンで繋ぐ）を用いる。（**MindBEMding**と同じ）

ちなみに、一時期`.--modifier`を`.-modifier`にしていたこともありました。
ハイフンを1つにしていたんですが、そうするとファイル内でModifier名を検索する際に`-modifier`と検索して、BlockやElementクラス内でハイフンで繋いでいた同単語にも引っかかってしまいます。
このようにModifire以外も検索に引っかかる可能性が出てしまうため、現在は`.--modifier`と、ハイフンを2連続にしています。
検索性も大事ということ！