CSSコンテインメントモジュール レベル3

W3C作業草案

この文書の詳細情報
このバージョン:
https://www.w3.org/TR/2022/WD-css-contain-3-20220818/
最新公開バージョン:
https://www.w3.org/TR/css-contain-3/
編集者ドラフト:
https://drafts.csswg.org/css-contain-3/
以前のバージョン:
履歴:
https://www.w3.org/standards/history/css-contain-3
テストスイート:
https://test.csswg.org/harness/results/css-contain-1_dev/
フィードバック:
CSSWG イシューレポジトリ
仕様内に記載
編集者:
Tab Atkins (Google)
Florian Rivoal (Bloomberg代表)
Miriam E. Suzanne (招待専門家)
この仕様への編集提案:
GitHub エディター

概要

このCSSモジュールは、要素のサブツリーがページの他の部分から独立していることを示すcontainプロパティについて説明します。適切に使用することで、ユーザーエージェントによる大幅な最適化が可能となります。

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

この文書のステータス

このセクションは、公開時点での文書のステータスを説明します。 現在のW3C出版物一覧や、本技術報告書の最新版は https://www.w3.org/TR/ のW3C技術報告書インデックスで確認できます。

この文書は、CSSワーキンググループにより 作業草案として 勧告トラックを用いて公開されました。 作業草案として公開されたことは、W3Cおよびその会員による支持を意味するものではありません。

この文書はドラフトであり、 今後変更、置換、または廃止される可能性があります。 この文書を進行中の作業以外のものとして引用することは不適切です。

ご意見は、GitHubでissueを提出(推奨)することでお送りください。 タイトルに「css-contain」と記載し、例:「[css-contain] …コメント概要…」としてください。 すべてのissueやコメントはアーカイブされています。 または、(アーカイブ)公開メーリングリストwww-style@w3.orgへフィードバックを送ることもできます。

この文書は、2021年11月2日W3Cプロセス文書に準拠しています。

この文書は、W3C特許ポリシーの下で運営されているグループによって作成されました。 W3Cは、グループの成果物に関連してなされた公開特許開示リストを管理しています。 このページには特許開示の方法も記載されています。 個人が本質的なクレームを含む特許を知っている場合は、 W3C特許ポリシー第6節に従って情報開示する必要があります。

1. はじめに

これは CSS Containment Level 2との差分仕様です。 現時点では探索的作業草案(Exploratory Working Draft)です。 実装を行う場合は、Level 2を参照してください。 この草案がCRに到達した際に、Level 2の本文をこのドラフトに統合します。

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

この文書は、これまでの仕様には存在しなかった新機能を定義します。 また、安定した際には[CSS-CONTAIN-1]を置き換え、上位仕様とすることを目指しています。

1.2. 値の定義

この仕様は、CSS2のプロパティ定義規約と、CSS-VALUES-3の値定義構文に従っています。 本仕様で定義されていない値型はCSS Values & Units [CSS-VALUES-3]で定義されています。 他のCSSモジュールと組み合わせることで、これらの値型の定義が拡張される場合もあります。

各プロパティ定義に記載されている固有の値に加えて、 本仕様で定義されるすべてのプロパティは CSS全体キーワードも値として受け付けます。 読みやすさのため、ここでは明示的に繰り返し記載していません。

2. 強いコンテインメント:containプロパティ

CSS Containment 2 § 2 強いコンテインメント:containプロパティ

名前: contain
新しい値: layout || style || paint || [ size | inline-size ]
inline-size
この値は要素にインラインサイズ・コンテインメントを有効にします。 これにより、そのprincipal boxインラインサイズが直接内容によって決まることを防ぎます。

注:間接的な依存関係は依然として存在し得ます。 詳細は§ 3.1 インラインサイズ・コンテインメントを参照してください。

3. コンテインメントの種類

CSS Containment 2 § 3 コンテインメントの種類

3.1. インラインサイズ・コンテインメント

要素にインラインサイズ・コンテインメントを与えると、そのprincipal boxインライン軸サイズにサイズ・コンテインメントが適用されます。 つまり、インライン軸固有サイズは、内容がないものとして算出されます。 ただし、内容は通常通りボックスのブロック軸 固有サイズに影響を与え続け、 ボックスはブロック軸で通常通り分断されます。

注: 場合によっては、ボックスのブロック軸固有サイズが親の整形コンテキストのレイアウトに影響し、ボックスのインラインサイズに依存関係を生じることがあります(例:先祖要素でスクロールバーを発生させるなど)。 このように、ボックスのインラインサイズが自身の内容に依存するケースが生まれます。 もしこの変化したインラインサイズによって新たなブロックサイズが生じた場合、 その新しいブロックサイズがさらに親の整形コンテキストに影響を与えますが、 以前の問題となったレイアウトに戻ることはありません。

