CSS設計 BEMを使うとき

![ｆだｆ.jpg](https://qiita-image-store.s3.amazonaws.com/0/20635/459a97f0-a2cd-8800-c522-48bdc7d424f8.jpeg)
[参照元画像](http://www.nicovideo.jp/watch/sm29297974)

##はじめに
**良いCSS**を書く方法として、CSS設計がいくつかあります。

その前に、そもそも良いCSSとは？
・予測しやすい
・再利用しやすい
・保守しやすい
・拡張しやすい
とのことです。

で、良いCSSを書くための**CSS設計の1つ**として~~妖怪人間~~**BEM**があります。
もちろん**良いCSS**が達成できるなら、必要なし

今回はCSS設計ルールの1つである**BEM**についてまとめてみました。

##BEMとは
BEMとは、Block、Element、Modifierの略語

Block ⇒ 塊
Element ⇒ 要素
Modifier(kyeとvalueで表す) ⇒ 状態（変化）

##なぜBEMを使うの？
・長期間メンテナンスできる設計で、ファーストバージョンの開発をすばやくするため
・チームのスケーラビリティ
・コードの再利用性

私が使う理由は、**ブロックの再利用**があるかも！？と思った時にBEMを使用します。

たとえばランディングページとか
以前作ったサイト内にある、**ブロック**を他のサイトに利用したい時に、**HTMLとCSSのブロック**を抜き出しすことで再利用が簡単にできます。（継承とか諸々気にしなくて済む）

##BEMを使うための必要知識
1. Block、Element、Modifierという3つの概念の理解
2. class名の命名ルールの理解

**概念を理解して、命名ルールに基づいてコーディング**をすればOK

##Block、Element、Modifierという3つの概念
前提として**WebページはBlockの集まり**と考える。

###1. Block（ブロック）
Block
###2. Element（エレメント）
Blockの構成要素
###3. Modifier（モディファイア）
・BlockやElementのバリエーションの軸や、状態を表すプロパティの役割
・Modifierは名前（key）と値（value）を持ち、複数のModifierを同時に使用可能
・Blockに対するModifierと、Elementに対するModifier　の**2つ**ある

##例
Block
└　Element

```
<div class="search">                           <!--Block-->
  <input class="search__input" type="text">    <!--Element-->
  <input class="search__button" type="submit"> <!--Element-->
</div>
```

BlockとModifier
└　Element

```
<ul class="list  list_type_A">        <!--Block-->と<!--Modifier-->
  <li class="list__item"></li>　　　　　　　　　　　　　　　　<!--Element-->
  <li class="list__item"></li>　　　　　　　　　　　　　　　　<!--Element-->
</ul>

<ul class="list  list_type_B">        <!--Block-->と<!--Modifier-->
  <li class="list__item"></li>　　　　　　　　　　　　　　　　<!--Element-->
  <li class="list__item"></li>　　　　　　　　　　　　　　　　<!--Element-->
</ul>

```


Block
└　ElementとModifier

```
<ul class="menu">　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　<!--Block-->
  <li class="menu__item"></li>　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　<!--Element-->
  <li class="menu__item  menu__item_state_current"></li>　　　　<!--Element-->と<!--Modifier-->
  <li class="menu__item"></li>　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　<!--Element-->
</ul>
```

##class名の命名ルール
Block、Element、Modifierそれぞれの区切りに、
一貫したセパレーター 「**_**」　「**_ _**」 「**-**」を使用します。


基本ルールは3つ

1. BlockとElementとの区切り
2. Block(or Element)とModifierとの区切り、Modifierのkeyとvalueの区切り
3. BlockやElement名を、2つ以上の単語で表す場合の単語と単語との区切り

※大事なのはセパレーターの種類によって
・BlockとElementの区切りなのか?
・Modifierの区切りなのか?
・ただの単語の区切りなのか?
が、はっきり判別できるようにすること。

##まとめ
再利用するかも！？と感じたらBEMで組むが今のところの使用用途です。
他にこうゆう理由で私は使用しますとかあれば教えて頂けると嬉しいです。

##参考記事
###BEM
・[BEMを参考にしたCSS設計](http://qiita.com/mrd-takahashi/items/07dc3b4bad027daa2884)
・[BEMによるフロントエンドの設計](https://app.codegrid.net/entry/bem-basic-1)

###良いCSS設計について知る
・[Web制作者のためのCSS設計の教科書 モダンWeb開発に欠かせない「修正しやすいCSS」の設計手法](https://www.amazon.co.jp/Web%E5%88%B6%E4%BD%9C%E8%80%85%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AECSS%E8%A8%AD%E8%A8%88%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E3%83%A2%E3%83%80%E3%83%B3Web%E9%96%8B%E7%99%BA%E3%81%AB%E6%AC%A0%E3%81%8B%E3%81%9B%E3%81%AA%E3%81%84%E3%80%8C%E4%BF%AE%E6%AD%A3%E3%81%97%E3%82%84%E3%81%99%E3%81%84CSS%E3%80%8D%E3%81%AE%E8%A8%AD%E8%A8%88%E6%89%8B%E6%B3%95-%E8%B0%B7-%E6%8B%93%E6%A8%B9/dp/4844336355)
・[より良いCSSを書くための様々なCSS設計まとめ](http://uxmilk.jp/43386)