BEMとは何か?CSSの設計思想について解説

BEMとは

BEMとは、Block(かたまり)、Element(要素)、Modifier(修飾)のそれぞれの頭文字を取った言葉です。CSSの設計思想の1つで、厳密に命名規則を定めることにより、クラス名だけでチーム全体に共通認識を持たせることができます。

BEMの設計思想

BEMはその名前のとおり、Block、Element、Modifierを用いてクラス名を命名します。可読性を向上させることを目的として考案された設計思想です。BlockとElementを「__(二重アンダースコア)」で、Modifierを「_(一つのアンダースコア)」で区切ることにより、そのクラスがどのブロックや要素、修飾を表すのかを一目で理解することができます。

Block

機能的に独立しており、再利用が可能な部品。WebページはBlockの集まりといえます。

Element

Blockに含まれる構成要素。inputやbuttonなどが該当します。

Modifier

BlockやElementの外観や状態、動作を定義します。

BEMの使用例

ここからは、フォームの作成を例として、Block、Element、Modifierの各設計思想に従い、コードをどのように記述していくかを見ていきましょう。

Block

<form class="search-form">
</form>

まずはBlockのみの状態です。ここではformタグに「search-form」というclassを付けました。

Block + Element

<form class="search-form">
    <input class="search-form__input">
    <button class="search-form__button">Search</button>
</form>

BlockにElementが加わった状態です。「search-form」というclassが付いたformタグの中にinputタグとbuttonタグが入っています。
そのため、inputタグにはformに付けられたclass名に「__」を加え、「input」を加えた「search-form__input」というclass名が付けられています。
同様に、buttonタグには「search-form__button」というclassが付けられています。

Block + Element + Modifier

<form class="search-form">
    <input class="search-form__input">
    <button class="search-form__button search-form__button_disabled">Search</button>
</form>

最後に、Modifierも加わった状態を見ていきます。上述の通り、Modifierは外観や状態、動作を定義する時に使うものです。
今回はbuttonタグに「search-form__button_disabled」というclassが付けられています。
例えば、「規約に同意しましたか?」というチェックボックスにチェックが入っていないと、ボタンを押せないという挙動をする場合は、あらかじめボタンを押せないように設定することがあります。
「ボタンが押せない」という状態を実現するためにclassを追加するため、「search-form__button」のclassに「_」を加え、その状態(disable)を続けた「search-form__button_disabled」というclassが付けられました。

Sassとは

Sass(Syntactically Awesome Style Sheets)とは、CSSを拡張したものです。SassにはSASSとSCSSという記法があります。BEMではSCSS記法を使用すると便利でしょう。上記の例を通常のCSSで書くと以下のとおりです。

.search-form {
    width: 200px;
}

.search-form__input {
    width: 50px;
}

.search-form__button {
    background-color: red;
}

.search-form__button_disabled {
    background-color: gray;
}

.search-form_focus {
    background-color: green;
}

これをSCSSで記述すると、以下のとおりです。SCSSで記述する場合、拡張子は「.scss」になります。

.search-form {
    width: 200px;

    &__input {
        width: 50px;
    }

    &__button {
        background-color: red;

        &_disabled {
            background-color: gray;
        }
    }

    &_focus {
    background-color: green;
    }
}

このようにSCSSを使用するとCSSを入れ子にすることができ、可読性が高まるでしょう。

なぜBEMが必要なのか

BEMは一見すると、その厳密な命名規則のため複雑になりやすいと思われがちです。しかし、CSSを見るとわかるように、何をどこに書けばいいのかがわかりやすいため、可読性はもちろんメンテナンス性に優れます。

特にチームで開発を行う際には、クラス名の意味するところが伝わりやすいため、新規のメンバーが加入しても戸惑うことはないでしょう。

CSSのメンテナンス性の悪さにより、レイアウトが崩れたり、JavaScriptが動かなくなったりすることを防ぐことができます。

参考