CSSカスケーディングと継承 レベル5

W3C 候補勧告スナップショット,

この文書の詳細
このバージョン:
https://www.w3.org/TR/2022/CR-css-cascade-5-20220113/
最新公開バージョン:
https://www.w3.org/TR/css-cascade-5/
編集者草案:
https://drafts.csswg.org/css-cascade-5/
以前のバージョン:
履歴:
https://www.w3.org/standards/history/css-cascade-5
実装レポート:
https://wpt.fyi/results/css/css-cascade
フィードバック:
CSSWG イシューレポジトリ
仕様内インライン
編集者:
Elika J. Etemad / fantasai (招待専門家)
Miriam E. Suzanne (招待専門家)
Tab Atkins Jr. (Google)
この仕様への編集提案:
GitHub エディター

概要

このCSSモジュールは、スタイル規則のまとめ方と、すべての要素のすべてのプロパティに値を割り当てる方法について説明します。カスケーディングと継承によって、すべての要素のすべてのプロパティに値が伝播されます。

このレベルで新たに追加されたのは カスケードレイヤー です。

CSS は、構造化された文書(HTMLやXMLなど)のレンダリングを画面や紙などで記述するための言語です。

この文書のステータス

このセクションは、この文書が公開された時点でのステータスについて説明します。 現在のW3C出版物のリストと、この技術報告書の最新改訂版は W3C技術報告書インデックス https://www.w3.org/TR/ でご覧いただけます。

この文書は CSS作業グループ により 候補勧告スナップショット として 勧告トラック を使用して公開されました。 候補勧告としての公開は、W3Cおよびそのメンバーによる承認を意味するものではありません。 候補勧告スナップショットは 広範なレビュー を受けており、 実装経験を集めることを目的としており、作業グループメンバーによる ロイヤリティフリーライセンス のコミットメントがあります。 この文書はW3C勧告となる予定です。 追加のフィードバックを集めるため、少なくとも までは候補勧告のままとなります。

ご意見は GitHubでIssue提出(推奨)にてお寄せください。 タイトルに仕様コード「css-cascade」を含めてください(例: “[css-cascade] …コメントの要約…”)。 すべてのIssueやコメントは アーカイブ されています。 または、(アーカイブあり) 公開メーリングリスト www-style@w3.org へご送信いただくことも可能です。

この文書は 2021年11月2日W3Cプロセス文書 により管理されています。

この文書は W3C特許ポリシーのもとで活動するグループによって作成されました。 W3Cは、グループの成果物に関連して行われた特許開示の 公開リスト を管理しています。 そのページには特許開示の方法についても記載されています。 個人が特許について実際の知識を持ち、その特許が 必須請求 を含むと考える場合、 W3C特許ポリシー第6節 に従って情報を開示する必要があります。

以下の機能はリスクがあり、CR期間中に削除される可能性があります。

「リスクあり」はW3Cプロセス用語であり、必ずしもその機能が削除や延期の危険性があることを意味しません。これは、WGがその機能の相互運用可能な実装が迅速に行われない可能性があると考えていることを示し、 必要に応じて提案勧告段階へ移行する際に、その機能を削除できるようにするためのものです(新たな候補勧告を発行せずに)。

1. はじめに

CSSは、文書のレンダリングを指示する有限のパラメータセットを プロパティ と呼び、定義します。 各 プロパティ には名前 (例:colorfont-size、または border-style)、 値空間 (例:<color><length-percentage>[ solid | dashed | dotted | … ])、 および文書のレンダリングに関する定義済みの挙動を持ちます。 プロパティの値は、プロパティ宣言を通じて文書の各部分に割り当てられ、 (例:red12ptdottedなど) 関連する要素やボックスに値が割り当てられます。

CSSの基本的な設計原則のひとつが カスケーディング です。 これにより、複数のスタイルシートが文書の表示に影響を与えることができます。 異なる宣言が同じ要素/プロパティの組み合わせに値を設定しようとした場合、 その競合を何らかの方法で解決する必要があります。

逆に、どの宣言も要素/プロパティの組み合わせに値を設定しようとしない場合には、 継承やプロパティの初期値を参照することで値が決定されます。

カスケーディングデフォルト化の処理は、 宣言の集合を入力とし、 各要素の各プロパティのための指定値を出力します。

文書内のすべての要素のすべてのプロパティの指定値を決定するための規則は本仕様で記述されています。 ページコンテキストとマージンボックスで指定値を決定する規則は [css-page-3] で説明されています。

1.1. モジュール間の相互作用

このセクションは規定です。

このモジュールは、 [CSS2] 6章で定義されているプロパティ値の割り当て、カスケーディング、継承の規則を置き換え、拡張します。

他のCSSモジュールは、ここで定義された構文や機能の定義を拡張する場合があります。 例えば、Media Queries Level 4仕様は、 本モジュールと組み合わせることで <media-query>値型の定義を拡張します。

本仕様の目的では、テキストノードは、 関連する要素の要素の子として扱われ、 完全なプロパティセットを持ちます。 ただしセレクタでターゲットにできないため、 計算値はすべてデフォルト化によって割り当てられます。

2. スタイルシートのインポート: @import規則

@import 規則は、他のスタイルシートからスタイル規則をインポートすることを可能にします。 @import規則が有効なスタイルシートを参照する場合、 ユーザーエージェントは、そのスタイルシートの内容を@import規則の位置に記述されたかのように扱う必要があります。 ただし、例外が2つあります:

例えば、インポートされたスタイルシートのスタイル規則内の宣言は、 @importの位置にそのまま記述されたかのようにカスケードに作用します。

@import規則は、スタイルシート内の他の有効なat規則やスタイル規則(@charsetおよび空の@layer定義は除く)より前に配置しなければならず、 また、前の@import規則との間に他の有効なat規則やスタイル規則があってはなりません。 そうでない場合、その@import規則は無効です。 @importの構文は次の通りです:

@import [ <url> | <string> ]
        [ layer | layer(<layer-name>) ]?
        [ supports( [ <supports-condition> | <declaration> ] ) ]?
        <media-query-list>? ;

各項目の意味:

次の条件付き @import規則は、UAがdisplay: flexdisplay: flexでサポートしている場合のみスタイルシートをロードし、 さらにhandheldデバイスで最大ビューポート幅が400pxの場合にのみ適用されます。
@import url("narrow.css") supports(display: flex) handheld and (max-width: 400px);
次のレイヤーインポートは、スタイルシートをそれぞれframework.componentレイヤーと無名レイヤーにロードします:
@import url("tabs.css") layer(framework.component);
@import url("override.css") layer();

<string>が指定された場合は、 同じ値の<url>として解釈されます。

次の2行は意味的に等価であり、 @importの両方の構文(url()付きと文字列のみ)を示しています:
@import "mystyle.css";
@import url("mystyle.css");

2.1. 条件付き @import規則

インポート条件によって、インポートをメディアや機能サポートに依存させることができます。 インポート条件がない場合は、インポートは無条件です。 (<media-query-list>allを指定した場合も同じ効果です。) インポート条件が一致しない場合は、 インポートされたスタイルシートの規則は適用されません。 まるでインポートされたスタイルシートが、与えられた条件の@media@supportsブロックでラップされているかのように動作します。

次の規則は、@import規則がメディア依存にできる方法を示しています:
@import url("fineprint.css") print;
@import url("bluish.css") projection, tv;
@import url("narrow.css") handheld and (max-width: 400px);

したがってユーザーエージェントは、インポート条件が一致しない限り、 条件付きインポートを取得しなくても構いません。 さらに、<supports-condition>によってインポートされたスタイルシートの適用がブロックされる場合、 UAはそのスタイルシートを(他のリンクでロードされない限り)取得してはならず、 インポート規則のCSSImportRule.styleSheet値にはnullを返さなければならない(他のリンクでロードされていても)。

次の規則は、著者がレガシーユーザーエージェント向けにフォールバック規則を提供し、 新しいユーザーエージェントのネットワークパフォーマンスに影響を与えない方法を示しています:
@import url("fallback-layout.css") supports(not (display: flex));
@supports (display: flex) {
  ...
}

