CSS @layer 実践ガイド ―
詳細度の地獄から解放される、新しいCSS設計
!important を重ねるたびに「これでいいのか……」と感じたことはありませんか? @layer を使えば、スタイルの優先順位を最初から設計できます。詳細度に振り回されない、新しいCSSの書き方を解説します。

!important の連鎖が始まるとき
外部のUIライブラリを導入した瞬間、既存のスタイルが上書きされてしまった——そんな経験はないでしょうか。ライブラリ側のセレクタが具体的で詳細度が高く、自分のスタイルが負けてしまう。やむなく !important をつけると、次はそれを上書きするためにさらに !important が必要になる……。
これはCSSのカスケード(優先順位の決定ルール)が、スタイルが書かれた「順序」と「詳細度」という2軸に依存していることが根本的な原因です。どちらも「暗黙のルール」であり、複数の人間が触ったり外部ライブラリが混在したりすると、制御しきれなくなる。
その問題に正面から向き合ったのが、2022年にChrome・Firefoxが対応し始めた @layer(カスケードレイヤー)です。
@layer の基本 ― 優先順位を「宣言」する
まず核心を見せます。@layer は、スタイルを「名前付きの層(レイヤー)」に分類し、レイヤーの順番が優先順位になります。後に書いたレイヤーが勝つ。
/* ① レイヤーの優先順位を最初に宣言(後ほど詳述)*/
@layer base, components, utilities;
/* ② 各レイヤーにスタイルを書く */
@layer base {
a { color: blue; }
}
@layer components {
.btn { color: white; background: #059669; }
}
@layer utilities {
.text-red { color: red; } /* 最も優先される */
}
ポイントは冒頭の1行目です。@layer base, components, utilities; と書くことで、優先順位の序列をCSSの冒頭で宣言できます。以降にどの順番でスタイルを書いても、この宣言が優先順位を決めます。
左のボックスをクリックすると .active が付与されます。demo-utilities レイヤーが最優先のため、demo-base や demo-components の color より demo-utilities の赤が優先されます。
実践パターン ― 現場での使い方3選
① 外部ライブラリを最下層に封じ込める
実務での最頻ユースケースはこれです。TailwindCSSやBootstrapなど外部ライブラリのスタイルを最下層のレイヤーに押し込むことで、自分のスタイルが必ず上書きできるようになります。
/* 優先順位の宣言:右に行くほど強い */
@layer vendor, base, components, overrides;
/* 外部ライブラリを vendor レイヤーに閉じ込める */
@layer vendor {
@import url('some-ui-library.css');
}
/* 自分のスタイルはこれより上のレイヤーへ */
@layer components {
.btn {
background: #059669; /* ライブラリのbtnより必ず優先される */
border-radius: 8px;
}
}
② レイヤー外のスタイルは最強になる
意外と知られていませんが、@layer に属さないスタイルは、すべてのレイヤーより優先されます。つまり「緊急の上書き」は、あえてレイヤーの外に書くだけでよい。
@layer base, components;
@layer components {
.alert { color: white; }
}
/* @layer の外 → すべてのレイヤーに勝つ */
.alert.urgent { color: red; }
③ NG例との比較 ― 従来の問題を整理する
/* ライブラリのスタイル(詳細度が高い) */
.ui-lib .btn.primary { background: blue; }
/* 自分のスタイル(詳細度が低くて負ける) */
.btn { background: green; } /* 効かない */
/* やむなく !important を乱発 */
.btn { background: green !important; }
@layer vendor, components;
@layer vendor {
.ui-lib .btn.primary { background: blue; }
}
@layer components {
/* 詳細度が低くても、レイヤーが上なので勝つ */
.btn { background: green; }
}
応用 ― デザインシステムへの組み込み
大規模プロジェクトでは、@layer をデザインシステムの「土台」として活用するパターンが増えています。トークン(CSS変数)→ ベーススタイル → コンポーネント → ユーティリティという4層構造は、FLOCSSやITCSSの概念を@layer で実装したものです。
/* 優先順位を最初に宣言 */
@layer tokens, base, components, utilities;
@layer tokens {
:root {
--color-primary: #059669;
--radius-md: 8px;
}
}
@layer base {
/* リセット・デフォルトスタイル */
*, *::before, *::after { box-sizing: border-box; }
body { font-family: system-ui, sans-serif; }
}
@layer components {
.btn {
background: var(--color-primary);
border-radius: var(--radius-md);
padding: 8px 20px;
color: white;
}
}
@layer utilities {
/* 最優先の調整クラス */
.mt-0 { margin-top: 0; }
.hidden { display: none; }
}
ブラウザサポートも問題ありません。2023年時点でChrome・Firefox・Safari・Edgeの最新版がすべて対応しており、モダンプロジェクトであれば安心して使えます。
まとめ
- @layer はCSSのスタイルを「名前付きの優先順位層」に整理できる仕組み。後に宣言されたレイヤーが優先される。
- 冒頭で @layer base, components, utilities; と宣言することで、優先順位をCSSの最初に設計できる。
- 外部ライブラリを最下層レイヤーに閉じ込めることで、!important なしに自分のスタイルを確実に適用できる。
- @layer に属さないスタイルは、すべてのレイヤーより強い。緊急の上書きにも使える。
- tokens → base → components → utilities の4層構造は、大規模プロジェクトのCSS設計に有効。
- 主要ブラウザの最新版はすべて対応済みで、モダンプロジェクトで積極的に使える。