BEM 方法論:Block・Element・Modifier
Block__Element--Modifier パターンで CSS クラスに名前を付け、自己説明的で低特異度かつ再利用可能なコンポーネントスタイルを作成します。
「BEM 方法論:Block・Element・Modifier」はCoddyKit上の無料Frontend Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはFrontend Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Frontend Academyコースには全4レッスンが含まれています。
BEMとは
BEM(Block、Element、Modifier)は、予測しやすく再利用可能で、競合のないスタイルを実現するCSSの命名規則です。クラス名にコンポーネントの構造を組み込むことで、詳細度の競合や意図しないスタイルの衝突をなくします。
ブロック — 独立したコンポーネント
ブロックは、独立して再利用できるコンポーネントです。例としてcard、button、navがあります。クラス名にはブロック名を使い、小文字とハイフンで記述します。
<div class="card">...</div>
<button class="btn">...</button>
<nav class="main-nav">...</nav>エレメント — ブロックの一部
エレメントは、単独では意味を持たないブロックの一部です。ダブルアンダースコアを使い、block__elementのように記述します。
<div class="card">
<img class="card__image" src="..." alt="...">
<div class="card__body">
<h2 class="card__title">Title</h2>
<p class="card__description">...</p>
</div>
<footer class="card__footer">
<a class="card__link" href="...">Read more</a>
</footer>
</div>モディファイア — バリエーションと状態
モディファイアは、ブロックまたはエレメントの外観や動作を変更します。ダブルハイフンを使い、block--modifierまたはblock__element--modifierのように記述します。
<button class="btn">Default</button>
<button class="btn btn--primary">Primary</button>
<button class="btn btn--danger btn--large">Large Danger</button>
<div class="card card--featured">...</div>
<nav class="main-nav main-nav--collapsed">...</nav>BEMのCSSルール
BEMのクラスは、低く均一な詳細度を持ちます(各クラスは1つだけです)。そのため、スタイルを簡単に上書きできます。IDや入れ子になった要素セレクターは使用しないでください。詳細度が予測しにくい形で高くなるためです。
/* Good BEM CSS */
.card { /* ... */ }
.card__title { /* ... */ }
.card--featured { /* ... */ }
/* Avoid */
.card h2 { /* targets any h2 in .card — too broad */ }
#featured-card { /* high specificity — hard to override */ }Sassで使うBEM
Sassの&親セレクターを使うと、BEMをより簡潔に記述できます。コンパイル後のCSSは通常のBEMと同一です。
.card {
padding: 16px;
&__title {
font-size: 1.25rem;
font-weight: 600;
}
&__body {
color: var(--color-text-secondary);
}
&--featured {
border: 2px solid var(--color-brand);
}
}新しいブロックを作成するタイミング
コンポーネントが単独で使用でき、異なるコンテキストで再利用できる場合は、新しいブロックを作成してください。その部分が特定の1つのブロック内でのみ意味を持つ場合は、エレメントを作成してください。
BEMでは入れ子を避ける
BEMでは、HTMLとCSSの深い入れ子を避けます。エレメントの中にあるエレメントもblock__elementであり、block__element__subelementではありません。
<!-- Correct: -->
<div class="card">
<div class="card__meta">
<time class="card__date">Jan 1</time>
</div>
</div>
<!-- Wrong: -->
<div class="card">
<div class="card__meta">
<time class="card__meta__date">Jan 1</time> <!-- 3 levels = wrong -->
</div>
</div>BEMとJavaScript
動作のフックには、JavaScript専用のクラスを別に使用してください。js-プレフィックスを付けます。これによりスタイルとスクリプトが分離され、BEMクラスの名前を変更してもJavaScriptの動作が壊れません。
<button class="btn btn--primary js-submit">Submit</button>
// JS: select by js- class
document.querySelector('.js-submit').addEventListener('click', handleSubmit);BEMブロックの混在
1つの要素に複数のブロッククラスを付けることで、ブロック同士を結合せずに、コンテキストに応じたスタイルを適用できます。
<button class="btn btn--primary form__submit">Submit</button>BEMの制限
クラス名が長くなることがあります。BEMは、グローバルなスタイルの一貫性が重要な大規模チームやデザインシステムに最適です。スコープ付きスタイルを使うコンポーネントフレームワーク(React/Vue)では、BEMの名前空間による利点はそれほど重要ではありません。
クイックチェック
BEMにおいて、card__title--truncatedは何を表しますか?
まとめ: BEM
ブロック: 独立したコンポーネント。エレメント(ダブルアンダースコア__): ブロックの一部。モディファイア(ダブルハイフン--): バリエーションまたは状態。低く均一な詳細度。IDセレクターと深い入れ子を避ける。JavaScriptのフックにはjs-プレフィックスを使用する。Sassの&でBEMをより簡潔に記述できる。大規模チームやデザインシステムに最適です。
よくある質問
「BEM 方法論:Block・Element・Modifier」レッスンは無料ですか?
はい。「BEM 方法論:Block・Element・Modifier」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Frontend Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Frontend Academyコースには全4レッスンが含まれています。
「BEM 方法論:Block・Element・Modifier」で何を学びますか?
Block__Element--Modifier パターンで CSS クラスに名前を付け、自己説明的で低特異度かつ再利用可能なコンポーネントスタイルを作成します。 ブラウザで直接実行するハンズオンコードでFrontend Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Frontend Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのFrontend Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「BEM 方法論:Block・Element・Modifier」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このFrontend Academyレッスンでコードを書いて実行できますか?
はい。すべてのFrontend Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- BEM 方法論:Block・Element・Modifier
- CSS Modules:スコープ付きクラス名
- CSS-in-JS:Styled-components と Emotion
- Tailwind CSS のユーティリティファーストアプローチ