
こんにちは!静岡県浜松市でWEBデザイナーをしています小瀧です。
CSSを書いていてこんなこと、ありませんか?
- 後から追加したスタイルが既存CSSに勝てない…
- !important地獄で管理不能に…
- どこで何が上書きされているか分からない
こうしたCSSの「スタイル競合」問題を根本から解決してくれるのが、CSSの新機能:Cascade Layers(カスケードレイヤー)です!
この機能は @layer を使って、スタイルの優先度をあらかじめ「設計」できる画期的な仕組み。
これからのCSS設計には必須になると言っても過言ではありません。
Cascade Layersとは?
CSSでは、スタイルの優先順位は以下のように決まります。
- インラインスタイル(HTML内に書かれたstyle)
- セレクタの詳細度(id > class > 要素)
- 記述の順番(後勝ち)
- !importantの有無
ところが、これだけでは大規模サイトや複雑なUIコンポーネントを扱う際に不十分です。
@layer を使えば、スタイルを「レイヤー単位」で明示的に管理できるようになり、
たとえば「リセットCSSよりユーティリティが優先」「コンポーネントよりユーザーカスタムが強い」など、CSS設計のルールをコードに反映できます。
基本的な使い方と文法
CSSファイルにレイヤーを定義
@layer reset, base, components, utilities, overrides;
ここでレイヤーの「順序(優先度)」を定義します。
左側ほど優先度が低く、右側ほど強くなる仕組みです。
各スタイルにレイヤーを割り当てる
@layer reset {
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
}
@layer base {
body {
font-family: sans-serif;
color: #333;
}
}
@layer components {
.btn {
padding: 0.5rem 1rem;
background: #007bff;
color: #fff;
}
}
@layer overrides {
.btn {
background: red;
}
}
このように書くことで、同じセレクタでも overrides レイヤーが components レイヤーを上書きするようになります。
実践活用:レイヤーによる設計の分離
以下のようにCSSの役割ごとにレイヤーを分けておくと、設計や保守が非常にスムーズになります。
- reset:ブラウザごとの差をならす
- base:全体のボディやhタグ、テキストなど
- components:パーツ単位のUI
- utilities:クラスベースの装飾(Tailwind的)
- overrides:ユーザーごとのカスタムやメディアクエリ
たとえばWordPressテーマ開発においても、「プラグインCSSが強すぎて上書きできない」問題に直面したとき、レイヤー管理で優先度を制御すればスマートに解決できます。
@importとも連携できる
レイヤーは @import とも組み合わせ可能です。
モジュールごとに分割されたCSSでも、読み込んだ順序で優先度を制御できます。
@import url("reset.css") layer(reset);
@import url("base.css") layer(base);
@import url("components.css") layer(components);
注意点と対応ブラウザ
- Chrome・Edge・Safari ✅ 対応済
- Firefox ✅
- IE ❌ 非対応(完全非推奨)
古いブラウザではレイヤーが無視されるため、完全な互換性を求めるプロジェクトでは慎重に。
フォールバック
対応ブラウザには @supports を使って柔軟に書き分け可能です。
@supports (layer: test) {
@layer overrides {
.btn {
background: red;
}
}
}
まとめ
@layer を使った Cascade Layers の導入で、CSSはもっとクリーンで保守しやすくなります。- スタイルの優先度を意図的に制御できる
- CSSを目的別にレイヤーで整理しやすい
- !importantに頼らず設計できる
- @importやコンポーネント管理にも対応
CSSがごちゃごちゃしてきたと感じたら、今こそ @layer を取り入れて、
「書きやすく・読みやすく・壊れにくい」スタイル設計を始めてみませんか?













