ナビゲーション

構文

カスケードレイヤー

生成ルールのレイヤー選択、ネイティブルールの所属、重要度、ルールの順序。

このページの内容

Master CSS は、クラスが別の対応レイヤーを明示しない限り、生成するスタイルルールを utilities に出力します。管理対象のテーマ宣言は theme を使います。ネイティブ CSS は、@apply でミックスインを展開するルールも含め、記述されたレイヤーを保ちます。

このページでは、レイヤーの所属と生成ルールの順序を定義します。コンポーネントの上書きや DevTools を使う診断手順は、ガイドのカスケードレイヤーを参照してください。

順序を確立する

@master/css/base.css として公開され、完全な @master/css インポートにも含まれるベーススタイルシートは、次を宣言します。

@layer theme, base, defaults, components, utilities;

ほかのルールがこれらのレイヤーを確立する前に読み込んでください。CSS は最初に出現した順でレイヤーの順序を決めるため、後から順序を宣言しても、確立済みのレイヤーを並べ替えられません。生成されるレイヤーブロックが、この宣言を自動で挿入することもありません。

通常の宣言と重要な宣言

これらのレイヤー内で通常の宣言が競合すると、utilities の優先順位が最も高く、theme が最も低くなります。レイヤーに属さない通常の作成者ルールは、これらすべてより優先されます。!important はレイヤー間の順序を反転させ、レイヤー内の重要なルールをレイヤー外の重要なルールより優先します。これは作成者スタイルシート内の比較であり、オリジン、インラインスタイル、アニメーション、トランジションを含むカスケード全体ではありません。CSS のレイヤー順序を参照してください。

重要な宣言ではレイヤーの優先順位が反転する

作成者スタイルシート内で、重要度が同じ宣言を比較します。通常のレイヤー外ルールは名前付きレイヤーより優先され、重要な名前付きレイヤーのルールは重要なレイヤー外ルールより優先されます。

テキストによる説明
  1. ベーススタイルシートは、theme、base、defaults、components、utilities の順に宣言します。
  2. 作成者スタイルシートの通常の宣言では、theme から utilities に向かって優先順位が上がり、レイヤー外の宣言がすべての名前付きレイヤーより優先されます。
  3. 作成者スタイルシートの重要な宣言では、逆方向に優先順位が上がります。これらのレイヤーでは theme が最も強く、レイヤー外の重要な宣言が最も弱くなります。
  4. レイヤーの優先順位はセレクターの詳細度より先に比較されます。図は重要度ごとのグループを別々に比較しており、通常の宣言と重要な宣言、あるいはほかのカスケードのオリジンを比較するものではありません。

レイヤーの優先順位は、セレクターの詳細度より先に評価されます。そのため、詳細度の高いコンポーネントセレクターでも、詳細度だけでは通常のユーティリティ宣言に勝てません。同じレイヤーの宣言間では、ほかのカスケード基準も引き続き作用します。セレクターの詳細度を参照してください。

レイヤーの所属

レイヤー生成内容ネイティブ CSS の慣例
theme:root, :host に保持される管理対象トークンの宣言トークンの既定値
base@layer(base) を付けたクラス正規化と文書の基盤
defaults@layer(defaults) を付けたクラスプロジェクトや内容に広く適用する既定スタイル
components@layer(components) を付けたクラス再利用可能な製品クラス
utilities通常のユーティリティ、組み合わせスタイル、ネイティブ宣言クラス、明示的な @layer(utilities)局所的なユーティリティルール

ネイティブ CSS の列が示すのは想定する責務であり、レイヤー内で CSS が許可するプロパティの制限ではありません。defaults はプロジェクトのレイヤーであり、ブラウザーのユーザーエージェントスタイルシートではありません。トークンの依存関係の配信は変数とモードで説明しています。

生成ルールのレイヤーを選ぶ

クラスの接尾辞で指定できるレイヤー名は、次の 4 つだけです。

