BEMとは?CSS設計でよく使われる命名規則を解説

CSSを書いていると、「クラス名が増えて管理しづらい」「修正したら別の箇所まで崩れた」といった問題に直面することがあります。
特にWebサイトの規模が大きくなるほど、CSSの保守性は重要になります。
そこで多くの現場で採用されているのがBEM(Block Element Modifier)という命名規則です。
BEMを理解すると、クラス名を見ただけで役割が分かるようになり、チーム開発や長期運用でも管理しやすいCSSを書くことができます。
この記事では、BEMの基本から実践的な使い方まで詳しく解説します。
Contents
BEMとは
BEM(ベム)とは、CSSのクラス名を統一的なルールで命名するための設計手法です。
BEMは以下の3つの要素で構成されています。
- Block(ブロック)
- Element(要素)
- Modifier(修飾子)
この3つを組み合わせることで、クラス名だけで構造や役割を明確に表現できます。
BEMが生まれた背景
CSSにはクラス名の付け方に決まりがありません。
そのため、開発が進むにつれて以下のような問題が発生しやすくなります。
- class名の意味が分からなくなる
- 同じ名前を別用途で使ってしまう
- 修正時に他の箇所へ影響が出る
- チームメンバーごとに命名ルールが異なる
BEMはこうした問題を解決するために考案された命名規則です。
BEMの基本構造
BEMでは以下のような記法を使用します。
<div class="card">
<h2 class="card__title">タイトル</h2>
<p class="card__text">説明文です。</p>
</div>クラス名の意味は次の通りです。
| クラス名 | 役割 |
|---|---|
| card | Block |
| card__title | Element |
| card__text | Element |
このように、どの要素がどのブロックに属しているのかが明確になります。
Blockとは
Blockは独立したコンポーネントです。
例えば以下のようなものがBlockになります。
- header
- footer
- card
- button
- menu
- form
例を見てみましょう。
<div class="card">
...
</div>このcardがBlockです。
Blockは単体でも意味を持つ部品として扱います。
Elementとは
ElementはBlockの内部に存在する要素です。
BEMではアンダースコア2つ(__)を使います。
<div class="card">
<h2 class="card__title">タイトル</h2>
<p class="card__text">本文</p>
</div>この場合、
- card → Block
- card__title → Element
- card__text → Element
となります。
Element単体では存在せず、必ずBlockに属します。
Modifierとは
Modifierは見た目や状態の違いを表します。
ハイフン2つ(–)を使用します。
<button class="button button--primary">
送信
</button>例えば以下のような違いを表現できます。
- ボタンの色
- サイズ
- 状態
- レイアウトの違い
CSSは次のようになります。
.button {
padding: 12px 24px;
border: none;
}
.button--primary {
background: blue;
color: white;
}BEMの命名ルールまとめ
基本形は次の通りです。
.block
.block__element
.block--modifier
.block__element--modifier例:
<div class="card card--featured">
<h2 class="card__title">タイトル</h2>
<p class="card__text card__text--large">
本文
</p>
</div>それぞれの意味は以下の通りです。
| クラス名 | 意味 |
|---|---|
| card | Block |
| card–featured | 修飾されたBlock |
| card__title | Element |
| card__text–large | 修飾されたElement |
BEMを使うメリット
クラス名を見ただけで構造が分かる
例えば以下のクラス名を見てみます。
card__titleこの名前を見るだけで、
- cardの中の
- title要素
であることが分かります。
CSSの競合が減る
一般的な命名では次のような衝突が起こりがちです。
<div class="title">別の場所でもtitleを使う可能性があります。
BEMなら、
card__title
news__title
profile__titleのように役割が明確になります。
保守性が高い
修正対象が分かりやすくなるため、後からコードを見返しても理解しやすくなります。
長期間運用するサイトでは大きなメリットになります。
チーム開発に向いている
複数人で開発する場合でも、命名ルールが統一されます。
その結果、
- コードレビューしやすい
- 修正しやすい
- 引き継ぎしやすい
という利点があります。
BEMの実践例
ブログカードを作る例を見てみましょう。
HTML
<article class="blog-card">
<img
src="image.jpg"
alt=""
class="blog-card__image"
>
<div class="blog-card__body">
<h2 class="blog-card__title">
記事タイトル
</h2>
<p class="blog-card__text">
記事概要です。
</p>
<a
href="#"
class="blog-card__button"
>
詳しく見る
</a>
</div>
</article>CSS
.blog-card {
display: flex;
gap: 20px;
border: 1px solid #ddd;
padding: 20px;
}
.blog-card__image {
width: 200px;
}
.blog-card__body {
flex: 1;
}
.blog-card__title {
margin-bottom: 10px;
}
.blog-card__text {
margin-bottom: 20px;
}
.blog-card__button {
display: inline-block;
}構造が非常に分かりやすくなっています。
BEMを使う際の注意点
クラス名が長くなる
BEMの欠点として、クラス名が長くなる傾向があります。
.blog-card__button--primaryしかし、可読性や保守性を考えると大きなデメリットではありません。
深い階層を表現しない
初心者がやりがちな例です。
.card__body__titleこれはBEMでは推奨されません。
代わりに、
.card__titleとします。
BEMはHTML構造ではなく、部品としての役割を表現する考え方です。
BEMとCSS設計の関係
BEMは単なる命名ルールではなく、CSS設計の一部として利用されることが多いです。
CSS設計について詳しく知りたい場合は、以下の記事も参考になります。
関連記事
BEMとFLOCSSの違い
FLOCSSはCSS設計全体のルールです。
一方、BEMは命名規則です。
つまり、
- FLOCSS → 設計手法
- BEM → 命名ルール
という関係になります。
実際の現場では、
- FLOCSSで設計する
- BEMで命名する
という組み合わせがよく使われています。
まとめ
BEMはCSSを管理しやすくするための代表的な命名規則です。
主なポイントは以下の通りです。
- BEMはBlock・Element・Modifierの略
- Blockは独立した部品
- ElementはBlock内の要素
- Modifierは状態や見た目の違い
- クラス名だけで構造が分かる
- CSSの競合を防ぎやすい
- 保守性と再利用性が向上する
CSSを書く量が増えるほど、命名規則の重要性は高まります。
これからCSS設計を学ぶ場合は、まずBEMを理解し実践することがおすすめです。

