BEM記法はもう古い?ネイティブ「CSS Nesting」と「@scope」で激変するWebデザイン設計

2026年10月21日水曜日

t f B! P L

📖 推定読了時間:約6分

Web制作やフロントエンド開発に携わるすべてのエンジニアにとって、長年つきまとってきた最大の悩みの種。それが「CSSのクラス名命名規則とスタイル汚染の恐怖」です。

「影響範囲が怖くてCSSを後から変更できない」「コンポーネントの部品ごとに .article-card__header-title--highlighted のような長大で不格好なクラス名を量産するのに疲れた」――こうした課題を解決するため、これまではSass/SCSSを導入したり、CSS ModulesやCSS-in-JS、あるいはTailwind CSSのような巨大なユーティリティフレームワークに頼るのが当たり前とされてきました。

しかし今、Web標準仕様(CSS Specifications)の急速な進化によって、状況は180度激変しています。主要モダンブラウザのすべてでネイティブな「CSS Nesting(入れ子)」が完全サポートされ、さらに特定の領域だけにスタイルを閉じ込める「@scope(スコープ付き規則)」が実用段階へと突入したのです。今回は、外部ツールに依存せず、素のCSS(バニラCSS)だけで安全かつ美しいコンポーネント設計を実現する新常識を解説します!

この記事のポイント

  • Sassのプリコンパイル不要で書けるブラウザネイティブの「CSS Nesting」構文
  • 「ドーナツスコープ」で子コンポーネントへのスタイル漏れを遮断する「@scope」の威力
  • 複雑なビルドパイプラインを排除し、コードの保守性とパフォーマンスを劇的に向上

ついに標準化!Sassなしで動く「ネイティブCSS Nesting」の基本

これまで、セレクタを階層構造で入れ子にして書く「ネスト」を行うには、SassやPostCSSなどのプリプロセッサによる事前ビルドが絶対に不可欠でした。しかし現在のCSS仕様では、ブラウザが直接ネスト構文を解釈してレンダリングします。

記法は極めて直感的です。親セレクタの中にそのまま子セレクタを記述するだけで、自動的に親のスコープが引き継がれます。

/* ネイティブCSS Nestingの記述例 */
.card {
  background-color: #ffffff;
  border-radius: 12px;
  padding: 24px;

  /* 子要素へのネスト */
  h3 {
    font-size: 20px;
    color: #1a202c;
  }

  /* 疑似クラス・ホバー状態のネスト(&を使用) */
  &:hover {
    box-shadow: 0 10px 20px rgba(0, 0, 0, 0.08);
  }

  /* 特定の修飾クラスとの組み合わせ */
  &.is-featured {
    border: 2px solid #007bff;
  }
}

Sassを愛用してきた方なら、何も違和感なく書き始められるはずです。&(アンパサンド)記号を使うことで、擬似クラス(:hover や :focus)や複合セレクタを自然に表現できます。WebpackやViteなどのバンドラーで余計なプラグインを通す必要がなくなり、ブラウザのリロード速度と開発体験が劇的に向上します。

Web標準に基づいた美しいレイアウトやタイポグラフィの基礎、モダンなCSSアーキテクチャを体系的に整理したい方は、現場目線で設計論が解説された モダンWebタイポグラフィ・CSSデザイン設計実践ガイド を手元に置いておくと、CSS設計の迷いが一気に晴れます。

クラス名の呪いを解く救世主:「@scope」とドーナツスコープ

Nestingだけでもコードの可読性は大幅に向上しますが、真のパラダイムシフトをもたらすのが「@scope」規則です。

これまでのCSSにおける最大の恐怖は、親コンポーネントで指定したスタイル(例えば .card p { color: #666; })が、その中にネストされた子コンポーネント(例えばカード内の「アバターコメント」や「埋め込みバッジ」)の内部にまで勝手に侵入してしまう「スタイル漏洩(Style Bleeding)」でした。これを防ぐために、世界中の開発者はBEM記法(.card__title、.card__desc)で全要素に固有の長いクラス名を付け続けなければならなかったのです。

この苦痛を解決するのが、「スタイルの上限制限(Root)と下限制限(Limit)を同時に指定できるドーナツスコープ」です。

/* @scopeによるドーナツスコープの指定例 */
@scope (.product-card) to (.badge, .user-avatar) {
  /* .product-cardの直下にのみ適用され、
     .badge や .user-avatar の内部には絶対に影響しない! */
  img {
    border-radius: 8px;
  }

  p {
    line-height: 1.6;
    color: #333;
  }
}

上記のコードでは、スタイルが有効なのは「.product-card の中」であり、なおかつ「.badge や .user-avatar に到達したらスタイルの適用をピタリとストップする」という設定が一行で完結しています。

これにより、コンポーネントの中央部分だけをドーナツ状にくり抜いてスタイリングできるため、「子コンポーネントの見た目を親が勝手に壊してしまう」という数十年来のバグが原理的に消滅します。

💡 BEMとの決別:無理に長いクラス名を作らず、素直なHTMLタグ(h2, p, button)に対して安全にCSSを当てられる時代へ!

CSS設計手法の進化比較:どこまでシンプルになったのか?

私たちがこれまで歩んできたCSS設計の歴史と、ネイティブ機能による新設計を比較してみましょう。

設計手法 ビルドツールの要否 カプセル化(隔離性) クラス名の可読性・手間
BEM記法(従来) 不要(ただしSass併用が多) 人手による命名規則頼み(脆弱) クラス名が極端に長く煩雑になる
CSS Modules / CSS-in-JS 必須(重いビルドが必要) 完全(ハッシュ値による自動隔離) 設定やバンドラーの依存度が高すぎる
ネイティブCSS(Nesting + @scope) 完全不要(ブラウザ直接実行) 堅牢(ブラウザエンジンがスコープ制御) シンプルで自然なタグ指定が可能

最新のHTML5セマンティクスやブラウザ仕様の進化を包括的に学びたいフロントエンドエンジニアには、最新のWeb標準を深く掘り下げた定番書 モダンHTML5次世代Web標準仕様解説書 が強くお勧めできます。

まとめ:バニラCSSのルネサンス、道具に振り回されない開発へ

これまでWebフロントエンドの世界では、「CSSの欠点を補うために、より重く複雑なJavaScriptフレームワークやビルドツールを導入する」という車輪の再発明が繰り返されてきました。

しかし、CSS Nestingと@scopeの普及によって、「ブラウザが最初から完璧な道具を用意してくれた」状態が実現しつつあります。重厚なNode.js環境やバンドラーの設定ファイルと格闘する時間を減らし、純粋なHTMLとCSSの表現力に向き合える時代が戻ってきたのです。

「昔覚えたCSSの知識のまま止まっている」という方は、ぜひ最新のモダンブラウザでプレーンなCSSファイルを新規作成し、Nestingと@scopeの軽快で心地よい書き心地を体験してみてください!

このブログを検索

このサイトはアフィリエイト広告(Amazonアソシエイト含む)を掲載しています。
Amazonのアソシエイトとして、「色即是空」な「空即是色」blogは適格販売により収入を得ています。