インポート条件は、 <media-query-list>によって与えられ、これは メディアクエリリストとして構文解析・解釈されます。 また<supports-condition>は [[supports query]]として構文解析・解釈されます。 <declaration><supports-condition>の代わりに与えられた場合、 追加の括弧が暗黙的にあるものとして<supports-decl>として解釈され、 <supports-condition>として扱われます。

例えば、次の2行は等価です:
@import "mystyle.css" supports(display: flex);
@import "mystyle.css" supports((display: flex));

インポート条件の評価と完全な構文は、Media Queries [MEDIAQ]およびCSS Conditional Rules [CSS-CONDITIONAL-3] 仕様で定義されています。

2.2. スタイルシートインポートの処理

同じスタイルシートが複数箇所で文書にインポートまたはリンクされている場合、 ユーザーエージェントは各リンクを独立したスタイルシートへのリンクとして処理(またはそのように振る舞う)しなければなりません。

注: これはリソースの取得方法には何も要求しません。 スタイルシートがCSSOMでどのように反映され、この仕様などでどのように使われるかだけに関わります。 適切なキャッシュがあれば、UAがスタイルシートを一度しか取得しなくても、 複数回リンクやインポートされている場合でも問題ありません。

インポートされたスタイルシートのカスケードの起源は、 それをインポートしたスタイルシートのカスケードの起源です。

インポートされたスタイルシートの環境エンコーディングは、 それをインポートしたスタイルシートのエンコーディングです。 [css-syntax-3]

2.3. CSSスタイルシートのContent-Type

インポートされたスタイルシートの処理は、リンクされたリソースの実際のタイプに依存します:

リンクされたリソースのタイプがtext/cssの場合、 CSSスタイルシートとして解釈しなければなりません。 それ以外の場合はネットワークエラーとして解釈しなければなりません。

3. ショートハンドプロパティ

いくつかのプロパティはショートハンドプロパティです。 これは、著者が複数のプロパティの値を1つのプロパティで指定できることを意味します。 ショートハンドプロパティは、 そのすべてのロングハンドサブプロパティを、 その場で展開されたかのように設定します。

ショートハンド形式で値が省略された場合、 特に定義がない限り、 省略された各サブプロパティには 初期値が割り当てられます。

これは、ショートハンドプロパティ宣言が、明示的に設定されていないものも含めて すべてサブプロパティを設定することを意味します。 不注意に使うと、意図せずサブプロパティをリセットしてしまう可能性があります。 慎重に使えば、ショートハンドは他のソースからカスケードされた サブプロパティをリセットし、「白紙状態」を保証できます。

例えば、background: greenと書くと background-color: greenと書く場合よりも、 以前の宣言でbackground-imageで背景画像が設定されていた場合でも 背景色が優先されることが保証されます。

例えば、CSS Level 1のfontプロパティは、 ショートハンドプロパティであり、 font-stylefont-variantfont-weightfont-sizeline-heightfont-familyを一度に設定できます。 この例の複数の宣言は:
h1 {
  font-weight: bold;
  font-size: 12pt;
  line-height: 14pt;
  font-family: Helvetica;
  font-variant: normal;
  font-style: normal;
}

次のように書き換えできます:

h1 { font: bold 12pt/14pt Helvetica }

CSSでfontサブプロパティが追加されるほど、 ショートハンド宣言でもそれらが初期値にリセットされます。

場合によっては、ショートハンドが 異なる構文や、サブプロパティの値と直接対応しない特別なキーワードを持つことがあります。 (その場合はショートハンドが値の展開方法を明示的に定義します。)

他の場合、あるプロパティがショートハンドのリセット専用サブプロパティであることがあります。 他のサブプロパティと同様、 未指定の場合はショートハンドによって初期値にリセットされますが、 ショートハンドにそのサブプロパティの他の値を設定する構文がないことがあります。 例えば、borderショートハンドは border-imageを初期値noneにリセットしますが、 他の値に設定する構文はありません。 [css-backgrounds-3]

ショートハンドCSS全体キーワードとして指定された場合 [css-values-3]、 すべてのサブプロパティがそのキーワードに設定されます。 リセット専用サブプロパティも含みます。 (これらのキーワードは、1つの宣言内で他の値と組み合わせることはできません。ショートハンドでも不可。)

ショートハンドプロパティに !importantを指定すると、すべてのサブプロパティ!importantと宣言したのと同じになります。

3.1. プロパティのエイリアス化

プロパティは、しばらくサポートされた後で名前が変更されることがあります。 例えばベンダープレフィックス付きプロパティが標準化される場合などです。 元の名前は互換性のために引き続きサポートする必要がありますが、新しい名前の方が推奨されます。 このため、CSSでは古い構文を新しい構文に「エイリアス」する方法が2つ定義されています。

レガシー名エイリアス
古いプロパティの値構文が新しいプロパティと同一の場合、 2つの名前は大文字小文字のマッピングと同様にパース時にエイリアスされます。 パース時に古いプロパティは新しいプロパティに変換されます。 この変換はCSSOMでも適用されます。 文字列引数やプロパティアクセスでも、 古いプロパティ名への要求は新しいプロパティ名へ透過的に転送されます。
例えばold-nameレガシー名エイリアスnew-nameのエイリアスである場合、 getComputedStyle(el).oldNamenewNameプロパティの計算スタイルを返し、 el.style.setPropertyValue("old-name", "value") は、new-nameプロパティに"value"を設定します。
レガシーショートハンド
古いプロパティの構文が新しいプロパティと異なる場合、 2つの名前はショートハンドの仕組みでエイリアスされます。 これらのショートハンドはレガシーショートハンドと定義され、 使用は非推奨です。 それ以外の挙動は通常のショートハンドと同じですが、 CSSOMが宣言をシリアライズする際には使用されません。 [CSSOM]
例えば、page-break-*プロパティは レガシーショートハンドであり、 break-*プロパティのエイリアスです (CSS Fragmentation 3 § 3.4 Page Break Aliases: the page-break-before, page-break-after, and page-break-inside properties参照)。

page-break-before: alwaysを設定すると、 パース時にbreak-before: pageに展開されます。通常のショートハンドと同様です。 同様に、break-before: pageを設定した場合、 getComputedStyle(el).pageBreakBeforeを呼び出すと "always"が返ります。 しかし、スタイルブロックをシリアライズする際 (CSSOM 1 § 6.7.2 Serializing CSS Values参照)、 page-break-beforeプロパティは ショートハンドとしてシリアライズされることはなく、 break-beforeが指定されていたかどうかに関わらず、 必ずbreak-beforeが選択されます。

3.2. すべてのプロパティのリセット: allプロパティ

Name: all
値: initial | inherit | unset | revert | revert-layer
初期値: 各プロパティ参照
適用対象: 各プロパティ参照
継承: 各プロパティ参照
パーセンテージ: 各プロパティ参照
計算値: 各プロパティ参照
アニメーションタイプ: 各プロパティ参照
正規順序: 文法ごと

all プロパティはショートハンドであり、 すべてのCSSプロパティをリセットします。 ただしdirectionunicode-bidiは除きます。 このプロパティはCSS全体キーワードのみを受け付けます。 カスタムプロパティはリセットされません。 [css-variables-1]

注: 除外されたCSSプロパティ directionおよびunicode-bidiは実際にはマークアップレベルの機能であり、 著者のスタイルシートで設定すべきではありません。 (これらはUAがサポートしない文書言語をスタイルするためだけにCSSプロパティとして存在します。) 著者はHTMLのdir属性など、適切なマークアップを使うべきです。 [css-writing-modes-3]

例えば、著者が要素にall: initialを指定した場合、 すべての継承がブロックされ、すべてのプロパティがリセットされます。 これは著者・ユーザー・ユーザーエージェントレベルのカスケードにどんな規則も現れなかったかのようになります。

これはページに含まれる「ウィジェット」のルート要素など、 外部ページのスタイルを継承したくない場合に便利です。 ただし、その要素に適用される「デフォルト」スタイル (例:UAスタイルシートの<div>などのブロック要素へのdisplay: blockなど) もすべて上書きされる点に注意してください。

4. 値の処理

ユーザーエージェントが文書をパースし、文書ツリーを構築したら、 ツリー内のすべての要素およびフォーマット構造のすべてのボックスに対して、 対象メディアタイプに適用されるすべてのプロパティの値を割り当てなければなりません。