例えば、スクロールバーが表示された場合、 その後、結果的にブロックサイズが小さくなってスクロールバーが不要になっても、 スクロールバーは削除されません。 あるいは、ボックスの論理高さが下に配置されたフロートと衝突し、下方にクリアされてインライン方向に空きができて短くなり、 そのため衝突しなくなった場合でも、元の問題のある高さや位置に戻ることはありません。

このように、インラインサイズ・コンテインメントによって、 ボックスの内容がインラインサイズに直接影響を与えることは防がれますが、 インライン軸 固有サイズを通じて間接的に内容に依存することはあり得ます。 ボックスのインラインサイズが、ブロックサイズの影響で間接的に内容に依存し得ます。

一般的に、要素のインラインサイズと ブロックサイズの関係は予測困難かつ単調ではありません。 インラインサイズを変更するとブロックサイズが上下に任意に変化する可能性があります。 無限ループは、レイアウトが以前の(既知の問題のある)状態に戻らないようにすることで防止されます。 つまり、レイアウトは常に「前進」します。 現在のCSSレイアウト仕様にはこのようなルールが含まれていると考えていますが、 もし含まれていない場合は、CSSWGにご連絡ください。 そのような誤りは修正されます。

以下の例では、 float配置がブロックサイズとインラインサイズの依存関係を生み出しています:
<section style="width: 200px; border: solid; display: flow-root;">
  <div style="float: left; width: 50px; height: 80px; background: blue;"></div>
  <div style="float: right; width: 50px; height: 80px; background: blue;"></div>
  <div style="float: left; width: 160px; height: 80px; background: navy;"></div>

  <article style="border: solid orangered; display: flow-root; min-width: min-content">
    <div style="background: orange; aspect-ratio: 1/1;">
      Article
    </div>
  </article>
</section>
Article

ブロックレイアウトアルゴリズムはまず浮動ボックス(float)を配置します。 最初の2つはコンテナの左右の隅に収まり、 3つ目は間に収まらないため下方に押し出されます。

続いてarticleがレイアウトされます。 display: flow-rootであるため、 floatと交差せず、 サイズと位置決定の際にfloatを考慮する必要があります。

レイアウトエンジンはまずarticleをコンテナの上端に配置しようとします。 この時、幅は100pxとなり、 min-contentサイズには十分な広さです。 しかし、子要素のaspect-ratioのため、 articleの高さも100pxとなり、 80px下の3つ目のfloatと衝突するため、 このレイアウトは却下されます。

次に、articleを3つ目のfloatの上端に合わせて、右側の狭い40pxのスペースに配置しようとします。 しかし、articlemin-widthが 3つ目のfloatの横の40pxスペースに収まらないため、 さらに下にずれて、すべてのfloatの下に200pxの正方形となります。

Article

もしarticleからmin-widthが削除されるか、 articleまたはheaderinline-size containmentが追加されると (これによってmin-width: min-contentが0に解決される)、 articleは最終的にフロートされたdivの隣に40px四方として収まることになります (一部の内容がはみ出す可能性もあります)。

この時点で、articleの幅と高さ(40pxずつ)は、 最初に検討されたスペースに戻って収まるはずであり、 コンテナの上部にぴったりと配置されます。 しかし、ボックスは以前の位置に戻されません。 なぜなら、レイアウトエンジンはすでに この位置では無効なレイアウトになるとわかっているからです。

要素にinline-size containmentを与えても、以下のいずれかが当てはまる場合は効果がありません:

4. コンテナクエリ

メディアクエリは、ドキュメントが表示されているユーザーエージェントやデバイス環境の側面 (ビューポートの寸法やユーザーの設定など)を問い合わせる方法を提供しますが、 コンテナクエリは、ドキュメント内の要素の側面 (ボックス寸法や算出スタイルなど)をテストできます。

デフォルトでは、すべての要素はクエリコンテナとして コンテナスタイルクエリが可能です。 コンテナサイズクエリとして クエリコンテナを確立するには、 container-typeプロパティ (またはcontainerショートハンド)で追加のクエリタイプを指定します。 クエリコンテナshadow-including descendantsに適用されるスタイルルールは、 @container 条件グループ規則を用いて、 クエリコンテナに対して条件付けできます。

