本文へスキップ
メニュー
テーマ

CSSのカスケードレイヤー「@layer」の使い方

目次

カスケードレイヤーとは?

2022年3月14日にリリースされたSafari 15.4を機に、CSSのカスケードレイヤー「@layer」がすべてのモダンブラウザで使用できるようになりました(Chromeは99、Firefoxは97から対応しています)。

@layerは、カスケードレイヤーを宣言するためのアットルールです。スタイルをレイヤーに分けて、どのレイヤーを優先するかを決められます。CSSの詳細度や読み込み順の考え方に影響するので、仕組みを理解しておく必要があります。

Can I useの「CSS Cascade Layers」のブラウザ対応表(2024年1月7日時点)。最新のChrome・Edge・Firefox・Safariは対応済みで、IE 11は非対応
ブラウザのサポート状況(2024.1.7時点)

今回の記事では以下のHTMLを使用します。

HTMLHTML · 3行
<div class="container">  <p class="text">Lorem, ipsum dolor sit</p></div>

@layerの使い方

@layerを使用することで、レイヤーを作成することができます。@layerの後には任意のレイヤーの名前を指定します。

CSSCSS · 3行
@layer name {  }

シンプルな使い方

以下のようにCSSを記述すると、テキストの色はutilityで指定したgreenになります。後に記述したレイヤー「utility」の方が優先されるためです。

CSSCSS · 11行
@layer base {  p {    color: black;  }}@layer utility {  .text {    color: green;  }}

レイヤーの順番を指定する

レイヤーを作成するだけでは、記述した順に優先度が決まります。最初に@layer base, utility;と記述すると、レイヤーの順番を先に決めておけます。後に書いた名前のレイヤーほど優先されます。

以下の例では、先ほどとはレイヤーを記述する順番を逆にしていますが、最初に順番を指定しているので、テキストの色はutilityで指定したgreenになります。

CSSCSS · 13行
@layer base, utility;@layer utility {  .text {    color: green;  }}@layer base {  p {    color: black;  }}

layer()関数を使う

ここまでの例では、レイヤーを同じファイル内に作成していましたが、ファイルを分けたいこともあるでしょう。

以下のようにreset.cssとstyle.cssを記述します。@import url(reset.css) layer(reset);では、@importで外部のreset.cssを読み込み、layer()でレイヤーの名前を指定します。こうすることで、外部のCSSを、レイヤーに入れた状態で読み込めます。

@importは、@charsetと、順番を指定する@layerの文を除いて、他のルールより前に書く必要があります。

reset.cssCSS · 4行
p {  font-size: 30px;  color: black;}
style.cssCSS · 15行
@layer reset, base, utility;@import url(reset.css) layer(reset);@layer utility {  .text {    color: green;  }}@layer base {  .container .text {    color: red;  }}

この指定でも、テキストの色はutilityで指定したgreenになります。

詳細度について

先ほどのコードを見て、1つ気づくことがないでしょうか?カスケードレイヤーがなければ、.textよりも.container .textの方が詳細度が高く、後に記述してもいるので、redになるはずです。しかし、カスケードレイヤーでは、詳細度より先にレイヤーの順番が比べられます。そのため、詳細度に関係なく、後に指定したレイヤーのスタイルが優先されます。

レイヤーに入れていないスタイルと!important

注意点が2つあります。

  • レイヤーに入れていないスタイルは、どのレイヤーのスタイルよりも優先されます。既存のCSSの一部だけをレイヤーに入れると、レイヤーに入れなかったスタイルに上書きされます。
  • !importantを付けた宣言は、優先順位が逆になります。先に宣言したレイヤーの!importantほど優先され、レイヤーに入れていない!importantよりも、レイヤー内の!importantが優先されます。

参考・引用

この記事は役に立ちましたか?