
こんにちは!静岡県浜松市でWEBデザイナーをしています小瀧です。
CSSを書いていて、こんな経験はありませんか。
クラス名が増えすぎて意味が分からなくなる。
BEMで命名したはずなのに、後から見返すと長すぎて読む気がしない。
別のページ用に書いたスタイルが、なぜか他の場所に影響してしまう。
こうした悩みは、CSSが「グローバルに効いてしまう」設計であることが原因です。
これまで私たちは、命名規則というルールで必死に衝突を防いできました。
しかしCSSに、ついに@scopeという仕組みが登場します。
複雑な命名規則に頼らず、「この中だけに効かせる」が自然に書ける時代です。
本記事では、@scopeの基本から、BEMとの違い、実務での使いどころまでをカタログ形式で整理します。
@scopeとは何か
@scopeは、CSSのスタイル適用範囲を明示的に制限するための新しい構文です。指定したDOM範囲の中だけに、スタイルを閉じ込めることができます。
@scope (.card) {
p {
color: red;
}
}
この場合、.card 内の p 要素だけが赤くなります。
ポイント
クラス名ではなく、構造でスタイルの影響範囲を制御できます。
なぜ命名規則が不要になるのか
従来は、スタイルの衝突を防ぐために命名規則が必要でした。
- block__element--modifier のような長い名前
- ページごとにプレフィックスを付ける
- コンポーネント単位でクラスを分ける
そのため、名前で守る必要がなくなるのです。
基本構文カタログ
最小構成
@scope (.container) { h2 { color: blue; } }
.container 内の h2 のみが対象です。
開始と終了を明示する
@scope (.list) to (.list-end) {
li {
margin-bottom: 8px;
}
}
範囲をより厳密に制御できます。
ネストとの組み合わせ
@scope (.card) {
.title {
font-weight: bold;
}
}
CSS Nestingと非常に相性が良い書き方です。
BEMとの考え方の違い
- BEMは命名でスコープを表現する
- @scopeは構造でスコープを定義する
- @scopeはCSS側で完結する
大きな違い
命名ルールを「覚える」のではなく、CSSが守ってくれます。
実務で使える @scope 活用カタログ
カードコンポーネント
@scope (.card) { p { font-size: 14px; } }
管理画面UI
@scope (.admin-panel) { button { background: #333; color: #fff; } }
記事本文エリア
@scope (.article-body) { h2 { margin-top: 48px; } }
ウィジェット単位の分離
@scope (.widget) { a { text-decoration: none; } }
@scopeを使うとCSSがどう変わるか
- クラス名が短くなる
- スタイルの影響範囲が明確になる
- 後から触る人が理解しやすい
CSSの保守性が大きく向上します。
使用時の注意点
- ブラウザ対応状況を確認する
- グローバルスタイルと役割分担する
- 乱用すると逆に構造が分かりにくくなる
@scopeを使うべき場面・使わない場面
使うべき
- コンポーネント単位のUI
- 再利用前提のパーツ
- 管理画面やUI密度が高い画面
使わない方がよい
- サイト全体共通スタイル
- 単純なページ構成
- 即席のスタイル調整
まとめ
@scopeは、CSS設計の考え方そのものを変える可能性を持っています。命名規則で必死に守っていた時代から、
CSS自身がスタイルの範囲を守る時代へ。
BEMを完全に否定するものではありませんが、
これからのCSSでは「構造で閉じる」設計が主流になっていくでしょう。 @scopeを理解しておくことは、これからのWeb制作において確実な武器になります。