@layer(base)@layer(defaults)@layer(components)@layer(utilities)

この指定は、生成クラス全体のレイヤーを選びます。サブレイヤーを作ったり、クラスが依存するテーマ変数を移動したりはしません。ほかの接尾辞とともに、末尾の ! より前に置きます。

形式結果
block@layer(defaults)display ルールを defaults に配置
block@layer(base)@layer(base)base レイヤーのルールを 1 つ生成。同じ選択の繰り返しは許可
block@layer(base)@layer(utilities)CLASS_SYNTAX_ERROR:1 つのクラスで異なるレイヤーは選択できない
block@layer(theme)UNKNOWN_CONDITION:theme は生成スタイルルールの対象外
block@layer(custom)UNKNOWN_CONDITION:任意のネイティブレイヤー名はクラス接尾辞の対象外

プロジェクト独自のレイヤーやサブレイヤーには、ネイティブの @layer 構文を使います。順序はネイティブ CSS に従い、クラスの接尾辞が新しいレイヤー名を登録することはありません。

スタイルのレイヤーを選んでもトークンは移動しない

2 本のレイヤー帯は出力の所属を示します。その位置関係は、カスケード全体の優先順位を表すものではありません。

テキストによる説明
  1. p-md@layer(defaults) は、生成した padding 宣言を defaults レイヤーに出力します。
  2. 依存する --spacing-md は、引き続き theme レイヤーの :root,:host に出力されます。@layer(defaults) が選ぶのはクラスルールのレイヤーであり、依存関係のレイヤーではありません。

Base と defaults

base レイヤーの子孫ルールで、構造の基盤を設定できます。

<body class="(list-style:none)_ul@layer(base)">…</body>
生成された CSS
@layer base {  .\(list-style\:none\)_ul\@layer\(base\) ul {    list-style: none  }}

defaults レイヤーの子孫ルールでは、局所的なコンポーネントやユーティリティの指定を優先させたまま、コードのタイポグラフィを設定できます。

<body class="font-mono_:is(code,pre)@layer(defaults)">…</body>
生成された CSS
@layer theme {  :root,  :host {    --font-family-mono: var(--font-mono, ui-monospace), SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace  }}@layer defaults {  .font-mono_\:is\(code\,pre\)\@layer\(defaults\) :is(code, pre) {    font-family: var(--font-family-mono)  }}

font-mono クラスは defaults に残り、必要なフォントトークンは theme に残ります。宣言を受け取る子孫要素はセレクター接尾辞が決め、レイヤーの選択とは独立しています。

既定スタイルより局所的な指定を優先する

ここでは両方のルールが最初の段落を対象にします。段落自身のネイティブ宣言クラスは utilities に入るため、記事の defaults レイヤーのフォントサイズを上書きします。

<article class="(font-size:1rem)_p@layer(defaults)">  <p class="(font-size:1.5rem)">24</p>  <p>16</p></article>
生成された CSS
@layer defaults {  .\(font-size\:1rem\)_p\@layer\(defaults\) p {    font-size: 1rem  }}@layer utilities {  .\(font-size\:1\.5rem\) {    font-size: 1.5rem  }}

ネイティブルールと管理対象のユーティリティ

@layer components 内のネイティブクラスは、引き続きネイティブ CSS です。既定で配信され、そのレイヤー内のネイティブなソース順序に従い、Master のセレクター接尾辞や条件接尾辞は使えません。未使用のネイティブセレクターを除去できるかどうかは、@prune native が制御します。

この例では .btn が inline-flex を宣言し、flex が通常のユーティリティ宣言を生成します。ベースの順序を確立すると、ボタンには display: flex が適用されます。

@layer components {  .btn {    display: inline-flex;  }}
<button type="button" class="btn flex">Save</button>
生成された CSS
@layer components {  .btn {    display: inline-flex;  }}@layer utilities {  .flex {    display: flex  }}