与えられた要素またはボックスのCSSプロパティの最終値は、 複数ステップの計算結果です:

  1. まず、各要素の各プロパティについて、その要素に適用された宣言値を集めます。 要素には宣言値がゼロ個または複数個適用されている可能性があります。
  2. カスケード処理によってカスケード値が得られます。 各要素の各プロパティにつきカスケード値は最大1つです。
  3. デフォルト化によって指定値が得られます。 すべての要素はすべてのプロパティにつき指定値を1つ持ちます。
  4. 値の依存関係を解決することで算出値が得られます。 すべての要素はすべてのプロパティにつき算出値を1つ持ちます。
  5. 文書のフォーマットにより使用値が得られます。 要素がそのプロパティに対して使用値を持つのは、そのプロパティが要素に適用される場合のみです。
  6. 最後に、表示環境の制約に基づき、使用値が実際値に変換されます。 使用値と同様、 要素のプロパティに対して実際値が存在する場合としない場合があります。

接続されていない要素や文書のフラット化要素ツリーに含まれていない要素は、 CSS値処理に参加せず、 宣言値カスケード値指定値算出値使用値実際値を持ちません。 たとえスタイル宣言が割り当てられていても(例えばstyle属性によって)、値の処理はされません。

4.1. 宣言値

要素に適用された各プロパティ宣言は、その要素に関連付けられたプロパティについて宣言値を与えます。 詳細は宣言のフィルタリングを参照してください。

これらの値はカスケードによって処理され、単一の「勝ち値」が選ばれます。

4.1.1. 値のエイリアス化

一部のプロパティ値にはレガシー値エイリアスがあります。 パース時にレガシー構文が新しい構文に変換され、 パース入力とは異なる宣言値が生成されます。 このエイリアスは主にレガシー互換性のために使われ、 例えばベンダープレフィックス付き値を標準値へ変換する用途などです。

4.2. カスケード値

カスケード値カスケード処理の結果を表します。 カスケードで勝った宣言値カスケード結果で最初に並ぶもの)です。 カスケード結果が空リストの場合、 カスケード値はありません。

4.3. 指定値

指定値は 著者がその要素に対して意図した特定プロパティの値です。 これはカスケード値デフォルト化処理を適用した結果であり、 すべての要素のすべてのプロパティに指定値が存在することを保証します。

多くの場合、指定値カスケード値です。 ただしカスケード値が全くない場合、 指定値デフォルト化されます。 CSS全体キーワードがプロパティのカスケード値になった場合は特別に扱われ、 キーワードに応じて指定値が設定されます。 詳細は§ 7.3 明示的デフォルト化参照。

4.4. 算出値

算出値指定値をプロパティ定義表の「算出値」行で定義される方法で解決した結果です。 通常は継承に備えて絶対化されます。

注: 算出値は、継承の際に親から子へ伝達される値です。 歴史的理由により、これはgetComputedStyle() 関数が返す値とは限りません。 この関数はしばしば使用値を返します。 [CSSOM] また、算出値は抽象的なデータ表現です。 定義はそのデータ表現を反映しており、データのシリアライズ方法ではありません。 例えばシリアライズ規則では、パース時に暗黙的となる値の省略が許されることがありますが、 それらの値も算出値の一部です。

指定値は絶対値(例:red2mmのように他の値に依存しない)にも、 相対値(例:auto2emのように他の値に依存する)にもなります。 相対値の算出では一般的に絶対化が行われます:

例(f)、(g)、(h)は下記の表を参照。

注: 一般に算出値は、文書のレイアウトやネットワークリクエストの解決、 要素やその親以外から値を取得するなど、コストが高い/並列化しづらい処理を行わずに 指定値を可能な限り解決します。

算出値はプロパティが適用されない場合でも存在します。 ただし、プロパティによっては算出値の決定方法が、 そのプロパティが要素に適用されるかどうかで変わる場合があります。

4.5. 使用値

使用値は、 算出値を絶対理論値に仕上げるために残る計算を行った結果であり、 文書のフォーマットで使用されます。

例えば、width: auto の宣言は、要素の祖先レイアウトが分からなければ長さに解決できません。 そのため算出値autoですが、 使用値は例えば100pxのような絶対長さです。[CSS2]

他の例として、 <div>は算出break-before値としてautoを持つことがありますが、 最初の子からの伝播により使用break-before値としてpageを得ることがあります。[css-break-3]

プロパティがこの要素やボックスタイプに適用されない場合、 そのプロパティの使用値はありません。

例えば、flexプロパティは、 フレックスアイテムでない要素には使用値がありません。

4.5.1. 適用プロパティ

プロパティがある要素やボックスタイプに適用されない場合(「適用対象」行に記載)、 そのボックスや要素には直接的な効果を持ちません。

注: 適用されないプロパティでも、 その算出値が適用される他のプロパティの計算に影響する場合は間接的にフォーマットに効果があります。 また、算出値自体は常に存在し、 子孫に継承され、そこで効果を持つことがあります。

writing-modetext-orientationは表の行には適用されません (表の行や子のレイアウトには影響しません)が、 こうしたボックスに設定すると、 chなどのフォント相対単位の計算に影響し、 <length>値を取るプロパティ全般に間接影響を及ぼすことがあります。
text-transformをHTML p 要素(デフォルトでdisplay: block)に設定すると、 効果があります。 text-transformは本来インラインボックスだけに適用されますが、 プロパティは継承され、 段落の匿名ルートインラインボックスに適用され、そのテキストに効果が現れます。

注: 「すべての要素」に適用されると定義されたプロパティは、 すべての要素とdisplay型に適用されますが、 すべての疑似要素型に必ずしも適用されるわけではありません。 疑似要素は固有のレンダリングモデルや制限を持つことが多いためです。 ただし::before::after疑似要素は、 通常の要素とほぼ同様のボックス生成が定義されており、 「すべての要素」に適用されるプロパティを受け付けるよう定義されています。 疑似要素については[CSS-PSEUDO-4]を参照してください。 疑似要素については詳細もそちらを参照。

4.6. 実際値

使用値は本来そのまま利用可能ですが、 ユーザーエージェントが特定環境で値を利用できない場合があります。例えば、ユーザーエージェントが整数ピクセル幅のみで枠線を描画できる場合、 使用値を近似する必要が生じます。 また、要素のフォントサイズは利用可能なフォントやfont-size-adjustプロパティの値によって調整される場合があります。 実際値は、 このような調整が行われた後の使用値です。

注: 要素の実際値を調べることで、 文書のレイアウトの多くを知ることができます。 ただしすべての情報が実際値に記録されるわけではありません。 例えばpage-break-afterプロパティの実際値は、 要素の後に改ページがあるかどうかを反映しません。 同様にorphansの実際値は、 ある要素内に孤児行が何行あるかを反映しません。 例(j)、(k)は下記の表を参照してください。

4.7.

CSS値計算の例
プロパティ 勝ち宣言 カスケード値 指定値 算出値 使用値 実際値
(a) text-align text-align: left left left left left left
(b) border-top-width, border-right-width, border-bottom-width, border-left-width border-width: inherit inherit 4.2px 4.2px 4.2px 4px
(c) width (なし) (なし) auto (初期値) auto 120px 120px
(d) list-style-position list-style-position: inherit inherit inside inside inside inside
(e) list-style-position list-style-position: initial initial outside (初期値) outside outside outside
(f) font-size font-size: 1.2em 1.2em 1.2em 14.1px 14.1px 14px
(g) width width: 80% 80% 80% 80% 354.2px 354px
(h) width width: auto auto auto auto 134px 134px
(i) height height: auto auto auto auto 176px 176px
(j) page-break-after (なし) (なし) auto (初期値) auto auto auto
(k) orphans orphans: 3 3 3 3 3 3

4.8. フラグメントごとの値処理

特定のCSS機能は フラグメント単位で値処理に影響を与える場合があります。 例えば CSS Pseudo-Elements 4 § 2.1.3 継承と ::first-line 疑似要素では、 ::first-line 疑似要素内のフラグメントの継承を変更しています。 このような場合、個々のフラグメントに異なる指定値が与えられるときは、 他のプロパティの算出値に基づいて解決される値 (例えば currentcolorem単位など) は ボックスフラグメントごとに解決されます。 以降の値処理は各フラグメントで通常通り進行します。

