フロントエンド - CSS・スタイリング

BEM(Block Element Modifier) べむ

CSS設計クラス命名規則BlockElementModifierコンポーネント設計
BEMについて教えて

簡単に言うとこんな感じ!

CSSのクラス名の付け方ルールだよ!「ボタン」「ボタンの中のテキスト」「押せない状態のボタン」みたいに、部品・部品の中身・状態をダブルアンダースコアとダブルハイフンで区切って名前を付けるんだ。チームで作業しても名前がかぶらなくて見やすくなるってこと!


BEMとは

BEM(Block Element Modifier)は、CSSのクラス名を一定のルールに従って命名するためのCSS設計手法です。Yandex(ロシアの検索エンジン企業)が大規模なWebサービス開発の現場で生み出したもので、「Block(ブロック)」「Element(エレメント)」「Modifier(モディファイア)」の3つの概念を組み合わせてクラス名を構成します。

CSSは書き方の自由度が高い反面、プロジェクトが大きくなるにつれてクラス名の衝突・スタイルの意図しない上書き・どこに何が書いてあるかわからない「スパゲッティCSS」問題が起きやすい言語です。BEMはそうした混乱を防ぐために、クラス名だけを見てHTML上の役割・階層・状態がわかることを目指した命名規則です。

発注側・非エンジニアにとって重要なのは、「BEMを採用しているか?」という問いがコード品質・保守性の指標になるという点です。BEMが徹底されたCSSは、後から別のエンジニアが修正しやすく、長期運用コストを下げる効果があります。


BEMの3要素と記法

BEMは3つの概念と、それを表す記号によって成り立っています。

要素英語役割記法
BBlock独立した意味を持つUI部品(例: ナビゲーション、カード、ボタン).block
EElementBlockを構成する子要素(Block単体では意味を持たない).block__element(アンダースコア2つ)
MModifierBlockやElementの見た目・状態・バリエーション.block--modifier(ハイフン2つ)

クラス名の具体例

<!-- カードコンポーネントの例 -->
<div class="card card--featured">
  <img class="card__thumbnail" src="..." alt="...">
  <div class="card__body">
    <h2 class="card__title">記事タイトル</h2>
    <p class="card__description">説明文...</p>
    <a class="card__button card__button--disabled">続きを読む</a>
  </div>
</div>
/* 対応するCSS */
.card { /* カード全体 */ }
.card--featured { /* 注目カードのスタイル */ }
.card__thumbnail { /* カード内のサムネイル */ }
.card__title { /* カード内のタイトル */ }
.card__button { /* カード内のボタン */ }
.card__button--disabled { /* 無効状態のボタン */ }

覚え方:「部品__中身—状態」

BEMの記法は「ダブルアンダーは子供(Element)、ダブルハイフンは状態(Modifier)」と覚えると混乱しません。アンダースコアが2本で「部品の内側に潜る」、ハイフンが2本で「見た目が変わる」イメージです。

BEM命名の3原則

  1. クラス名はBlock名から始める.title より .card__title のほうが「どのBlockのtitleか」が明確
  2. Elementはネストしない.card__body__title ではなく .card__title と書く(階層は名前で表現しない)
  3. Modifierは単独では使わない.card__button--disabled は必ず .card__button と一緒に使う

歴史と背景

  • 2005年頃 — Yandexの開発チームが大規模サービスの保守性向上のために社内でBEMを考案
  • 2010年 — Yandexが外部に向けてBEMの概念を公開・ドキュメント化
  • 2012年頃 — 英語圏の開発コミュニティに広まり、CSS設計の「定番手法」として認知される
  • 2013〜2015年 — CSS設計の議論が活発化。OOCSS・SMACSS・BEMが三大手法として比較されるように
  • 2015年以降ReactVue.jsなどのコンポーネント指向フレームワークが普及。CSSモジュールやCSS-in-JSが登場するが、BEMの考え方はコンポーネント設計の基礎として影響し続けている
  • 現在Tailwind CSSなどのユーティリティファーストCSSが台頭する一方、BEM自体は中・大規模プロジェクトやデザインシステム構築で今も広く採用される

他のCSS設計手法との比較

CSSの設計手法はいくつか存在します。BEMがどのような位置づけにあるか比較してみましょう。

手法特徴向いているプロジェクト規模
BEMクラス名の命名規則に特化。シンプルで学習コストが低い中〜大規模
OOCSSCSSをオブジェクト(構造と見た目)に分離する設計思想中〜大規模
SMACSSスタイルをBase/Layout/Module/State/Themeの5カテゴリに分類大規模
FLOCSSOOCSSとSMACSSをベースにした日本発の設計手法中〜大規模
CSS Modulesビルドツールでクラス名を自動でユニーク化。衝突をツールで防ぐコンポーネントフレームワーク利用時
Tailwind CSSユーティリティクラスを直接HTMLに記述。命名不要小〜大規模(スタイル統一重視)

BEMの構造をSVGで見る

Block: card 【Block】独立したUI部品 card__thumbnail 【Element】Block内の子要素 card__title 記事タイトルテキスト card__button 続きを読む Modifier の例 card--featured 注目カード(Block全体に適用) card__button--disabled 無効ボタン(Elementに適用) card--size-large 大サイズ(バリエーション) 【Modifier】見た目・状態の変化 -- (ダブルハイフン) で区切る __ (ダブルアンダースコア) で区切る

関連用語

  • CSS(カスケーディングスタイルシート) — Webページの見た目を定義するスタイル言語
  • HTML — Webページの構造を記述するマークアップ言語。BEMのクラスを実際に書く場所
  • コンポーネント指向 — UIを独立した部品単位で設計する考え方。BEMのBlock概念と相性がよい
  • Sass/SCSS — CSSを拡張した言語。BEMと組み合わせてネスト記法でBlock・Elementを整理することが多い
  • CSS Modules — ビルド時にクラス名を自動でスコープ化する仕組み。BEMと同じ「スタイル衝突防止」を別アプローチで解決
  • Tailwind CSS — ユーティリティクラスを直接使うBEMとは対照的なCSS設計手法
  • デザインシステム — UI部品・スタイルを組織全体で統一管理する仕組み。BEMはその命名基盤になることが多い
  • フロントエンド — ブラウザ上で動くUI全般を指す領域。BEMが活躍するフィールド