BEM

Block,Element,Modifierの単位で分解し、定義すること

3つの頭文字をとって「BEMエンティティ」と呼びます

BEMエンティティにおいて、クラス名は半角英数字の小文字

例)container box→container-box

Block

BEM

論理的かつ機能的に独立したページモジュール

???
自分も???です(笑)

クラス名の基準として、「それが何なのか」を表します

「見た目」を表す命名は適切ではないです

<div class='red-text'></div>

みたいな「赤い文」のように見た目だけのクラス名は避けるようにしましょう

Element

Element

Blockを構成し、Blockの外では独立して使用できないもの

Elementのクラス名はBlockの名前を継承、アンダースコアを二つ記述した後にElementの名前をつける

単語が1つの場合 box__item

単語が複数の場合 box-name__item-name

Blockのパターンと同じように「それが何なのか」を表せるように定義します

ネスト

BEMでは、Elementの中にElementがネストされた命名を推奨していません

  • Block内でElementが移動することがある
  • いくつかのElementがない状態で、使用することがある
  • Elementを後から追加することがある

などの問題点があります

悪い例

<div class='box__item'><a class='box__item__link'></a></div>

親要素のクラス名になっています

<div class='container__item'><a class='menu__link></a></div>

a要素が親のElement名を含まないようにしています

Modifier

Modifier

BlockまたはElementの見た目や状態、振る舞いを定義

単独で使用することはできず、BlockかElementのクラス名がある状態で、2つ目以降のクラス名とします

悪い例

<a class="button_size_s"></a>

2つ名のクラス名

<a class="button button_size_s"></a>

Modifierは2つのタイプに分けれます

真偽値

1語で完結するようなタイプ

「disbaled(使用不可)」「focused(フォーカスされている)」「actived(アクティブになっている)」

などが、あります

<li class=box__item box__item__actived'>box1</li>

キーと値のペア

主に見た目と振る舞いに関する指定の際に使用されます

もう少し詳しく言うと、『何』が『どう』であるかです

Mix

実はもう一つ、重要なものがあってそれが「Mix」と、言う考え方です

Mix

単一のDOMノードに、異なるBEMエンティティが複数付加されたインスタンス

一つのHTML要素に、役割の異なる複数のクラスが付いてる状態

  • コードを複製することなく、複数のBEMエンティティの振る舞いやスタイルを組み合わせる
  • 既存のBEMエンティティから、新しいモジュール※を作成する

※「意味を持つインターフェースコンポーネント」

まとめ

...難しいです( ̄◇ ̄;)

いろいろBEMの規制があるのですが、ここをしっかりしておかないとcssで混乱を招きます

BEMのコツ

  • DOMモデルではなく、Blockという単位をベースに考える
  • IDセレクターと要素型セレクターは使用しない
  • 子(孫)セレクターでネストされるセレクターの数は、なるべく少なくする
  • 名前の衝突を避けるために、命名規制にきちんと従ったクラス名をつける
  • Blockなのか、Elementなのか、Modifierなのかを常に意識する
  • BlockまたはElementで変更が頻繁に起こりそうなスタイルのプロパティは、Modifierに移しておく
  • Mixを積極的に使用する
  • 管理性を高めるために、Blockはひとつひとつがなるべく小さくなるように分割する
  • Blockを積極的に再利用する

ちょっと、難しい記事になりました(>人<;)

公式ドキュメントサイト

おすすめの記事