ボックス単位(ボックスフラグメント単位ではなく)で 単一値を仮定するAPIは、非ツリー従属疑似要素の影響を無視しなければなりません。 (例えば ::first-line のスタイルは getComputedStyle() の返す値には影響しません。)

例えば、次のマークアップの場合:
<div><span>First line<br />Second line</span></div>
<div><span>First line</span></div>
<div>First line<br><span>Second line</span></div>
<style>
div { color: blue; }
div::first-line { color: yellow; }
span { border: thin solid currentcolor; }
</style>

div内では、 「First line」テキストは黄色、「Second line」テキストは青色になります。 各行を包む span の各フラグメントの枠線色もそれぞれの色になります。

しかし、すべてのspan要素に対して getComputedStyle() を呼ぶと、 border-color"blue"が返ります。 これは ::first-line 疑似要素の効果が フラグメント非対応APIでは無視されるためです。

5. フィルタリング

宣言値を見つけるために、 実装はまず各要素に適用されるすべての宣言を特定しなければなりません。 宣言が要素に適用されるのは次の場合です:

適用される宣言の値は各要素の各プロパティごとに 宣言値のリストを形成します。 次のセクションである カスケードがこれらのリストを優先順位付けします。

6. カスケーディング

カスケードは、 与えられた要素の与えられたプロパティについて 宣言値の順序付けされていないリストを受け取り、 下記で決定される宣言の優先順位でソートし、 単一のカスケード値を出力します。

6.1. カスケードのソート順

カスケードは以下の基準で宣言を優先順位順(高い順)にソートします:

起源と重要度
宣言の起源はどこから来たかによります。 重要度!importantで宣言されているかどうかです(詳細は下記)。 各起源の優先順位は高い順に:
  1. トランジション宣言 [css-transitions-1]
  2. 重要ユーザーエージェント宣言
  3. 重要ユーザー宣言
  4. 重要著者宣言
  5. アニメーション宣言 [css-animations-1]
  6. 通常著者宣言
  7. 通常ユーザー宣言
  8. 通常ユーザーエージェント宣言

このリストの先頭の起源の宣言が 後ろの起源の宣言よりも優先されます。

コンテキスト
文書言語は異なるカプセル化コンテキスト(例えばツリーコンテキストなど)から宣言を混在させる場合があります。 これはシャドウツリーなど [DOM]のネストされたツリーコンテキストが例です。

異なるカプセル化コンテキストからの宣言同士を比較するとき、 通常規則の場合は外側コンテキストの宣言が勝ち、 重要規則の場合は内側コンテキストの宣言が勝ちます。 このとき、[DOM]ツリーコンテキストシャドウ含むツリー順でネストされているとみなします。

注: これは、あるカプセル化コンテキスト通常宣言が外側コンテキストによって容易に上書きできる一方、 重要宣言は外側コンテキストで上書きできなくなることを意味します。

要素直付けスタイル
通常宣言と 重要宣言についてそれぞれ、 要素に直接付与された宣言(style属性の内容など)は、 セレクタで間接的にマッピングされた宣言よりも同じ重要度で優先されます。

詳細は[css-style-attr]参照。

注: 非CSS表示ヒント(例:プレゼンテーションマークアップ)は 別途扱われます。§ 6.5 非CSS表示ヒントの優先順位参照。

レイヤー
起源コンテキスト内の宣言は カスケードレイヤーに明示的に割り当てられる場合があります。 このステップでは、明示レイヤーに割り当てられない宣言は暗黙の最終レイヤーに追加されます。

カスケードレイヤー(宣言同様)は出現順で並びます。 異なるレイヤーの宣言を比較するとき、 通常規則では最後のレイヤーの宣言が勝ち、 重要規則では最初のレイヤーの宣言が勝ちます。

注: これは通常重要起源のレイヤー化と同じ論理で、 !importantフラグが両者で同じ「上書き」目的で機能するようにしています。

詳細度
Selectorsモジュール [SELECT]で セレクタの詳細度の計算方法が定義されています。 各宣言は所属するスタイル規則と同じ詳細度を持ち、 詳細度が最も高い宣言が勝ちます。
出現順
文書順で最後に現れた宣言が勝ちます。 この目的のために:
  • スタイルシートは最終CSSスタイルシートの順序で並びます。
  • インポートスタイルシートの宣言は スタイルシートが@import規則の位置に挿入されたかのように並びます。
  • 発信文書で独立してリンクされたスタイルシートの宣言は ホスト文書言語で定義されたリンク順で連結されたかのように扱われます。
  • style属性の宣言は、その要素の文書順に並び、すべてのスタイルシートより後に置かれます。

カスケード結果は、 各要素の各プロパティについて 宣言値の(空の場合もある)ソート済みリストです。

6.2. カスケーディングの起源

各スタイル規則はカスケード起源を持ち、 カスケードへの参加位置を決定します。 CSSは3つのコア起源を定義します:

著者起源
著者は文書言語の慣習に従ってソース文書用のスタイルシートを指定します。 例えばHTMLでは、スタイルシートは文書内に含めることも外部からリンクすることもできます。
ユーザー起源
ユーザーは特定文書用にスタイル情報を指定できる場合があります。 例えば、ユーザーがスタイルシートを含むファイルを指定したり、 ユーザーエージェントがユーザースタイルシートを生成するインターフェースを提供したり(またはそのように振る舞う)ことがあります。
ユーザーエージェント起源
準拠ユーザーエージェントはデフォルトスタイルシートを適用しなければなりません(またはそのように振る舞う)。 ユーザーエージェントのデフォルトスタイルシートは、 文書言語に対する一般的な表示期待を満たす方法で文書言語の要素を提示するべきです。 (例:ビジュアルブラウザでは、HTMLのEM要素はイタリック体で表示されます) 例として HTMLユーザーエージェントスタイルシート[HTML]

CSSの拡張では、以下の追加起源が定義されています:

アニメーション起源
CSS Animations [css-animations-1]は 実行時にその効果を表す「仮想」規則を生成します。
トランジション起源
CSS Animationsと同様、CSS Transitions [css-transitions-1]も 実行時にその効果を表す「仮想」規則を生成します。

6.3. 重要宣言:!important注釈

CSSは著者とユーザースタイルシートの間の権限バランスを作ろうとします。 デフォルトでは、著者のスタイルシートの規則がユーザーのスタイルシートの規則よりも優先され、 ユーザーのスタイルシートの規則はユーザーエージェントのデフォルトスタイルシートの規則よりも優先されます。 これを補うため、宣言にimportantを付けて カスケード内での重みを高め、優先順位の順序を反転できます。

宣言は、値の最後の2つ(空白・コメントを除く)トークンが 区切りトークン!と識別子トークンimportantであれば [css-syntax-3]定義通り 重要です。 その他の宣言は通常(非重要)です。

[hidden] { display: none !important; }

重要な宣言は 通常宣言より優先されます。 著者およびユーザースタイルシートには重要な宣言を含めることができ、 ユーザー起源重要宣言が 著者起源重要宣言より優先されます。 このCSS機能は、特別な要件(大きなフォント、色の組み合わせなど)を持つユーザーが 表示を制御できるようにすることで文書のアクセシビリティを高めます。

すべての起源の重要宣言は アニメーションよりも優先されます。 これにより、著者は重要な場合にアニメーション値を上書きできます。 (アニメーション値は通常他のすべての規則より優先されます。) [css-animations-1]

ユーザーエージェントスタイルシートにも 重要宣言を含めることができます。 これらはすべての著者およびユーザー宣言よりも優先されます。

次の例でユーザースタイルシートの最初の規則は !important宣言を含み、 著者スタイルシートの対応する宣言を上書きします。 2つ目の規則も!importantのため勝ちます。 しかし、ユーザースタイルシートの3つ目の宣言は!importantでないため、 著者スタイルシートの2つ目の規則に負けます (これはショートハンドプロパティへの設定です)。 また、著者スタイルシートの3つ目の規則は2つ目の規則に負けます(2つ目が!importantだから)。 これは!important宣言が著者スタイルシート内でも機能することを示しています。
/* ユーザースタイルシートより */
p { text-indent: 1em !important }
p { font-style: italic !important }
p { font-size: 18pt }

