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] のいずれかとして指定された場合、 そのすべての サブプロパティを そのキーワードに設定する。 これには、リセット専用サブプロパティも含まれる。 (これらのキーワードは、単一の宣言内で他の値と組み合わせることはできず、ショートハンド内であっても同様であることに注意。)

ショートハンド プロパティを !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] における シャドウ ツリーのネストされた ツリーコンテキストなどである。

異なる カプセル化コンテキストから得られた 2 つの宣言を比較する場合、 通常の規則では 外側のコンテキストからの宣言が優先され、 重要な規則では 内側のコンテキストからの宣言が優先される。 この目的のため、[DOM]ツリー コンテキストは、 シャドウを含むツリー順でネストされているとみなされる。

注: これは実質的に、通常の宣言で カプセル化コンテキストに属するものは、 外側のコンテキストによって容易に上書きできるデフォルトを設定できる一方、 重要な宣言で カプセル化コンテキストに属するものは、 外側のコンテキストでは上書きできない要件を強制できることを意味する。

要素付随スタイル
通常の宣言と 重要な宣言についてそれぞれ、 スタイル規則のセレクターによって間接的に対応付けられるのではなく、 要素に直接付随する宣言 (style 属性の内容など)は、 スタイル規則を介して対応付けられる同じ 重要度の宣言より 優先される。

[css-style-attr] を参照。

注: CSS 以外のプレゼンテーションヒント(プレゼンテーション用 マークアップなど)は 別個に処理される。 § 6.5 CSS 以外のプレゼンテーションヒントの優先順位を参照。

レイヤー
オリジンおよび コンテキスト 内の宣言は、明示的に カスケードレイヤーへ割り当てることができる。 このステップの目的上、 明示的なレイヤーに割り当てられていない宣言は、 暗黙の最終レイヤーに追加される。

カスケードレイヤーは(宣言と同様に)出現順に並べられる。 異なるレイヤーに属する宣言を比較する場合、 通常の規則では、 カスケードレイヤーが最後にある宣言が優先され、 重要な規則では、 カスケードレイヤーが最初にある宣言が優先される。

注: これは 通常および 重要オリジンを階層化する場合と同じ論理に従い、 !important フラグがどちらの設定でも同じ「上書き」の目的を維持するようにする。

詳細度
Selectors モジュール [SELECT]では、セレクターの詳細度を算出する方法を 説明している。 各宣言は、それが現れるスタイル規則と同じ詳細度を持つ。 最も高い詳細度を持つ宣言が優先される。
出現順
文書順で最後の宣言が優先される。 この目的のため:
  • スタイルシートは 最終 CSS スタイルシートにおける順序で並べられる。
  • インポートされたスタイルシートからの宣言は、そのスタイル シートが @import 規則の位置に置き換えられたかのように並べられる。
  • 元の文書から独立してリンクされたスタイルシートからの宣言は、 ホスト文書言語によって決定されるリンク順に 連結されたものとして扱われる。
  • style 属性からの宣言は、 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 属性や [HTML]s 要素などである。 文書言語に基づくすべてのスタイル指定は、対応する 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]