例えば、メインコンテンツ領域とサイドバーをコンテナとして定義し、 そのコンテナのサイズに応じて縦型から横型レイアウトに変化する.media-objectを記述できます:
main, aside {
  container: my-layout / inline-size;
}

.media-object {
  display: grid;
  grid-template: 'img' auto 'content' auto / 100%;
}

@container my-layout (inline-size > 45em) {
  .media-object {
    grid-template: 'img content' auto / auto 1fr;
  }
}

メインエリアやサイドバー領域のメディアオブジェクトは、それぞれ自身のコンテナコンテキストに応じて反応します。

疑似要素付きのセレクターの場合、クエリコンテナは shadow-including inclusive ancestorsultimate originating elementによって確立できます。

次のことが導かれます:
::beforeセレクターが起点要素のサイズをクエリする例:
<style>
  #container {
    width: 100px;
    container-type: inline-size;
  }
  @container (inline-size < 150px) {
    #inner::before {
      content: "BEFORE";
    }
  }
</style>
<div id=container>
  <span id=inner></span>
</div>
シャドウホストの子をスタイルするための::slotted()セレクターは シャドウツリー内のコンテナをクエリできます:
<div id=host style="width:200px">
  <template shadowroot=open>
    <style>
      #container {
        width: 100px;
        container-type: inline-size;
      }
      @container (inline-size < 150px) {
        ::slotted(span) {
          color: green;
        }
      }
    </style>
    <div id=container>
      <slot />
    </div>
  </template>
  <span id=slotted>Green</span>
</div>

4.1. クエリコンテナの作成:container-type プロパティ

名前: container-type
値: normal || [ size | inline-size ]
初期値: normal
適用対象: 全ての要素
継承: しない
パーセンテージ: 該当なし
算出値: キーワードnormal、またはsizeinline-sizeのいずれか一つ以上
正規順序: 文法に従う
アニメーション型: アニメーション不可

container-typeプロパティは、その要素を クエリコンテナとして確立します。 これはコンテナクエリコンテナサイズクエリなど明示的なコンテインメントが必要なもの)に利用され、 子孫のスタイルルールが、そのサイズやレイアウトの様々な側面を問い合わせて、 それに応じたスタイリングができます。

特に記載がない限り、 すべての要素はクエリコンテナです。 これはコンテナクエリコンテナスタイルクエリなど 明示的なコンテインメントを必要としないもの)に対して有効です。 container-typeの指定に関わらず有効です。

値の意味は以下の通りです:

size
クエリコンテナとして、 コンテナサイズクエリインライン軸ブロック軸両方)に対応します。 レイアウトコンテインメントスタイルコンテインメントサイズコンテインメントprincipal boxに適用します。
inline-size
クエリコンテナとして、 コンテナサイズクエリ(自身のインライン軸)に対応します。 レイアウトコンテインメントスタイルコンテインメントインラインサイズコンテインメントprincipal boxに適用します。
normal
この要素はクエリコンテナとして コンテナサイズクエリには対応しませんが、 コンテナスタイルクエリには引き続き対応します。
例えば、著者はコンテナに応じてタイポグラフィをレスポンシブに調整できます。 コンテナのサイズに基づいて、font-sizeline-heightなどのタイポグラフィ関連プロパティを調整できます:
aside, main {
  container-type: inline-size;
}

h2 { font-size: 1.2em; }

@container (width > 40em) {
  h2 { font-size: 1.5em; }
}

クエリ条件で使われている40emの値は、 該当算出値としての font-sizeに相対的です。 これは関連するクエリコンテナに対するものです。

コンテナはクエリ用に算出スタイル値も公開できます。 これは複数プロパティにまたがって挙動を切り替える際に便利です:
section {
  container-type: style;
}

@container (--cards: small) {
  article {
    border: thin solid silver;
    border-radius: 0.5em;
    padding: 1em;
  }
}

4.2. クエリコンテナの命名:container-name プロパティ

名前: container-name
値: none | <custom-ident>+
初期値: none
適用対象: 全ての要素
継承: しない
パーセンテージ: 該当なし
算出値: キーワードnone、または識別子の順序付きリスト
正規順序: 文法に従う
アニメーション型: アニメーション不可

container-nameプロパティは クエリコンテナ名のリストを指定します。 これらの名前は@container規則で 対象となるクエリコンテナのフィルタに利用できます。

none
クエリコンテナには クエリコンテナ名がありません。
<custom-ident>
クエリコンテナ名として識別子を指定します。 キーワードnoneandnotorはこの<custom-ident>には使用できません。
場合によっては、最も近い祖先以外の特定コンテナを問い合わせたいことがあります。 例えば、メインコンテンツ領域の高さや、よりネストされたインラインコンテナの幅を問い合わせたい場合などです。
main {
  container-type: size;
  container-name: my-page-layout;
}