/* 著者スタイルシートより */
p { text-indent: 1.5em !important }
p { font: normal 12pt sans-serif !important }
p { font-size: 24pt }
プロパティ 勝ち値
text-indent 1em
font-style italic
font-size 12pt
font-family sans-serif

6.4. カスケードレイヤー

カスケード起源がユーザーと著者のスタイル間の権限バランスを提供するのと同様に、カスケードレイヤーは、単一の起源内で構造的に懸案事項を整理・バランスする方法を提供します。 一つのカスケードレイヤー内の規則は一緒にカスケードされ、 レイヤー外のスタイル規則とは混ざりません。

著者は、要素のデフォルト、サードパーティライブラリ、テーマ、コンポーネント、上書き、その他のスタイリング懸案を表すレイヤーを作成でき、各レイヤー内でセレクタや詳細度を変更せず、またソース順に依存せずに、レイヤーのカスケード順を明示的に並べ替えることができます。

例えば、以下は明示的なresetレイヤーを生成し、 レイヤーなしのスタイルよりも低いカスケード重みとなります。
audio {
  /* 詳細度 0,0,1 - 暗黙(最終)レイヤー */
  display: flex;
}

@layer reset {
  audio[controls] {
    /* 詳細度 0,1,1 - 明示的な "reset" レイヤー */
    display: block;
  }
}

レイヤーなしの audio 要素への宣言は、 audio[controls]への明示的なレイヤー宣言よりも優先されます ― 詳細度が低く、ソース順が先でもです。

名前定義at規則@keyframes@font-faceなど)がカスケードレイヤー内で定義された場合も、名前衝突の解決にレイヤー順を使います。

例えば、 著者はフレームワークのアニメーションを、 より優先度の高いレイヤーで同じ名前のkeyframesを定義することで上書きできます。
/* レイヤー順を定義し、"override" レイヤーが優先されるようにする */
@layer framework, override;

@layer override {
  @keyframes slide-left {
    from { translate: 0; }
    to { translate: -100% 0; }
  }
}

@layer framework {
  @keyframes slide-left {
    from { margin-left: 0; }
    to { margin-left: -100%; }
  }
}

.sidebar { animation: slide-left 300ms; }

この場合、overrideレイヤーがframeworkレイヤーより高いカスケード優先度を持つため、 slide-leftアニメーションはtranslateプロパティを使ってアニメーションされ、 margin-leftは使われません。

6.4.1. カスケードレイヤーの宣言

カスケードレイヤーは以下の方法で宣言できます:

linkやstyle要素をカスケードレイヤーに割り当てる属性を提供すべきか? [Issue #w3c/csswg-drafts#5853]

6.4.2. レイヤーの名前付けとネスト

カスケードレイヤーレイヤー名を持ちます。 これは各レイヤーネストレベルを表す順序付きリストで、 各セグメントは(CSS識別子として)名前付きまたは匿名にできます。 (つまり、レイヤーが他のレイヤー内にネストされている場合、名前が連結されます。) レイヤーが他のレイヤーのスコープ内で宣言された場合、 それは他のレイヤーにネストされます。 例えば、@layer規則の中に別の@layer、 レイヤー付き@importの中にレイヤー付きインポート、 またはレイヤー付きインポート内の@layer規則など。

レイヤー名は、同じ順序で同じセグメントを持つ場合、同じカスケードレイヤーを表します。 ただし匿名セグメントはそれぞれ固有の識別子を持ちます。 ネストによって複数のレイヤーが同じ匿名セグメントを共有することもあります。

明示的なレイヤー識別子は複数のスタイルブロックを単一レイヤーに割り当てる方法を提供します。 次の例では、 headings.csslinks.cssの内容はaudio[controls]規則と同じレイヤーでカスケードされます:
@import url(headings.css) layer(default);
@import url(links.css) layer(default);

@layer default {
  audio[controls] {
    display: block;
  }
}
この例では、 ネストされたframework.baseレイヤーは トップレベルのbaseレイヤーとは異なります:
@layer base {
  p { max-width: 70ch; }
}

@layer framework {
  @layer base {
    p { margin-block: 0.75em; }
  }

  @layer theme {
    p { color: #222; }
  }
}

結果のレイヤーはツリーとして表現できます:

  1. base

  2. framework

    1. base

    2. theme

または、ネストされた識別子を使ったフラットリストとして:

  1. base

  2. framework.base

  3. framework.theme

構文的には、明示的なレイヤー名は、 @layer@import規則の <layer-name>で表現され、 ピリオド区切りの<ident>トークンのリスト (空白なし)です:

<layer-name> = <ident> [ '.' <ident> ]*

CSS全体キーワードは将来のために予約されており、 <ident>として <layer-name>に使用するとパース時に無効です。 複数識別子をピリオドで連結すると、 それぞれのレイヤーが順にネストされたことを表す省略記法です。

@layer framework {
  @layer default {
     p { margin-block: 0.75em; }
  }

  @layer theme {
    p { color: #222; }
  }
}

@layer framework.theme {
  /* これらのスタイルは framework レイヤー内の theme レイヤーに追加されます */
  blockquote { color: rebeccapurple; }
}

注: ネストしたレイヤーは親レイヤーの外へ「脱出」して外部レイヤーを参照できません。

6.4.2.1. 匿名レイヤー

@layer規則で<layer-name>を省略した場合や、 @import規則でlayerキーワード(<layer-name>を指定しない)を使った場合、 そのレイヤー名は固有の匿名セグメントを持ちます。 そのため外部から参照できません。

匿名レイヤー宣言の各出現は固有のカスケードレイヤーとなります:
<layer-name>なしで宣言されたレイヤーは、外部からスタイルの追加や並べ替えのフックを提供しません。

これは簡素化のための便宜であるだけでなく、 チームが全コードを同じ場所に定義するという組織的慣習を強制したい場合や、 ライブラリが内部の「プライベート」レイヤーを統合&隠蔽し、著者による操作を防ぎたい場合にも使えます:

/* bootstrap-base.css */
/* 各サブファイルの名前なしラッパーレイヤー */
@import url(base-forms.css) layer;
@import url(base-links.css) layer;
@import url(base-headings.css) layer;
/* bootstrap.css */
/* 内部名はアクセス不可、"base"に吸収される */
@import url(bootstrap-base.css) layer(base);
/* author.css */
/* 著者は bootstrap.base レイヤーにはアクセスできるが、名前なしレイヤーにはアクセスできない */
@import url(bootstrap.css) layer(bootstrap);

/* bootstrap レイヤーに追加スタイルを加える: */
@layer bootstrap {...}

6.4.3. レイヤーの順序

カスケードレイヤーは最初に宣言された順でソートされ、 ネストされたレイヤーは親レイヤー内でまとめられ、 レイヤーなしの規則より先になります。

次のレイヤー規則がある場合:
/* レイヤーなしスタイルはレイヤー順で最後に来る */
h1 { color: darkslateblue; }

@layer reset.type {
  strong { font-weight: bold; }
}

@layer framework {
  .title { font-weight: 100; }

  @layer theme {
    h1, h2 { color: maroon; }
  }
}

@layer reset {
  [hidden] { display: none; }
}

外側レイヤーが先にソートされ、 レイヤーなしスタイル規則は暗黙の外側レイヤーに追加され、 これは明示的なレイヤーよりも高い優先度(後になる)を持ちます:

  1. reset

  2. framework

  3. (暗黙の外側レイヤー)

各レイヤー内では、 ネストされたレイヤーが出現順でソートされ、 さらなるネストなしのスタイル規則も明示的なネストレイヤーの後に暗黙のサブレイヤーとして追加されます:

  1. reset.type

  2. reset(暗黙のサブレイヤー)

  3. framework.theme

  4. framework(暗黙のサブレイヤー)

  5. (暗黙の外側レイヤー)

レイヤーが条件付きグループ規則内で定義された場合、 条件が真でなければレイヤー順に寄与しません。 あるいは、その条件付きグループ規則が文書内の異なる要素ごとに異なる評価ができる場合は寄与します。

注: レイヤー順は文書全体でグローバルなので、 要素感知型条件付きグループ規則内で定義されるレイヤーも グローバルなレイヤー順を確立する際に考慮されます(条件に関わらず)。 ただし文書全体にグローバルな条件(@media@supportsなど)は、 そのような@layer規則を条件付きで扱うことができます。

例えば、 次のレイヤー順は どのメディア条件が一致するかによって変わります:
@media (min-width: 30em) {
  @layer layout {
    .title { font-size: x-large; }
  }
}

@media (prefers-color-scheme: dark) {
  @layer theme {
    .title { color: white; }
  }
}

@layer theme, layout;

最初のメディアクエリがビューポート寸法で一致すると、 layoutレイヤーがレイヤー順の先頭になります。 カラースキームのプリファレンスが一致する場合や、 どちらの条件も真でない場合は、themeが先頭になります。

この挙動を避けたい著者は、 事前にレイヤーの順序を明示的に定め、 条件付き規則内で新たなレイヤーを定義しないようにできます。

注: カスケードレイヤー起源コンテキストごとにスコープされるので、 light DOMのレイヤー順がshadow DOMの同名レイヤー順に影響したり、その逆になることはありません。

著者がレイヤーなしスタイルをレイヤー順に明示的に配置できるようにする [Issue #6323]

6.4.4. インラインでのレイヤー宣言:@layer規則

@layer規則は、カスケードレイヤーを宣言し、スタイル規則を割り当てることができます。

6.4.4.1. インラインでのスタイル割り当て:@layerブロックat規則

@layer ブロックat規則は、その子スタイル規則を特定の名前付きカスケードレイヤーに割り当てます。 このブロックレイヤー割り当て構文は次のとおりです:

@layer <layer-name>? {
  <stylesheet>
}

このような@layerブロック規則は、条件付きグループ規則 [CSS-CONDITIONAL-3](条件がtrueの場合)と同じ制限と処理を受けます。

例えば、@layer@mediaは混在できます:
@layer framework {
  h1, h2 { color: maroon; background: white;}

  @media (prefers-color-scheme: dark) {
    h1, h2 { color: red; background: black; }
  }
}

注: @layer ブロックat規則@import規則と混在できません。

6.4.4.2. スタイルなしの宣言:@layer文at規則

@layer 規則は、スタイル規則を割り当てずにレイヤー名のみを指定することで新しいレイヤーを定義することもできます:

@layer <layer-name>#;

このような空の@layer規則は、@import@namespace規則の前(@charset規則の後、あれば)、 または@layerブロックat規則が許可されるすべての場所で使用できます。

注: @layer規則は@import@namespace規則の間に挿入できません。 @layer規則が@import@namespace規則の後に現れると、それ以降の@import@namespace規則は無視されます。

ブロック構文と異なり、この構文では複数のレイヤー名をカンマ区切りで指定でき、それぞれのレイヤーを指定順で宣言します。

注: レイヤーの順序はレイヤー名の最初の出現で定義されるため(§ 6.4.3 レイヤーの順序参照)、 この規則によりページはレイヤーの順序を事前に宣言でき、スタイルシート全体を読まなくても順序が分かります。 また、インラインレイヤーをインポートレイヤーと混在でき、ブロック構文ではできません。

文の構文により、スタイル規則を各レイヤーに追加する順序に関係なく事前にレイヤー順を定められます。 このレイヤー順を事前に定めておくと便利な場合があります。例えば、@import規則の前などです。 この例では、インポートされたtheme.cssスタイル規則が後のdefaultブロックで追加された規則よりも優先されます(レイヤー順が事前に定義されているため):
@layer default, theme, components;
@import url(theme.css) layer(theme);

@layer default {
  audio[controls] {
    display: block;
  }
}

また、@import規則を@layer規則の間に挿入して順序を定めることもできます。 この例でも同じ結果になります:

@layer default;
@import url(theme.css) layer(theme);
@layer components;

@layer default {
  audio[controls] {
    display: block;
  }
}

ただし、@import@namespace規則は連続していなければならず、間に他の規則を挟んではいけません。 以下は無効です:

@import url(default.css) layer(default);
@layer theme;
@import url(components.css) layer(components);

@layer theme {
  audio[controls] { display: block;
  }
}

6.5. 非CSSプレゼンテーションヒントの優先順位

UAはソース文書のマークアップに含まれるプレゼンテーションヒント(例:bgcolor属性やs要素 [HTML])を尊重することができます。 文書言語ベースのスタイリングはすべて対応するCSS規則に変換され、 UA起源または通常のユーザー起源著者起源の間の特別な著者プレゼンテーションヒント起源の規則としてカスケードに加わります。 カスケードの目的では、この著者プレゼンテーションヒント起源は独立した起源として扱われますが、revertキーワードの目的では著者起源の一部とみなされます。

文書言語は、このようなプレゼンテーションヒントがカスケードUA起源または著者起源として入るかを定義できます。その場合、UAはそれに従って動作しなければなりません。例えば、[SVG11]はそのプレゼンテーション属性を著者起源にマッピングします。

注: プレゼンテーションヒントがカスケードUA起源規則として入る場合、著者起源ユーザー起源スタイルで上書きできます。 著者プレゼンテーションヒント起源規則として入る場合は、著者起源スタイルで上書きできますが、非重要ユーザー起源スタイルでは上書きできません。ホスト言語はこれらを考慮して適切な起源を選択すべきです。

7. デフォルト化

カスケードで値が決まらない場合、 指定値は他の方法で決定する必要があります。 継承プロパティは親要素から継承によってデフォルト値を取得し、それ以外のプロパティは初期値を取得します。 著者はinheritinitialキーワードを用いて継承や初期化を明示的に指定できます。

7.1. 初期値

各プロパティは初期値を持ち、これはプロパティ定義表で定義されています。 プロパティが継承プロパティでなく、 カスケードで値が決まらない場合、 そのプロパティの指定値初期値となります。

7.2. 継承

継承は、親要素から子要素へプロパティ値を伝播します。 要素のプロパティの継承値は、親要素のそのプロパティの算出値です。 ルート要素は親要素がないため、その継承値はプロパティの初期値となります。

[DOM]ツリーにシャドウがある場合、継承はフラット化要素ツリー上で動作します。これにより、スロットに割り当てられた要素はslot要素から継承し、light treeの親からは直接継承しません。 疑似要素は各疑似要素のために記述された架空タグシーケンスに従い継承します。[CSS-PSEUDO-4]

一部プロパティは継承プロパティであり、プロパティ定義表で定義されています。 これは、カスケードで値が決まらない場合、継承によって値が決定されることを意味します。

プロパティは明示的に継承することもできます。inheritキーワード参照。

注: 継承は文書ツリーに従い、匿名ボックスやボックスツリーの操作によって妨げられません。

7.3. 明示的デフォルト化

以下にCSS全体プロパティ値が定義されています。 プロパティをこれらの値で宣言すると、特定のデフォルト化動作を明示的に指定します。 CSS Values and Units [css-values-3]で規定されている通り、すべてのCSSプロパティはこれらの値を受け入れられます。

7.3.1. プロパティのリセット:initialキーワード

プロパティのカスケード値initialキーワードの場合、 プロパティの指定値はその初期値となります。

7.3.2. 明示的継承:inheritキーワード

プロパティのカスケード値inheritキーワードの場合、 プロパティの指定値算出値は、継承値となります。

7.3.3. すべての宣言の消去:unsetキーワード

プロパティのカスケード値unsetキーワードの場合、 継承プロパティならinheritとして扱い、 それ以外はinitialとして扱います。 このキーワードは、カスケード内で以前に現れた宣言値をすべて消去し、プロパティ(またはショートハンドの全ロングハンド)に応じて正しく継承または初期化します。

7.3.4. カスケード起源の巻き戻し:revertキーワード

プロパティのカスケード値revertキーワードの場合、 挙動は宣言が属するカスケード起源によって異なります:

ユーザーエージェント起源
unsetと同等。
ユーザー起源
カスケード値をユーザーエージェントレベルまで巻き戻し、指定値はこの要素のこのプロパティについて著者起源またはユーザー起源規則が何も指定されていないかのように計算される。
著者起源
カスケード値をユーザー起源まで巻き戻し、指定値はこの要素のこのプロパティについて著者起源規則が何も指定されていないかのように計算される。revertの目的では、この起源にアニメーション起源も含む。

7.3.5. カスケードレイヤーの巻き戻し:revert-layer キーワード

プロパティのカスケード値revert-layerキーワードの場合、 カスケード値は一つ下のレイヤーまで巻き戻されます。 この要素のこのプロパティについて、現在のカスケードレイヤー内(またはその通常重要レベルの間)に規則が何も指定されていないかのように指定値が計算されます。 ただし、重要要素直付けスタイルに対するrevert-layerの場合は、 要素直付けスタイルとその間のアニメーション起源のみ巻き戻し、 その間の著者起源重要規則は巻き戻しません。

注: 同じカスケード起源内に下位の宣言がない場合、revert-layer値は前の起源まで巻き戻されます。

注: アニメーション起源はこの目的では著者起源と統合されません(revertの場合とは異なり)、実質的に独自のカスケードレイヤーを形成します。

8. レイヤーAPI

8.1. CSSImportRule インターフェースの拡張

CSSImportRuleインターフェースは以下のように拡張されます:

partial interface CSSImportRule {
  readonly attribute CSSOMString? layerName;
};

このlayerName属性は at規則で宣言されたレイヤー名を表し、 匿名レイヤーの場合は空文字列、レイヤーが宣言されていない場合はnullとなります。

8.2. CSSLayerBlockRule インターフェース

CSSLayerBlockRule インターフェースは @layerブロック規則を表します:

[Exposed=Window]
interface CSSLayerBlockRule : CSSGroupingRule {
  readonly attribute CSSOMString name;
};

このname属性は at規則自体で宣言されたレイヤー名を表し、 匿名レイヤーの場合は空文字列となります。

例えば、入れ子になったコンテキストはラップされたレイヤー規則から追加されません。
@layer outer {
  @layer foo.bar { }
}

この場合、内側の@layer規則のname は「foo.bar」(「outer.foo.bar」ではありません)となります。

8.3. CSSLayerStatementRule インターフェース

CSSLayerStatementRule インターフェースは @layer文規則を表します:

[Exposed=Window]
interface CSSLayerStatementRule : CSSRule {
  readonly attribute FrozenArray<CSSOMString> nameList;
};

このnameList属性は at規則で宣言されたレイヤー名のリストを表し、 CSSLayerBlockRulename 属性と同じルールで正規化されます。

9. 変更点

9.1. 2021年10月15日作業草案以降の変更点

2021年10月15日作業草案以降の重要な変更点:

9.2. 2021年8月29日作業草案以降の変更点

2021年8月29日作業草案以降の変更点:

9.3. 2021年6月8日作業草案以降の変更点

2021年6月8日作業草案以降の主な変更点:

9.4. 2021年3月19日作業草案以降の変更点

2021年3月19日作業草案以降の主な変更点:

9.5. 2021年1月19日作業草案以降の変更点

2021年1月19日初公開作業草案以降の主な変更点:

9.6. レベル4以降の追加点

レベル4以降の追加機能:

9.7. レベル3以降の追加点

レベル3以降の追加機能:

9.8. レベル2以降の追加点

レベル2以降の追加機能:

謝辞

David Baron、Tantek Çelik、Florian Rivoal、Simon Sapin、Jen Simmons、 Boris Zbarskyは本仕様に貢献しました。

プライバシーとセキュリティの考慮事項

適合性

文書の慣習

適合性要件は記述的な断定とRFC 2119用語の組み合わせで表現されています。規範部分で使われる「MUST」「MUST NOT」「REQUIRED」「SHALL」「SHALL NOT」「SHOULD」「SHOULD NOT」「RECOMMENDED」「MAY」「OPTIONAL」等のキーワードはRFC 2119に定義された通り解釈されますが、可読性のため本仕様ではすべて大文字で記述していません。

本仕様のすべてのテキストは、明示的に非規範とされたセクション、例、および注記を除き規範的です。[RFC2119]

本仕様の例は「for example」で始まるか、class="example"で規範テキストと区別されて提示されます:

これは情報例の一つです。

情報的な注記は「Note」で始まり、class="note"で規範テキストから区別されて提示されます:

注:これは情報的な注記です。

助言は規範的なセクションで特別な注意を促すようスタイリングされ、他の規範テキストと区別されて提示されます: UAはアクセシブルな代替手段を提供しなければならない。

適合クラス

本仕様への適合性は以下の3つの適合クラスで定義されます:

スタイルシート
CSSスタイルシート
レンダラー
UA - スタイルシートのセマンティクスを解釈し、それを使用する文書をレンダリングするもの。
オーサリングツール
UA - スタイルシートを作成するもの。

スタイルシートが本仕様に適合するためには、このモジュールで定義された構文を使うすべての文が、汎用CSS文法およびこのモジュールで定義された各機能ごとの個別文法に従って有効でなければなりません。

レンダラーが本仕様に適合するためには、スタイルシートを適切な仕様に従って解釈するだけでなく、本仕様で定義されたすべての機能を適切にパースし、文書をそれに応じてレンダリングすることが必要です。ただし、デバイスの制限により文書を正しくレンダリングできない場合でも、UAが非適合になるわけではありません(例:UAはモノクロモニターで色をレンダリングする必要はない)。

オーサリングツールが本仕様に適合するためには、汎用CSS文法およびこのモジュールで定義された各機能ごとの個別文法に従って構文的に正しいスタイルシートを書き、このモジュールで説明されているスタイルシートのその他の適合要件も満たす必要があります。

部分的な実装

著者が将来互換性のあるパース規則を利用してフォールバック値を割り当てられるように、CSSレンダラーは利用可能なレベルのサポートがないat規則、プロパティ、プロパティ値、キーワード、その他の構文要素を無効として(適切に無視)しなければなりません。特に、UAはサポートされないコンポーネント値のみを無視してサポートされる値のみを一つの複数値プロパティ宣言で適用することはしてはならない:いずれかの値が無効(サポートされない値は必ずそうなる)とみなされた場合、CSSは宣言全体を無視することを要求します。

不安定および独自機能の実装

将来の安定CSS機能との競合を避けるため、CSSWGは将来対応のベストプラクティスに従うことを推奨します。不安定な機能や独自拡張のCSS実装についても同様です。

非実験的な実装

仕様が候補勧告段階に達したら、非実験的な実装が可能となり、実装者は仕様通り正しく実装できたCRレベル機能については、プレフィックスなしの実装をリリースするべきです。

CSSの実装間の相互運用性を確立・維持するため、CSS作業グループは非実験的CSSレンダラーに対し、実装レポート(必要に応じてそのテストケースも)をW3Cに提出することを求めます。W3Cに提出されたテストケースはCSS作業グループによるレビューや修正の対象となります。

テストケースおよび実装レポートの提出方法等の詳細はCSS作業グループのウェブサイト https://www.w3.org/Style/CSS/Test/ を参照してください。質問は public-css-testsuite@w3.org メーリングリストまで。

CR終了基準

本仕様を提案勧告に進めるには、各機能について少なくとも2つの独立した相互運用可能な実装が必要です。各機能は異なる製品セットで実装されてもよく、すべての機能が一つの製品で実装される必要はありません。この基準のために、以下の用語を定義します:

独立
各実装は異なる当事者によって開発され、他の適格実装で使われているコードを共有・再利用・派生してはならない。仕様の実装に関係ないコード部分はこの要件の例外。
相互運用可能
公式CSSテストスイートの該当テストケース(またはWebブラウザでない場合は同等のテスト)をパスすること。該当UAで相互運用性を主張する場合は、すべての関連テストに同等テストを作成する必要がある。またその場合は、相互運用性のために他にも同様に同等テストをパスするUAが必要。その同等テストはピアレビューのため公開されなければならない。
実装
次の条件を満たすユーザーエージェント:
  1. 仕様を実装していること。
  2. 一般公開されていること。実装はリリース製品または公開バージョン(ベータ版、プレビューリリース、ナイトリービルド等)でよい。 リリース製品でなくても、少なくとも1か月間その機能を実装して安定性を示す必要がある。
  3. 実験的でないこと(テストスイートだけをパスすることを目的とし、今後通常利用を想定していないバージョンは不可)。

仕様は少なくとも6か月間、候補勧告のままとなります。

索引

本仕様で定義された用語

参照によって定義される用語

参考文献

規範的な参考文献

[CSS-2021]
Tab Atkins Jr.; Elika Etemad; Florian Rivoal. CSS Snapshot 2021. 2021年12月31日. NOTE. URL: https://www.w3.org/TR/css-2021/
[CSS-ANIMATIONS-1]
Dean Jackson; 他. CSS Animations Level 1. 2018年10月11日. WD. URL: https://www.w3.org/TR/css-animations-1/
[CSS-BACKGROUNDS-3]
Bert Bos; Elika Etemad; Brad Kemper. CSS Backgrounds and Borders Module Level 3. 2021年7月26日. CR. URL: https://www.w3.org/TR/css-backgrounds-3/
[CSS-BREAK-4]
Rossen Atanassov; Elika Etemad. CSS Fragmentation Module Level 4. 2018年12月18日. WD. URL: https://www.w3.org/TR/css-break-4/
[CSS-COLOR-4]
Tab Atkins Jr.; Chris Lilley; Lea Verou. CSS Color Module Level 4. 2021年12月15日. WD. URL: https://www.w3.org/TR/css-color-4/
[CSS-CONDITIONAL-3]
David Baron; Elika Etemad; Chris Lilley. CSS Conditional Rules Module Level 3. 2021年12月23日. CR. URL: https://www.w3.org/TR/css-conditional-3/
[CSS-CONDITIONAL-5]
David Baron; Elika Etemad; Chris Lilley. CSS Conditional Rules Module Level 5. 2021年12月21日. WD. URL: https://www.w3.org/TR/css-conditional-5/
[CSS-DISPLAY-3]
Tab Atkins Jr.; Elika Etemad. CSS Display Module Level 3. 2021年9月3日. CR. URL: https://www.w3.org/TR/css-display-3/
[CSS-FONTS-5]
Myles Maxfield; Chris Lilley. CSS Fonts Module Level 5. 2021年12月21日. WD. URL: https://www.w3.org/TR/css-fonts-5/
[CSS-PSEUDO-4]
Daniel Glazman; Elika Etemad; Alan Stearns. CSS Pseudo-Elements Module Level 4. 2020年12月31日. WD. URL: https://www.w3.org/TR/css-pseudo-4/
[CSS-SCOPING-1]
Tab Atkins Jr.; Elika Etemad. CSS Scoping Module Level 1. 2014年4月3日. WD. URL: https://www.w3.org/TR/css-scoping-1/
[CSS-SYNTAX-3]
Tab Atkins Jr.; Simon Sapin. CSS Syntax Module Level 3. 2021年12月24日. CR. URL: https://www.w3.org/TR/css-syntax-3/
[CSS-TRANSITIONS-1]
David Baron; 他. CSS Transitions. 2018年10月11日. WD. URL: https://www.w3.org/TR/css-transitions-1/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 3. 2019年6月6日. CR. URL: https://www.w3.org/TR/css-values-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 4. 2021年12月16日. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS-VARIABLES-1]
Tab Atkins Jr.. CSS Custom Properties for Cascading Variables Module Level 1. 2021年11月11日. CR. URL: https://www.w3.org/TR/css-variables-1/
[CSS-WRITING-MODES-3]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 3. 2019年12月10日. REC. URL: https://www.w3.org/TR/css-writing-modes-3/
[CSS2]
Bert Bos; 他. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. 2011年6月7日. REC. URL: https://www.w3.org/TR/CSS21/
[CSSOM]
Daniel Glazman; Emilio Cobos Álvarez. CSS Object Model (CSSOM). 2021年8月26日. WD. URL: https://www.w3.org/TR/cssom-1/
[DOM]
Anne van Kesteren. DOM Standard. リビングスタンダード. URL: https://dom.spec.whatwg.org/
[FETCH]
Anne van Kesteren. Fetch Standard. リビングスタンダード. URL: https://fetch.spec.whatwg.org/
[HTML]
Anne van Kesteren; 他. HTML Standard. リビングスタンダード. URL: https://html.spec.whatwg.org/multipage/
[MEDIAQ]
Florian Rivoal; Tab Atkins Jr.. Media Queries Level 4. 2021年12月25日. CR. URL: https://www.w3.org/TR/mediaqueries-4/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997年3月. ベストカレントプラクティス. URL: https://datatracker.ietf.org/doc/html/rfc2119
[SELECT]
Tantek Çelik; 他. Selectors Level 3. 2018年11月6日. REC. URL: https://www.w3.org/TR/selectors-3/
[SELECTORS-4]
Elika Etemad; Tab Atkins Jr.. Selectors Level 4. 2018年11月21日. WD. URL: https://www.w3.org/TR/selectors-4/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. リビングスタンダード. URL: https://webidl.spec.whatwg.org/

参考情報文献

[CSS-ALIGN-3]
Elika Etemad; Tab Atkins Jr.. CSS Box Alignment Module Level 3. 2021年12月24日. WD. URL: https://www.w3.org/TR/css-align-3/
[CSS-BREAK-3]
Rossen Atanassov; Elika Etemad. CSS Fragmentation Module Level 3. 2018年12月4日. CR. URL: https://www.w3.org/TR/css-break-3/
[CSS-CASCADE-4]
Elika Etemad; Tab Atkins Jr.. CSS Cascading and Inheritance Level 4. 2021年12月3日. WD. URL: https://www.w3.org/TR/css-cascade-4/
[CSS-CONTAIN-1]
Tab Atkins Jr.; Florian Rivoal. CSS Containment Module Level 1. 2020年12月22日. REC. URL: https://www.w3.org/TR/css-contain-1/
[CSS-FLEXBOX-1]
Tab Atkins Jr.; 他. CSS Flexible Box Layout Module Level 1. 2018年11月19日. CR. URL: https://www.w3.org/TR/css-flexbox-1/
[CSS-FONTS-4]
John Daggett; Myles Maxfield; Chris Lilley. CSS Fonts Module Level 4. 2021年12月21日. WD. URL: https://www.w3.org/TR/css-fonts-4/
[CSS-INLINE-3]
Dave Cramer; Elika Etemad; Steve Zilles. CSS Inline Layout Module Level 3. 2020年8月27日. WD. URL: https://www.w3.org/TR/css-inline-3/
[CSS-LISTS-3]
Elika Etemad; Tab Atkins Jr.. CSS Lists and Counters Module Level 3. 2020年11月17日. WD. URL: https://www.w3.org/TR/css-lists-3/
[CSS-PAGE-3]
Elika Etemad; Simon Sapin. CSS Paged Media Module Level 3. 2018年10月18日. WD. URL: https://www.w3.org/TR/css-page-3/
[CSS-SIZING-3]
Tab Atkins Jr.; Elika Etemad. CSS Box Sizing Module Level 3. 2021年12月17日. WD. URL: https://www.w3.org/TR/css-sizing-3/
[CSS-STYLE-ATTR]
Tantek Çelik; Elika Etemad. CSS Style Attributes. 2013年11月7日. REC. URL: https://www.w3.org/TR/css-style-attr/
[CSS-TEXT-3]
Elika Etemad; Koji Ishii; Florian Rivoal. CSS Text Module Level 3. 2021年4月22日. CR. URL: https://www.w3.org/TR/css-text-3/
[CSS-WRITING-MODES-4]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 4. 2019年7月30日. CR. URL: https://www.w3.org/TR/css-writing-modes-4/
[SVG11]
Erik Dahlström; 他. Scalable Vector Graphics (SVG) 1.1 (Second Edition). 2011年8月16日. REC. URL: https://www.w3.org/TR/SVG11/

プロパティ索引

名前 初期値 適用対象 継承 パーセンテージ アニメーションタイプ 正規順序 算出値
all initial | inherit | unset | revert | revert-layer 各プロパティ参照 各プロパティ参照 各プロパティ参照 各プロパティ参照 各プロパティ参照 文法ごと 各プロパティ参照

IDL索引

partial interface CSSImportRule {
  readonly attribute CSSOMString? layerName;
};

[Exposed=Window]
interface CSSLayerBlockRule : CSSGroupingRule {
  readonly attribute CSSOMString name;
};

[Exposed=Window]
interface CSSLayerStatementRule : CSSRule {
  readonly attribute FrozenArray<CSSOMString> nameList;
};

課題索引

link要素やstyle要素をカスケードレイヤーに割り当てる属性を提供するか? [Issue #w3c/csswg-drafts#5853]
著者がレイヤーなしのスタイルをレイヤー順に明示的に配置できるようにする [Issue #6323]