記事内にはプロモーションが含まれています

【CSS】クラス名の命名規則!BEMの基本から単語一覧チートシートまで解説

【CSS】クラス名の命名規則!BEMの基本から単語一覧チートシートまで解説 CSS

Web制作やアプリケーション開発において、CSSのクラス名をどう付けるかは、プロジェクトの保守性を左右する重要な要素です。

「なんとなく」でクラス名を名前を付けてしまうと、数ヶ月後の自分やチームメンバーがコードを見た時に「このクラスはどこに影響するのか?」が分からず、修正一つでレイアウトが崩れる原因になりかねません。

特に大規模なサイトでは、HTMLの構造とCSSの命名規則が密接に関わります。
一貫性のあるルールを導入することで、スタイルの衝突(競合)を防ぎ、誰が書いても読みやすいコードを実現できます。

この記事では、世界標準の設計思想である「BEM」の解説を中心に、クラス名に使える文字のルール、現場で即活用できる単語チートシートまで詳しく紹介します。

【本記事の信頼性】
プロフィール
執筆者:マヒロ
  • 執筆者は元エンジニア
  • SES⇒大手の社内SE⇒独立
  • 現在はプログラミングスクールを運営
  • モットーは「利他の精神」
💻 本記事の検証環境(2026年2月確認)
  • OS:Windows 11 / macOS Sequoia
  • IDE:Visual Studio / VS Code / IntelliJ IDEA
  • その他:Chrome DevTools / 各言語最新安定版

※本メディアでは、上記環境にてコードの動作と情報の正確性を検証済みです。

CSSクラス名の基本的な書き方と文法ルール

CSSの命名規則には、基本的な書き方のマナーから、チーム開発を円滑にするための設計思想まで幅広く存在します。
ここではまず、文法的に正しく、かつ読みやすいクラス名の基礎知識を整理しましょう。

使用できる文字と「ハイフン」の推奨

CSSのクラス名には、半角英数字、ハイフン(-)、アンダースコア(_)が使用可能です。

しかし、先頭に数字や記号を使うことはできません。

また、現代のWeb制作では、複数の単語を繋ぐ際に「ハイフン」を用いるケバブケース(kebab-case)が最も一般的です。

<!-- 良い例:ケバブケース(ハイフン繋ぎ) -->
<div class="main-content"></div>

<!-- 避けるべき例:キャメルケース(大文字混じり) -->
<div class="mainContent"></div>

上記のソースコードにおいて、main-content は単語の間をハイフンで区切っています。

CSSの世界では、HTMLタグや属性に大文字を使用しない慣習があるため、クラス名においても大文字は使わないのが基本です。

全て小文字で統一することで、コード全体の視認性が向上し、タイピングミスによるバグも減らすことができます。

キャメルケースは主にJavaScriptの変数名などで使われるため、CSSではハイフン繋ぎを採用して役割を明確に分けるのが賢明な判断といえるでしょう。

具体的で意味のある名前を付ける

クラス名は、その要素の「見た目(赤い、大きい)」ではなく、「役割や中身(見出し、ボタン)」を表す名詞にするのが鉄則です。

<!-- 悪い例:見た目に基づいた命名 -->
<div class="red-box"></div>

<!-- 良い例:役割に基づいた命名 -->
<div class="alert-message"></div>

このコードの解説を詳しく行います。 左側の red-box という名前は、将来的にデザイン変更で色が青に変わった場合、名前と実態が矛盾してしまいます。

一方、右側の alert-message という名前であれば、色が何色に変わろうとも「警告メッセージを表示する」という役割は変わらないため、コードの寿命が長くなります。

常に「この要素は何のために存在しているのか」を自問自答して命名することが、保守性の高いCSSへの第一歩です。

世界標準の設計思想「BEM」をマスターする

現在、多くのプロフェッショナルな現場で採用されている命名規則がBEM(ベム)です。
BEMは、Block(塊)、Element(要素)、Modifier(状態)の3つの概念で構成されます。

このルールを導入することで、CSSの適用範囲(スコープ)が明確になり、予期せぬ場所へのスタイル反映を物理的に防ぐことが可能になります。

BEMの基本構造と書き方

BEMでは、Block__Element--Modifier という形式でクラス名を記述します。
アンダースコア2つ(__)とハイフン2つ(--)を使って階層を表現するのが最大の特徴です。

<!-- BEMによるカードコンポーネントの実装例 -->
<div class="card">
    <h2 class="card__title">タイトルテキスト</h2>
    <p class="card__desc">説明文がここに入ります。</p>
    <!-- Modifierで「強調状態」を表現 -->
    <button class="card__btn card__btn--primary">詳細を見る</button>
</div>

<style>
/* Block: 独立したパーツ */
.card {
    padding: 20px;
    border: 1px solid #ccc;
}

/* Element: Blockを構成する要素(アンダースコア2つで繋ぐ) */
.card__title {
    font-size: 1.5rem;
}

/* Modifier: 状態や変化(ハイフン2つで繋ぐ) */
.card__btn--primary {
    background-color: blue;
    color: white;
}
</style>

ソースコードの内容を詳しく読み解いていきましょう。