.my-component {
  container-type: inline-size;
  container-name: my-component-library;
}

@container my-page-layout (block-size > 12em) {
  .card { margin-block: 2em; }
}

@container my-component-library (inline-size > 30em) {
  .card { margin-inline: 2em; }
}

4.3. 名前付きコンテナの作成:containerショートハンド

名前: container
値: <'container-name'> [ / <'container-type'> ]?
初期値: 個々のプロパティを参照
適用対象: 個々のプロパティを参照
継承: 個々のプロパティを参照
百分率: 個々のプロパティを参照
算出値: 個々のプロパティを参照
アニメーション型: 個々のプロパティを参照
正規順序: 文法通り

containerショートハンドプロパティは、 container-typecontainer-nameを同じ宣言で設定します。 <'container-type'>が省略された場合、 その値は初期値にリセットされます。

ショートハンド構文を使ってcontainer-typecontainer-nameの両方を定義できます:
main {
  container: my-layout / size;
}

.grid-item {
  container: my-component / inline-size;
}

4.4. コンテナクエリ:@container規則

@container規則は、 条件付きグループ規則であり、 その条件はcontainer query(コンテナクエリ)で、 container size querycontainer style queryのブール式の組み合わせです。 <stylesheet>ブロック内の宣言は、 その条件でフィルタリングされcontainer queryが要素のquery containerに対して真の場合のみ適用されます。

@container規則の構文は以下の通りです:

@container [ <container-name> ]? <container-condition> {
  <stylesheet>
}

各要素に対して、 クエリ対象となるquery containerは、 その要素の祖先のquery containerの中から、 <container-condition>で使われている container featureすべてに対して有効な query containerとして確立されているものの中から選ばれます。 オプションの<container-name>は、 query containerセットを query container nameが一致するものに絞り込みます。

有効なquery containerが選択されると、 <container-condition>内の各 container featureは そのquery containerに対して評価されます。 祖先に有効なquery containerがない場合、 その要素に対するcontainer queryunknownとなります。

メディアクエリと同様に、 複数の条件を1つのクエリリストで連結できます:
@container card (inline-size > 30em) and style(--responsive: true) {
  /* スタイル */
}

上記のスタイルは、「card」という名前の祖先コンテナが inline-size条件とstyle条件の両方を満たす場合のみ適用されます。

複数ネストされたcontainer query内の要素に対するスタイルルールは、 すべてのラップしているcontainer queryが その要素に対して真の場合のみ適用されます。

注: ネストされたcontainer queryは異なるコンテナに対して評価されることがあるため、 個々の<container-condition>を 一つのクエリに統合することは常に可能とは限りません。

一つのcontainer queryで 複数のコンテナをクエリすることはできませんが、 ネストすることでそれを実現できます:
@container card (inline-size > 30em) {
  @container style(--responsive: true) {
    /* スタイル */
  }
}

上記のスタイルは、「card」という名前の祖先コンテナが inline-size条件を、 さらに祖先コンテナがstyle条件を満たす場合のみ適用されます。

at-rule(@keyframesや@font-face、@layerなど)のようなグローバルで名前を定義する ルールがcontainer query内で定義された場合、 そのcontainer queryの条件には制約されません。

4.5. アニメーション付きコンテナ

container queryの評価が変化した場合は、 スタイル変更イベントの一部でなければならず、 その変化がアニメーション効果によって発生した場合も同様です。

隣接要素のトランジションがコンテナのサイズに間接的に影響し、 コンテナクエリの評価が変化した時に スタイル変更イベントをトリガーする例:
main {
  display: flex;
  width: 300px;
}

#container {
  container-type: inline-size;
  flex: 1;
}

/* 解決された幅は初期状態で200pxですが、#siblingのトランジション進行によって変化します。 */
#inner {
  transition: 1s background-color;
  background-color: tomato;
}

/* このコンテナクエリが適用開始(または終了)すると、#innerのbackground-colorのトランジションが開始する必要があります。 */
@container (width <= 150px) {
  #inner {
    background-color: skyblue;
  }
}

#sibling {
  width: 100px;
  transition: width 1s;
}

#sibling:hover {
  width: 200px;
}
<main>
  <div id=container>
    <div id=inner>Inner</div>
  </div>
  <div id=sibling>Sibling</div>
</main>

算出値container query length単位によって変化した場合も、 スタイル変更イベントの一部でなければなりません。