一方、必要に応じて生成する @utility は管理対象のクラスを登録します。通常の出力先は utilities ですが、接尾辞で別の対応レイヤーを選べます。

@utility flow {  display: grid;  gap: var(--spacing-md);}
<div class="flow@layer(defaults)">Example</div>
生成された CSS
@layer theme {  :root,  :host {    --spacing-md: 1rem  }}@layer defaults {  .flow\@layer\(defaults\) {    display: grid;    gap: var(--spacing-md)  }}

ユーティリティの定義とネイティブルールの保持については、ユーティリティとミックスインを参照してください。

ミックスインの展開は周囲のレイヤーを保つ

ネイティブルール内の @apply は、その位置で宣言を展開します。ルールを utilities に移動することはありません。

@mixin --inset {  padding: 1.5rem;}@layer components {  .card {    @apply --inset;  }}
<div class="card p(8)">Example</div>
生成された CSS
@layer components {  .card {    padding: 1.5rem  }}@layer utilities {  .p\(8\) {    padding: calc(8 * 1px)  }}

ベースの順序を確立すると、ユーティリティの 8px の padding がコンポーネントの 1.5rem に優先します。囲むレイヤーがなければ、ネイティブの .card ルールはレイヤーに属さず、通常の padding 宣言が通常のユーティリティより優先されます。

レイヤーブロックは、ミックスイン本体と @apply の内容の外に置きます。これらの位置では使えません。レイヤーは生成ルール全体の所属を選ぶもので、宣言の一部を囲むものではありません。

同じレイヤー内での優先順位

HTML のクラス順序は優先順位を決めません。Master CSS は生成ルールに安定した順序を与え、ブラウザーが一致する宣言にカスケードを適用します。比較可能なレイヤー、セレクター、条件の文脈では、生成ルールは次の順に並びます。

  1. 複数の宣言、または内部のセレクターや条件を持つ組み合わせスタイル。

  2. 固定、トークンを参照するもの、値を直接受け取るものを含む、単一宣言のユーティリティ。

  3. ネイティブ宣言クラス。

単一宣言のユーティリティは、プロパティの系統と適用範囲で並びます。片側や 1 軸への指定は、全体への指定より後です。同じプロパティとスコープでは、名前付きトークンの値が直接値より前になります。重要度、セレクターの詳細度、条件も引き続き作用するため、直接値が別のスコープやレイヤーのトークンに常に勝つわけではありません。

以下の例では、プリセット、ベースのレイヤー宣言、ルートのフォントサイズ 16px を使います。競合する宣言は同じ要素を対象とし、条件は一致しています。

競合するクラスやルール結果理由
p-md p(8)、順序は不問padding: 8px同じプロパティとスコープでは、直接値がトークンより後
p(8) (padding:2rem)、順序は不問padding: 2remネイティブ宣言が単一宣言ユーティリティより後
m-md mt(0)、順序は不問上マージンは 0、ほかは 1rem片側の指定がマージン全体の指定より後
b(2) bt(0) b-solid b-red-60上辺の幅は 0、ほかは 2px、赤の実線ボーダー幅、スタイル、色は独立した系統
p-md! p(8)padding: 1rem重要度が値の由来による順序より優先
p-md! p(8)!padding: 8px重要度が等しく、直接値がトークンより後
p(8)@layer(base) p(12)padding: 12px通常のユーティリティが base より優先
p(8)@layer(base)! p(12)!padding: 8px重要な宣言ではレイヤーの優先順位が反転
レイヤー外の .outside { padding: 32px; } と p(8)padding: 32pxレイヤー外の通常の宣言がレイヤー内の宣言より優先
components レイヤーの padding: 24px !important と p(8)!padding: 24px重要な宣言同士では先のレイヤーが優先

レイヤー内のネイティブルールは記述順を保ち、上記の生成ユーティリティの順序で並べ替えられることはありません。宣言が重なる場合は出力された CSS を確認し、コードの lintで記述中に競合するクラスを検出してください。