0Pricing
Frontend Academy · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. BEM 方法論:Block・Element・Modifier
  2. CSS Modules:スコープ付きクラス名
  3. CSS-in-JS:Styled-components と Emotion
  4. Tailwind CSS のユーティリティファーストアプローチ
← Frontend Academyに戻る