5. コンテナ機能

コンテナ機能は、 クエリコンテナの特定の側面を問い合わせます。

5.1. サイズコンテナ機能

コンテナサイズクエリは、 クエリコンテナprincipal boxのサイズを問い合わせることができます。 個々のサイズ機能 (<size-feature>) を組み合わせたブール式であり、 それぞれがクエリコンテナの特定の次元的特徴を問い合わせます。 <size-feature>の構文は メディア特徴と同様で、 機能名・比較演算子・値からなります。[mediaqueries-5] サイズ機能サイズクエリに論理結合する ブール構文・ロジックは CSS機能クエリと同じです。 (@supports参照。[CSS-CONDITIONAL-3]

クエリコンテナprincipal boxを持たない場合や、 principal boxがlayout containment boxでない場合、 またはクエリコンテナが該当軸のコンテナサイズクエリをサポートしない場合、 サイズ機能の評価結果は不明となります。

相対長単位 (container query length単位を含む)は コンテナクエリ条件内で 算出値を基準に クエリコンテナで評価されます。

注: これはメディアクエリ内の相対単位の扱いとは異なります。

例えば、クエリコンテナごとに 異なるfont-sizeを設定すると、emベースのクエリは各コンテナのfont-sizeに対して相対的に評価されます:
aside, main {
  container-type: inline-size;
}

aside { font-size: 16px; }
main { font-size: 24px; }

@container (width > 40em) {
  h2 { font-size: 1.5em; }
}

クエリ条件で使われる40emの値は、 該当する算出値font-sizeを基準に クエリコンテナごとに評価されます:

5.1.1. 幅:width機能

名前: width
対象: @container
値: <length>
型: 範囲

widthコンテナ機能は、 クエリコンテナcontent boxに対して問い合わせます。

5.1.2. 高さ:height機能

名前: height
対象: @container
値: <length>
型: 範囲

heightコンテナ機能は、 高さクエリコンテナcontent boxに対して問い合わせます。

5.1.3. インラインサイズ:inline-size機能

名前: inline-size
対象: @container
値: <length>
型: 範囲

inline-sizeコンテナ機能は、 サイズクエリコンテナcontent boxインライン軸で問い合わせます。

5.1.4. ブロックサイズ:block-size機能

名前: block-size
対象: @container
値: <length>
型: 範囲

block-sizeコンテナ機能は、 サイズクエリコンテナcontent boxブロック軸で問い合わせます。

5.1.5. アスペクト比:aspect-ratio機能

名前: aspect-ratio
対象: @container
値: <ratio>
型: 範囲

aspect-ratioコンテナ機能は、 widthコンテナ機能の値を heightコンテナ機能の値で割った比率として定義されます。

5.1.6. 向き:orientation機能

名前: orientation
対象: @container
値: portrait | landscape
型: 離散値
portrait
orientation コンテナ機能は、portraitであり、 height コンテナ機能の値が width コンテナ機能の値以上のときです。
landscape
それ以外の場合、orientationlandscapeです。

5.2. スタイルコンテナ機能

コンテナスタイルクエリは、 算出値クエリコンテナから問い合わせることができます。 これは、 個々のスタイル特徴 (<style-feature>) の論理結合であり、それぞれがクエリコンテナの単一かつ特定のプロパティを問い合わせます。 <style-feature>の構文は 宣言と同じであり、 指定したプロパティの算出値クエリコンテナ上で与えられた値と一致すれば真 (値も算出されクエリコンテナに対する)、 プロパティや値が無効・非対応の場合はunknown、 それ以外は偽となります。 スタイル特徴スタイルクエリに論理結合する構文・論理は CSS機能クエリと同じです。 (@supports参照。[CSS-CONDITIONAL-3]

スタイル特徴ショートハンドプロパティを問い合わせる場合、 算出値が すべてのロングハンドプロパティで一致すればtrue、 そうでなければfalseとなります。

カスケード依存キーワードrevertrevert-layerなど)は スタイル特徴の値としては無効であり、 その場合はコンテナスタイルクエリはfalseとなります。

注: 残りの非カスケード依存CSS全般キーワードは 他の値と同様にクエリコンテナに対する算出値として計算されます。

6. コンテナ相対長:cqwcqhcqicqbcqmincqmax単位

コンテナクエリ長単位は、 クエリコンテナの寸法に対して相対的な長さを指定します。 コンテナクエリ長単位を使用するスタイルシートは、 コンポーネントをあるクエリコンテナから他のコンテナへ容易に移動できます。

コンテナクエリ長単位は以下の通りです:

コンテナ単位の情報サマリー
単位 基準
cqw クエリコンテナの1%
cqh クエリコンテナ高さの1%
cqi クエリコンテナインラインサイズの1%
cqb クエリコンテナブロックサイズの1%
cqmin cqiまたはcqbの小さい方の値
cqmax cqiまたはcqbの大きい方の値

各要素について、コンテナクエリ長単位は 該当軸(または複数軸)に対するコンテナサイズクエリとして評価されます。 各軸に対するクエリコンテナは、 その軸でコンテナサイズクエリを受け入れる最も近い祖先コンテナです。 該当するクエリコンテナが存在しない場合は、 その軸の小さいビューポートサイズを使用します。

注: 同じ要素に対するcqicqb単位は異なるクエリコンテナに対し評価される場合があります。 同様に、cqmincqmax単位も、 それぞれの寸法が異なるクエリコンテナから算出される場合でも、 大きい方と小さい方の値となります。

子要素は、親で指定された相対値を継承せず、 算出値のみを継承します。

作者は、コンテナクエリ長単位に 適切なクエリコンテナがあるように、 同じcontainer-typeに依存するコンテナクエリ内で使用することができます。 カスタムのフォールバック値は、コンテナクエリ外で定義できます:
/* フォールバック値はcontainmentに依存しません */
h2 { font-size: 1.2em; }

@container (inline-size >= 0px) {
  /* inline-sizeコンテナが存在する場合のみ適用される */
  h2 { font-size: calc(1.2em + 1cqi); }
}

7. API

7.1. CSSContainerRule インターフェイス

CSSContainerRule インターフェイスは、@container規則を表します。

[Exposed=Window]
interface CSSContainerRule : CSSConditionRule {
};
conditionTextCSSOMString(CSSConditionRule上の属性のCSSContainerRule固有定義)
CSSConditionRule 親規則上で定義されている conditionText 属性は、取得時に指定された条件を論理的な簡略化を行わずに返さなければなりません。 これにより、返された条件は、本仕様のいかなる準拠実装(将来の拡張を含む本仕様の<general-enclosed>拡張メカニズムを実装するものも含む)でも 指定された条件と同じ結果が評価されます。 つまり、トークンストリームの簡略化(空白を1つにまとめたり、任意の場合に省略するなど)は許容されますが、 論理的な簡略化(不要な括弧の削除や結果に基づく簡略化など)は許容されません。

CSSContainerRule用のCSSOM APIの追加 [Issue #7033]

コンテナクエリには matchContainer メソッドが必要です。 これはmatchMedia()MediaQueryList インターフェイスをモデルにしますが、WindowではなくElementに適用されます。 レイアウトサイズの計測時、resizeObserverに類似しますが、追加のコンテナクエリ構文と機能を提供します。 [Issue #6205]

8. 要素内容の完全抑制:content-visibilityプロパティ

CSS Containment 2 § 4 要素内容の完全抑制:content-visibilityプロパティ

9. プライバシーとセキュリティに関する考慮事項

CSS Containment 2 § 5 プライバシーとセキュリティに関する考慮事項

付録A. 変更点

この付録は参考情報です。

2021年12月21日初公開作業草案以降の変更点

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

CSS Containment Level 2 からの変更点

CSS Containment 2 §  変更点

謝辞

この仕様への貢献者として Adam Argyle、 Amelia Bellamy-Royds、 Anders Hartvoll Ruud、 Brian Kardell、 Chris Coyier、 Christopher Kirk-Nielsen、 David Herron、 Elika J. Etemad (fantasai)、 Eric Portis、 Ethan Marcotte、 Geoff Graham、 Gregory Wild-Smith、 Ian Kilpatrick、 Jen Simmons、 Kenneth Rohde Christiansen、 L. David Baron、 Lea Verou、 Martin Auswöger、 Martine Dowden、 Mike Riethmuller、 Morten Stenshorne、 Nicole Sullivan、 Rune Lillesveen、 Scott Jehl、 Scott Kellum、 Stacy Kvernmo、 Theresa O’Connor、 Una Kravets、 他多数の方々のコメントと先行研究に感謝します。

適合性

文書の記法

適合性要件は、記述的な断言と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"で規範文から区別されます。例:

Note: これは参考ノートです。

勧告(Advisement)は規範セクションの中でも特に注意を促すスタイルとなっており、<strong class="advisement">で他の規範文と区別されます。例: UAは必ずアクセシブルな代替を提供しなければなりません。

適合クラス

本仕様への適合性は、3つの適合クラスについて定義されます:

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

スタイルシートが本仕様に適合するためには、このモジュールで定義された構文を用いたすべての文が、汎用CSS文法と本モジュール各機能の個別文法に従って有効である必要があります。

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

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

部分的実装

著者が将来互換のパース規則を利用してフォールバック値を指定できるように、CSSレンダラーは、利用可能なレベルのサポートがないat-rule、プロパティ、プロパティ値、キーワード、その他の構文を無効として(そして適切に無視)扱わなければなりません。特に、ユーザーエージェントは、未対応の値を選択的に無視して、複数値のプロパティ宣言のうち対応している値だけを適用してはなりません。どの値が無効とみなされた場合(未対応値は必ず無効となります)、CSSでは宣言全体が無視される必要があります。

不安定・独自機能の実装

将来の安定CSS機能との衝突を避けるため、CSSWGはベストプラクティスに従い、不安定な機能独自拡張の実装を推奨します。

非実験的実装

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

CSSの相互運用性を確立・維持するため、CSSワーキンググループは、非実験的CSSレンダラーがCSS機能のプリフィックスなしの実装をリリースする前に、実装報告(必要ならそのテストケースも)をW3Cに提出するよう要請します。W3Cに提出されたテストケースはCSSワーキンググループによるレビューと修正が入ることがあります。

テストケースや実装報告の提出方法については、CSSワーキンググループのウェブサイト(https://www.w3.org/Style/CSS/Test/)をご覧ください。質問はpublic-css-testsuite@w3.orgまで。

索引

本仕様で定義されている用語

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

参考文献

規範参照文献

[CSS-ANIMATIONS-1]
Dean Jackson 他. CSS Animations Level 1. 2018年10月11日. 作業草案. URL: https://www.w3.org/TR/css-animations-1/
[CSS-BOX-4]
Elika Etemad. CSS Box Model Module Level 4. 2020年4月21日. 作業草案. URL: https://www.w3.org/TR/css-box-4/
[CSS-BREAK-3]
Rossen Atanassov; Elika Etemad. CSS Fragmentation Module Level 3. 2018年12月4日. 勧告候補. URL: https://www.w3.org/TR/css-break-3/
[CSS-CASCADE-4]
CSS Cascading and Inheritance Level 4 URL: https://www.w3.org/TR/css-cascade-4/
[CSS-CASCADE-5]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS Cascading and Inheritance Level 5. 2022年1月13日. 勧告候補. URL: https://www.w3.org/TR/css-cascade-5/
[CSS-CONDITIONAL-3]
David Baron; Elika Etemad; Chris Lilley. CSS Conditional Rules Module Level 3. 2022年1月13日. 勧告候補. URL: https://www.w3.org/TR/css-conditional-3/
[CSS-CONTAIN-1]
Tab Atkins Jr.; Florian Rivoal. CSS Containment Module Level 1. 2020年12月22日. 勧告. URL: https://www.w3.org/TR/css-contain-1/
[CSS-CONTAIN-2]
CSS Containment Module Level 2 URL: https://drafts.csswg.org/css-contain-2/
[CSS-DISPLAY-3]
Tab Atkins Jr.; Elika Etemad. CSS Display Module Level 3. 2021年9月3日. 勧告候補. URL: https://www.w3.org/TR/css-display-3/
[CSS-FONTS-5]
Myles Maxfield; Chris Lilley. CSS Fonts Module Level 5. 2021年12月21日. 作業草案. URL: https://www.w3.org/TR/css-fonts-5/
[CSS-SIZING-3]
Tab Atkins Jr.; Elika Etemad. CSS Box Sizing Module Level 3. 2021年12月17日. 作業草案. URL: https://www.w3.org/TR/css-sizing-3/
[CSS-SYNTAX-3]
Tab Atkins Jr.; Simon Sapin. CSS Syntax Module Level 3. 2021年12月24日. 勧告候補. URL: https://www.w3.org/TR/css-syntax-3/
[CSS-TRANSITIONS-1]
David Baron 他. CSS Transitions. 2018年10月11日. 作業草案. 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日. 勧告候補. 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日. 作業草案. URL: https://www.w3.org/TR/css-values-4/
[CSS-WRITING-MODES-4]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 4. 2019年7月30日. 勧告候補. URL: https://www.w3.org/TR/css-writing-modes-4/
[CSS2]
Bert Bos 他. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. 2011年6月7日. 勧告. URL: https://www.w3.org/TR/CSS21/
[CSSOM-VIEW-1]
Simon Pieters. CSSOM View Module. 2016年3月17日. 作業草案. URL: https://www.w3.org/TR/cssom-view-1/
[DOM]
Anne van Kesteren. DOM Standard. リビングスタンダード. URL: https://dom.spec.whatwg.org/
[MEDIAQUERIES-5]
Dean Jackson 他. Media Queries Level 5. 2021年12月18日. 作業草案. URL: https://www.w3.org/TR/mediaqueries-5/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997年3月. ベストカレントプラクティス. URL: https://datatracker.ietf.org/doc/html/rfc2119
[SELECTORS-4]
Elika Etemad; Tab Atkins Jr.. Selectors Level 4. 2022年5月7日. 作業草案. URL: https://www.w3.org/TR/selectors-4/
[WEB-ANIMATIONS-1]
Brian Birtles 他. Web Animations. 2021年5月18日. 作業草案. URL: https://www.w3.org/TR/web-animations-1/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. リビングスタンダード. URL: https://webidl.spec.whatwg.org/

参考情報文献

[CSS-FONTS-4]
John Daggett; Myles Maxfield; Chris Lilley. CSS Fonts Module Level 4. 2021年12月21日. 作業草案. URL: https://www.w3.org/TR/css-fonts-4/
[CSS-PSEUDO-4]
Daniel Glazman; Elika Etemad; Alan Stearns. CSS Pseudo-Elements Module Level 4. 2020年12月31日. 作業草案. 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日. 作業草案. URL: https://www.w3.org/TR/css-scoping-1/
[CSS-SHADOW-PARTS-1]
Tab Atkins Jr.; Fergal Daly. CSS Shadow Parts. 2018年11月15日. 作業草案. URL: https://www.w3.org/TR/css-shadow-parts-1/
[CSS-SIZING-4]
Tab Atkins Jr.; Elika Etemad; Jen Simmons. CSS Box Sizing Module Level 4. 2021年5月20日. 作業草案. URL: https://www.w3.org/TR/css-sizing-4/
[FULLSCREEN]
Philip Jägenstedt. Fullscreen API Standard. リビングスタンダード. URL: https://fullscreen.spec.whatwg.org/

プロパティ索引

名前 初期値 適用対象 継承 百分率 アニメーション型 正規順序 算出値
container <'container-name'> [ / <'container-type'> ]? 個々のプロパティ参照 個々のプロパティ参照 個々のプロパティ参照 個々のプロパティ参照 個々のプロパティ参照 文法通り 個々のプロパティ参照
container-name none | <custom-ident>+ none すべての要素 no n/a アニメーション不可 文法通り キーワードnone、または識別子の順序付きリスト
container-type normal || [ size | inline-size ] normal すべての要素 no n/a アニメーション不可 文法通り キーワードnormal、またはsize, inline-sizeの一つ以上

@container ディスクリプタ

名前 初期値
aspect-ratio <ratio> 範囲
block-size <length> 範囲
height <length> 範囲
inline-size <length> 範囲
orientation portrait | landscape 離散値
width <length> 範囲

IDL索引

[Exposed=Window]
interface CSSContainerRule : CSSConditionRule {
};

課題索引

この仕様はCSS Containment Level 2に対する差分仕様です。 現在は試験的作業草案です。 実装を行う場合はLevel 2を参照してください。 このドラフトがCRに到達した段階でLevel 2の本文を統合します。
CSS Containment 2 § 2 強いコンテインメント: containプロパティ
CSS Containment 2 § 3 コンテインメントの種類
一般的に、要素のインラインサイズとブロックサイズの関係は予測不可能かつ非単調であり、 インラインサイズの変更によってブロックサイズが上下に自由に変動する可能性があります。 無限ループは、レイアウトが以前の(既知の問題となる)状態に戻らないことを保証することで防がれます。 制約の素朴な分析ではそれが可能であっても、つまりレイアウトは常に「前進」します。 現在のCSSレイアウト仕様にはこのようなルールが含まれていると考えていますが、 万一含まれていない場合は、CSSWGにお知らせいただき、誤りが修正されるようお願いします。
CSSContainerRule用のCSSOM APIを追加してください [Issue #7033]
コンテナクエリには matchContainer メソッドが必要です。 これはmatchMedia()MediaQueryList インターフェイスをモデルにしますが、WindowではなくElementに適用します。 レイアウトサイズの計測時には resizeObserver に類似しますが、追加のコンテナクエリ構文と機能を提供します。 [Issue #6205]
CSS Containment 2 § 4 要素内容の完全抑制: content-visibilityプロパティ
CSS Containment 2 § 5 プライバシーとセキュリティに関する考慮事項
CSS Containment 2 §  変更点