ここでは card クラスが一つの大きな「Block(塊)」として定義されています。

その中にあるタイトルやボタンは、card__titlecard__btn のように記述することで、「これはcardというBlockの中に属している要素(Element)である」ことが名前だけで判別できます。

さらに、ボタンに対して card__btn--primary というModifierを追加しています。
これは、通常のボタンという要素に対して「主要な(Primary)」という特別な見た目を上書きするためのクラスです。

このように構造を階層化することで、他の場所にあるタイトル(例えば news__title)と名前が衝突する心配がなくなり、安心してスタイルを追加できるようになります。

迷った時に役立つ!CSSクラス名チートシート

「このパーツの名前、なんて付ければいいんだろう」と悩む時間は非常に多いものです。
ここでは、日本のWeb制作現場で頻繁に使われる定番の単語を、場所や役割ごとに一覧化しました。

これらを組み合わせて使うことで、誰が見ても一瞬で構造が理解できる「伝わる命名」が可能になります。

レイアウト・枠組みに関する単語一覧

分類 推奨される単語 用途
全体を包む箱 wrapper, container コンテンツの最大幅を制限する外枠
ヘッダー header, global-header サイト上部の共通エリア
メイン領域 main, content ページの主要な中身
サイドバー sidebar, sub-content 横に配置される補助的なエリア
フッター footer サイト下部の共通エリア
インナー inner 要素の内側でパディングを調整する箱

コンポーネント・部品に関する単語一覧

分類 推奨される単語 用途
ナビゲーション nav, navbar, menu リンクの集まり
リスト・一覧 list, item 繰り返し並ぶ要素のセット
見出し heading, title, headline セクションのタイトル
ボタン btn, button クリック可能なアクション要素
カード card, panel 画像とテキストがセットになった枠
画像 thumb, img, icon サムネイルやアイコン画像
説明文 desc, summary, text 短い紹介文や本文

状態や修飾(Modifier)に関する単語一覧

分類 推奨される単語 用途
現在の状態 active, current, selected 選択中や表示中の状態
無効な状態 disabled, error 操作できない、またはエラーの状態
重要度 primary, secondary, alert 色や優先度の違い
サイズ small (sm), large (lg) 大きさのバリエーション

HTMLとCSSを連携させた実務的な命名フロー

命名規則を理解したら、次は実際のコーディングにどう落とし込むかが鍵となります。
単に名前を決めるだけでなく、HTMLの入れ子構造に合わせてルールを適用していく一連の流れを確認しましょう。

<!-- 実務でよくある「ニュース一覧」のセクション例 -->
<section class="news">
    <div class="news__inner">
        <h2 class="news__heading">最新ニュース</h2>
        <ul class="news__list">
            <li class="news__item">
                <a href="#" class="news__link">
                    <span class="news__date">2026.01.01</span>
                    <span class="news__text">新しいプロジェクトが始動しました。</span>
                </a>
            </li>
            <!-- Modifierで「重要」な項目を強調 -->
            <li class="news__item news__item--important">
                <a href="#" class="news__link">
                    <span class="news__date">2026.01.05</span>
                    <span class="news__text">メンテナンスのお知らせ</span>
                </a>
            </li>
        </ul>
    </div>
</section>

このソースコードの設計思想を詳しく解説します。

まず、セクション全体を news というBlockとして捉えています。
内部に news__inner という余白調整用のElementを置くことで、レイアウトの微調整をBlockの役割から切り離しています。

各リスト項目には news__item という名前を付け、特定の項目だけ目立たせたい場合には news__item--important というModifierを追加で付与しています。

ここで重要なのは、news__item--important は単体で使うのではなく、必ずベースとなる news__item とセットで使うという点です。

これにより、共通のスタイルは news__item で定義し、差分だけをModifierで書き換えるという効率的な管理が可能になります。

このようにHTMLのクラス名を整理することで、CSS側でも「ネスト(入れ子)」を深くせずに済み、スタイルの再利用性が格段に高まるのです。

HTML/CSSのスキルを活かして年収を上げる方法

以上、CSSのクラス名の命名規則について解説してきました。

なお、HTMLやCSSのスキルがある場合には、「副業で稼いで年収を上げる」といったことが可能です。
HTML/CSSのスキルを持つ人は多いものの、その分案件数も多く、副業エージェントやフリーランスエージェントを利用することで予想外の高単価案件が見つかることもあります。
エージェントサービスは、登録も利用もすべて完全無料なので、どんな求人や案件があるのか気になる方は、気軽に利用してみるとよいでしょう。
エンジニアのキャリア・スキルアップ相談窓口
当ブログの読者に選ばれている、実績豊富な転職エージェントを厳選しました。
【転職】年収・環境を改善したい
年収アップにこだわりたい方 (平均アップ額138万円の実績)
未経験・経験者問わず幅広く探したい方
業界に精通した担当者に相談したい方
ゲーム業界への転職を志望する方
エンジニア未経験からキャリアを築く方
【独立】フリーランスとして稼ぎたい
国内最大級のフリーランス案件数から比較したい方
週1〜3日など柔軟な働き方を希望する方
【学習】スキルに不安のある方向け(格安スクール「デイトラ」)