CSSボックスサイジングモジュール レベル4

W3C作業草案、

このバージョン:
https://www.w3.org/TR/2021/WD-css-sizing-4-20210520/
最新公開バージョン:
https://www.w3.org/TR/css-sizing-4/
Editor's Draft(編集中草案):
https://drafts.csswg.org/css-sizing-4/
以前のバージョン:
課題追跡:
CSSWG課題リポジトリ
CSSWG GitHub
仕様内インライン
編集者:
Tab Atkins (Google)
Elika J. Etemad / fantasai (招待専門家)
Jen Simmons (Apple)
この仕様への編集提案:
GitHubエディター

概要

このモジュールは、CSSのサイズ指定プロパティに、内容に基づく「内在的」サイズや、文脈に基づく「外在的」サイズを表すキーワードを追加し、CSSでコンテンツにフィットするボックスや特定のレイアウトコンテキストに収まるボックスをより簡単に記述できるようにします。本仕様はCSS Sizing Level 3に対する差分仕様です。

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

この文書のステータス

このセクションは、本書が公開された時点での文書のステータスを示します。 他の文書が本書に取って代わる場合があります。 現在のW3C出版物のリストや、この技術報告書の最新版は、 W3C技術報告書インデックス https://www.w3.org/TR/ に掲載されています。

この文書は CSSワーキンググループ により 作業草案 として公開されました。 作業草案としての公開は、W3Cメンバーによる承認を意味するものではありません。

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

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

この文書は、2020年9月15日版W3Cプロセス文書に従い管理されています。

この文書は、W3C特許ポリシーの下で活動するグループによって作成されました。 W3Cは、グループ成果物に関連してなされた公開特許開示リストを維持しています。 そのページには特許開示の手順も記載されています。 特許の存在を実際に知る個人は、その特許が必須クレームを含むと考える場合、W3C特許ポリシー第6節に従って情報を開示しなければなりません。

1. はじめに

これは CSS Sizing Level 3 との差分仕様です。 現在は探索的ワーキングドラフトです。 実装を行う場合は、Level 3 を参照してください。 この草案が CR に到達したら、Level 3 のテキストをこの草案に統合します。

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

このモジュールは width, height, min-width, min-height, max-width, max-height, および column-width の機能を [CSS2] 第10章および [CSS3COL] で定義された内容に拡張します。

1.2. 値の定義

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

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

2. 用語

CSS Sizing 3 §2 用語

3. ボックスサイズの指定

CSS Sizing 3 §3 ボックスサイズの指定

3.1. サイズ指定プロパティ

ショートハンドを追加すること。<https://github.com/w3c/csswg-drafts/issues/820>

3.2. 新しいサイズ指定値: stretch, fit-content, contain キーワード

名前: width, height, inline-size, block-size, min-width, min-height, min-inline-size, min-block-size, max-width, max-height, max-inline-size, max-block-size
新しい値: stretch | fit-content | contain
stretch
stretch-fit sizing を適用し、 ボックスの マージンボックス のサイズを 包含ブロック のサイズに合わせることを試みます。 詳細は § 6.1 ストレッチフィットサイズ: 包含ブロックを埋める を参照してください。
fit-content
実質的には fit-content(stretch)、すなわち min(max-content, max(min-content, stretch)) です。
contain
ボックスが 推奨アスペクト比 を持つ場合、 contain-fit sizing を適用し、 できる限り 推奨アスペクト比 を維持しながら ボックスの制約内に収めるようにします。 詳細は § 6.2 コンテインフィットサイズ: アスペクト比を保ちながら伸縮 を参照してください。

ボックスが 推奨アスペクト比 を持たない場合は、 stretch-fit sizing が適用されます。

4. アスペクト比

画像などは 自然なアスペクト比 を持つことが多く、 CSSのレイアウトアルゴリズムは 要素のサイズ変更時にもその比率を維持しようとします。

aspect-ratio プロパティにより、 非置換要素に対してこの挙動を指定することや、 置換要素の有効なアスペクト比を変更することができます。

このセクションの詳細はまだ作業中です。 もしここで定義されている挙動が、 置換要素推奨アスペクト比 を持つ場合に CSS2Flex Layout、 および Grid Layout の仕様(本仕様なしの場合)と 異なる動作になる場合は、それはエラーなので CSSWG へ報告 してください

4.1. 推奨アスペクト比: aspect-ratio プロパティ

名前: aspect-ratio
値: auto || <ratio>
初期値: auto
適用対象: すべての要素(ただし インラインボックス および内部rubyやテーブルボックスを除く)
継承: no
パーセンテージ: n/a
算出値: 指定キーワードまたは2つの数値のペア
正準順序: 文法による
アニメーション型: 算出値による

このプロパティはボックスの 推奨アスペクト比 を設定し、 auto サイズや他のレイアウト処理時に利用されます。

auto
置換要素自然なアスペクト比 を持つ場合はその比率を使用します。 それ以外の場合は、ボックスは 推奨アスペクト比 を持ちません。 アスペクト比を利用するサイズ計算は常に content box の寸法で行います。
<ratio>
ボックスの 推奨アスペクト比 は指定された width / height の比率です。 アスペクト比を利用するサイズ計算は、box-sizing で指定された寸法で行います。

<ratio>特異な比率 の場合、 このプロパティは auto として動作します。

auto && <ratio>
auto<ratio> の両方が指定された場合、 推奨アスペクト比は 指定された width / height の比率となりますが、 もし 置換要素 かつ 自然なアスペクト比 を持つ場合は、その比率が使われます。 いずれの場合も、アスペクト比を利用するサイズ計算は常に content box の寸法で行います。

<ratio>特異な比率 の場合、 このプロパティは auto として動作します。

注: 推奨アスペクト比 を持っていても、ボックスが 置換要素 になるわけではありません。 置換要素 に固有のレイアウトルールは、 非置換ボックスで推奨アスペクト比を持つ場合には、通常は適用されません。 たとえば、非置換絶対配置 ボックスは、 justify-self: normalstretch として扱い、 start とはしません(CSS Box Alignment 3 §6.1.2 絶対配置ボックスを参照)、 たとえ 推奨アスペクト比 を持っていても同様です。

CSS2.1は 置換要素とアスペクト比を持つ要素の区別が明確ではありません。 不明確な具体例を洗い出し、該当するLevel 3仕様またはここで定義する必要があります。

この例ではグリッド内の各アイテムを正方形で描画し、 利用可能なスペースに応じてアイテム数と幅を決定します。
<ul>
  <li><li><li><li></ul>
ul {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(12em, 1fr));
}
li {
  aspect-ratio: 1/1;
  overflow: auto;
}
この例では iframe 要素の width および height 属性を用いて aspect-ratio プロパティを設定し、 iframe にアスペクト比を付与して その比率の画像と同じ挙動になるようにします。
<iframe
  src="https://www.youtube.com/embed/0Gr1XSyxZy0"
  width=560
  height=315
  >
@supports (aspect-ratio: attr(width number) / 1) {
  iframe {
    aspect-ratio: attr(width number) / attr(height number);
    width: 100%;
    height: auto;
  }
}

置換要素の 自然な寸法自然な幅 または 自然な高さ のみである場合、 推奨アスペクト比 を与えることで、 存在しなかった側の 自然な 高さまたは幅も得られます。 これは既存のサイズを 推奨アスペクト比 を通じて変換することで実現されます。

4.2. 推奨アスペクト比が自動サイズに与える効果

ボックスが 推奨アスペクト比 を持つ場合、 その 自動サイズ置換要素自然なアスペクト比 を持ち、その軸に 自然なサイズ がない場合と同様に計算されます。 詳細は CSS2 § 10CSS Flexible Box Model Level 1 § 9.2 などを参照してください。 推奨サイズ の計算で このアスペクト比に依存する軸を 比率依存軸 と呼び、 入力サイズが 確定 していれば結果のサイズも 確定 します。 逆の軸(比率依存軸に依存するサイズを持つ軸)は 比率決定軸 と呼ばれます。

注: 推奨アスペクト比 は、ボックスのサイズの少なくとも一方が 自動 である場合のみ効果があります。 widthheight のいずれも 自動サイズ でなければ、 推奨サイズ には影響しません。

すべてのサイズ指定情報をここに移す場合、 2.1に無理やり割り込むより、コアの原則は単純になります。 すなわち、比率決定軸の解決後の 推奨サイズ(min/max適用前)が比率で転送されます。 min/max制約はその後に転送され、 その後はアスペクト比とは関係なく各軸ごとに個別に適用されます。

4.2.1. マージンの折りたたみ

マージンの折りたたみ(CSS 2 §8.3.1 マージンの折りたたみ)の目的では、 ブロック軸比率依存軸 である場合、 算出された block-sizeauto であるとは見なされません。

4.3. 自動コンテンツベースの最小サイズ

意図しないオーバーフローを防ぐために、 自動最小サイズは、比率依存軸において、 推奨アスペクト比を持ち、 置換要素でも スクロールコンテナでもないボックスの場合、 そのmin-contentサイズ最大サイズで上限を設けたものとなります。

次の例では、 ボックスはコンテナの幅いっぱい(通常通り)になり、 高さは内容を収めるのに必要な分だけ高くなりますが、 少なくとも幅と同じ高さになります。
div {
  aspect-ratio: 1/1;
  /* 'width' と 'height' の両方の初期値は 'auto' */
}
+----------+  +----------+  +----------+
| ~~~~~~~~ |  | ~~~~~~~~ |  | ~~~~~~~~ |
| ~~~~~~~~ |  | ~~~~~~~~ |  | ~~~~~~~~ |
| ~~~~~~~  |  | ~~~~~~~~ |  | ~~~~~~~~ |
|          |  | ~~~      |  | ~~~~~~~~ |
+----------+  +----------+  | ~~~~~~~~ |
                            | ~~~~~~   |
                            +----------+

overflow: auto を指定した場合は、 内容がはみ出してもボックスは1:1のアスペクト比を維持し (オーバーフローは通常通りスクロール可能として扱われます)。

div {
  overflow: auto;
  aspect-ratio: 1/1;
}
+----------+  +----------+  +----------+
| ~~~~~~~~ |  | ~~~~~~~~ |  | ~~~~~~~~^|
| ~~~~~~~~ |  | ~~~~~~~~ |  | ~~~~~~~~ |
| ~~~~~~~  |  | ~~~~~~~~ |  | ~~~~~~~~ |
|          |  | ~~~      |  | ~~~~~~~~v|
+----------+  +----------+  +----------+

min-height プロパティを上書きしても1:1アスペクト比は維持されますが、 その場合は内容がボックスからはみ出すことになります(他の方法で処理しない限り)。

div {
  aspect-ratio: 1/1;
  min-height: 0;
}
+----------+  +----------+  +----------+
| ~~~~~~~~ |  | ~~~~~~~~ |  | ~~~~~~~~ |
| ~~~~~~~~ |  | ~~~~~~~~ |  | ~~~~~~~~ |
| ~~~~~~~  |  | ~~~~~~~~ |  | ~~~~~~~~ |
|          |  | ~~~      |  | ~~~~~~~~ |
+----------+  +----------+  +-~~~~~~~~-+
                              ~~~~~~    
この自動最小サイズは両軸に作用します。 次の例を考えてみましょう:
<div style="height: 100px; aspect-ratio: 1/1;">
  <span style="display: inline-block; width: 50px;"></span>
  <span style="display: inline-block; width: 150px;"></span>
</div>

このコンテナのwidthautoなので、 アスペクト比により100pxに解決されます。 しかしmin-widthautoなので、 150pxに解決されます。 したがって、このコンテナの最終的な幅は150pxになります。 コンテナのサイズ決定時に内容を無視したい場合は、min-width: 0を指定できます。

4.4. 最小/最大サイズの伝播

どちらか一方の軸(origin軸)におけるサイズ制約は 推奨アスペクト比を通じて伝播され、 もう一方の軸(destination軸)の 未確定最小最大、あるいは推奨 サイズへ、次のように適用されます:

注: このように、確定サイズは伝播した制約によってまったく影響を受けず、 また伝播された最小値によって要素が確定した推奨/最大サイズを超えることはなく、 伝播された最大値によって要素が推奨/最小サイズを下回ることもありません。

注: 基本原則は、サイズ制約がアスペクト比を通して他方の軸に伝播し、 可能な限りアスペクト比を保持しつつ その軸で明示的に指定されたサイズを侵さない範囲で働く、ということです。 (これは、CSS2 セクション10.4の制約表の内容を導いた原則です。)

次の例では:
<div id=container style="height: 100px; float: left;">
  <div id=item style="height: 100%; aspect-ratio: 1/1;">content</div>
</div>

#itemの高さがパーセンテージで、かつコンテナが確定した高さを持つので、 アイテムの幅は内在サイズ寄与・最終レイアウトともに100pxとなり、 コンテナも幅100pxになります。

<div id=container style="height: auto; float: left;">
  <div id=item style="height: 100%; aspect-ratio: 1/1;">content</div>
</div>

この例ではアイテムのパーセンテージ高さが解決できず、autoとして扱われますCSS 2 §10.5 Content height: the 'height' property参照)。 この場合は両軸とも自動サイズとなり、 高さが比率依存軸となります。 ボックスの内在サイズ寄与を計算すると、 内容に基づく幅と、その幅とアスペクト比から計算された高さとなり、 “content”という単語の幅に合わせた正方形のボックス(およびコンテナ)となります。

このセクションは正しく書かれていないかもしれません。<https://github.com/w3c/csswg-drafts/issues/6071>

5. 内在サイズの決定

5.1. 内在サイズ

CSS Sizing 3 §5.1 内在サイズ

5.2. 内在サイズの上書き: contain-intrinsic-* プロパティ

名前: contain-intrinsic-width, contain-intrinsic-height, contain-intrinsic-block-size, contain-intrinsic-inline-size
値: none | <length> | auto && <length>
初期値: none
適用対象: サイズコンテインメントを持つ要素
継承: no
パーセンテージ: n/a
算出値: 指定通り。ただし<length> の値は算出される
正準順序: 文法順
アニメーション型: 算出値型による

これらのプロパティは、サイズコンテインメントを持つ要素が、 明示的な内在インナーサイズ を指定できるようにし、ボックスがフロー内コンテンツの合計幅・高さではなく、 指定された明示的な内在インナーサイズに合わせてサイズ決定される(空の場合のサイズ決定ではなく)ようにします。

注: これは常に 指定サイズの子要素を1つ持つかのようにレイアウトされるのと等価とは限りません。 例えば、指定サイズの子要素を1つ持つグリッドコンテナは、指定グリッドに従ってサイズ決定されるため、 通常は指定サイズより大きな内容サイズになります。

値の定義は以下の通りです:

none

該当軸には明示的な内在インナーサイズがありません。

<length>

該当軸は指定された明示的な内在インナーサイズを持ちます。 値は<length>です。

auto && <length>

該当軸は明示的な内在インナーサイズとして 最後に記憶されたサイズ を持ちます。 まだ最後に記憶されたサイズが存在しない場合は、 代わりに指定された<length>を使用します。

要素のある軸に明示的な内在インナーサイズがある場合、 サイズコンテインメントとして 通常通りレイアウトした後、その軸の内容サイズはレイアウトで計算されたものではなく 明示的な内在インナーサイズとして扱われ、 必要に応じて再レイアウトされます。 (両軸に明示的な内在インナーサイズがある場合は、 最初のレイアウトを省略できることを意味します。)

これら4つのプロパティは論理プロパティグループの一部です。

注: サイズコンテインメントを持つ要素は 内容が存在しないものとしてレイアウトされます[CSS-CONTAIN-1]。 そのため、多くの場合、要素は高さ0に折りたたまれてしまいます。 これは期待される内容を表示できるようにheight を明示的に指定することで修正できますが、 FlexやGridレイアウトのような一部のレイアウトシステムでは、 明示的なheightを コンテンツベースの高さよりも強い指示として扱うため、 結果として本来内容を詰めた場合と大きく異なるレイアウトになることがあります。 要素に明示的な内在インナーサイズを指定することで、 レイアウト時に内容を無視することで得られるパフォーマンス上の利点を保ちつつ、 内容がある場合と同じようにサイズ決定が可能になります。

名前: contain-intrinsic-size
値: [ none | <length> | auto && <length> ]{1,2}
初期値: 各プロパティ参照
適用対象: 各プロパティ参照
継承: 各プロパティ参照
パーセンテージ: 各プロパティ参照
算出値: 各プロパティ参照
アニメーション型: 各プロパティ参照
正準順序: 文法順

contain-intrinsic-sizecontain-intrinsic-widthおよび contain-intrinsic-height プロパティをまとめて設定するショートハンドプロパティです。

最初の値はcontain-intrinsic-widthを、 2番目の値はcontain-intrinsic-heightを表します。 値が1つだけ与えられた場合は両プロパティに同じ値が適用されます。

5.2.1. 最後に記憶されたサイズ

サイズコンテインメントは、ページの効率的なレンダリングを保証するために非常に重要であり、 要素の描画が変更された際に発生しうるレイアウト作業の範囲を制限します。 しかし、これは著者にとっても非常に制限的であり、 要素のサイズがどうなるかを正確に予測する必要があります。 この予測が少しでも間違っていると、 見苦しいスクロールバーや、意図せず内容が隠れてしまうことがあります。

contain-intrinsic-size: auto の値は、 中間的な解決策を提供します。 要素が一度でもサイズコンテインメントされていない状態になった場合、 この値はその時点でのサイズ(レイアウトで通常通り計算される)を記憶します。 その後、要素が サイズコンテインメント を持つようになった場合、 記憶されたサイズを使用し、サイズコンテインメントのパフォーマンス上の利点を享受しつつ おそらく内容に正確にフィットしたサイズにできます。

要素の最後に記憶されたサイズは次のように決定されます:

要素は、最後に記憶されたサイズを持たないことがあります。 それは、サイズコンテインメント無しで レンダリングされたことが一度もない場合です。 (この場合は auto に指定されたフォールバック値が使用されます。)

5.2.2. overflow: auto との相互作用

contain-intrinsic-size プロパティは、 著者が要素の内容がどれくらい大きくなると予想しているかの推定値を与えますが、 この推定値は実際の内容を表すものではなく、 ユーザーに表示する必要のある何かを意味するわけではありません。 したがって、overflow: auto を持つ要素は、 contain-intrinsic-size の結果として スクロールバーを生成してはなりません。

しかし、contain-intrinsic-size が 要素が実際にそのサイズの内容を持っていた場合に スクロールバーが必要になるほど十分に大きなサイズを示している場合は、 要素は仮想的な内容によってスクロールバーが生成されるかのように サイズ決定されなければなりません。

次のコード例では:
div {
  width: max-content;
  contain-intrinsic-size: 100px 100px;
  overflow: auto;
}

この要素は幅100px、高さ100pxになります。 contain-intrinsic-sizeがmax-content幅と高さを供給しています。

もしその後、要素の内容が150pxの高さになった場合、 垂直スクロールバーが表示されます。 スクロールバーがオーバーレイでない場合、 100pxの幅の一部がスクロールバーで使われ、 実際に内容が収まる領域は(通常84px程度)小さくなります。 (CSS Overflow 3 §3.2 スクロールバーとレイアウト参照)

この時、実際に利用可能な水平方向のスペースが100px未満になっても、 contain-intrinsic-size100pxの幅を示しているだけで 水平スクロールバーが生成されることはありません。 それは実際の内容が残りのスペースより広い何か壊せないものを含む場合だけです。

一方、次の例では:
div {
  width: max-content;
  contain-intrinsic-size: 100px 100px;
  height: 50px;
  overflow: auto;
}

この要素は固定された50pxの高さを持ちますが、 contain-intrinsic-size100pxの「想定内容高さ」を示します。 そのため、実際に内容が詰まった場合に 垂直スクロールバーが必要になると仮定し、 max-content幅は100pxよりやや広く(通常116px程度)なります。 これはcontain-intrinsic-sizeによる 100pxのmax-content幅と 垂直スクロールバー幅(通常16px程度)分を考慮するためです。

ただし、実際にスクロールバーが必要になると想定して幅を確保していても、 本当に内容が50px未満しかなければ スクロールバー自体は表示されませんが、 要素は116pxの幅になります。

5.3. 内在サイズ寄与

CSS Sizing 3 §5.2 内在寄与

5.4. min-contentサイズ寄与のゼロ化: min-intrinsic-sizing プロパティ

名前: min-intrinsic-sizing
値: legacy | zero-if-scroll || zero-if-extrinsic
初期値: legacy
適用対象: すべての要素(ただし インラインボックス を除く)
継承: no
パーセンテージ: n/a
算出値: 指定通り
正準順序: 文法順
アニメーション型: discrete

このプロパティの名称はさらなる議論が必要です。

このプロパティは、min-content寄与非置換ボックスにおいて 特定の条件下で「圧縮」されるかどうかを定義します。 各値の意味は次の通りです:

legacy
ボックスのmin-content寄与は通常通り扱われます。
zero-if-scroll
ボックスがスクロールコンテナである場合は min-content寄与が「圧縮」されます。
zero-if-extrinsic
ボックスが外在的推奨または 最大サイズを持つ場合、 min-content寄与が「圧縮」されます。

注: これは多くの置換要素のデフォルト動作です。

次のルールは、すべてのスクロールコンテナが サイズ寄与を親に渡す際に内容を基本的に無視させます (ただし明示的にコンテンツベースのサイズを要求していない限り):
*, ::before, ::after { min-intrinsic-size: zero-if-scroll; }

これにより、スクロールコンテナが大きなアイテム(例えばテーブルや改行不可の長いテキストなど)を含む場合に 親要素のサイズが膨張するのを防ぎます。 一方、スクロールコンテナでないボックスは依然として 祖先のmin-contentサイズに 影響を与えることができます。

注: zero-if-scroll の挙動がデフォルトであればより良かったのですが、Web互換性のため初期値にはできません :(

「圧縮された」min-content寄与は、 ボックスが空であるかのように計算されますが、明示的な min-contentmax-contentfit-content値の サイズ指定プロパティによるサイズ制約を考慮する場合は例外です。

6. 外在サイズの決定

CSS Sizing 3 §4 外在サイズの決定

6.1. ストレッチフィットサイズ: 包含ブロックを埋める

ストレッチフィットサイズは、min-height/min-width/max-height/max-widthによる制約を尊重しつつ、 ボックスの外側サイズが包含ブロックを できるだけ埋めるように、ボックスの使用サイズを必要な長さに設定しようとします。

厳密には、この挙動は自動サイズと 関連軸で自己整列プロパティstretch を 指定した場合と同じですが、結果として得られるボックスが整列コンテナに 完全には一致しない場合、その後実際の 自己整列プロパティ値で 整列されることができます。

さらに、 フォーマッティングコンテキストや、その軸で 自己整列プロパティが適用されない場合 (例えばブロックレイアウトのブロック軸やフレックスレイアウトの主軸など)で、 その軸のパーセンテージサイズが確定値に解決される場合には、 ストレッチフィットサイズはボックスが包含ブロックを埋めるようにします。 これは100%のように振る舞いますが、そのサイズは box-sizingで示されるボックスではなく マージンボックスに適用されます。 この目的のため、autoマージンはゼロとみなされます。 また、特にブロックレベルボックスにおいては、 ブロック始端/終端のマージンが、親のブロック始端/終端マージンに隣接しうる場合(親のサイズ指定プロパティが すべて初期値の場合)、 そのブロック始端/終端マージンはゼロとして扱われます。

注: その結果、stretch整列が適用されず、 またパーセンテージサイズも解決できない場合は、 ボックスは自動サイズに解決されます。

例えば、以下のHTMLで2つのブロックボックスがあるとします:
<div class="outer">
  <div class="inner"></div>
</div>

次の場合、内側ボックスの外側の高さは外側ボックスの高さ(200px)と完全に一致しますが、 内側の高さはマージン分20px小さくなります。

.outer { height: 200px; border: solid; }
.inner { height: stretch; margin: 10px; }

次の場合、内側ボックスの高さは外側ボックスの高さ(200px)と完全に一致します。 上側のマージンは折りたたまれますが、下側のマージンは折りたたまれません (ボックスの下側マージンが、非autoな高さの親の下側マージンに隣接していないためです。 詳細は CSS 2 §8.3.1 Collapsing margins を参照してください)、 したがって内側ボックスの下側マージンは切り捨てられます。

.outer { height: 200px; margin: 0; }
.inner { height: stretch; margin: 10px; }
同様に、width: stretch を指定すると、ボックスはコンテナいっぱいになり、 "some more text" の幅よりも20px狭くなります (10pxのマージンのため):
<div class="outer">
  <div class="inner">text</div>
</div>
some more text
.outer { float: left; margin: 0; }
.inner { width: stretch; margin: 10px; }
一方、次の例ではコンテナの高さが未確定なので、 子要素のパーセンテージ高さはautoとして扱われheight: stretchautoとして扱われます
.outer { height: auto; margin: 0; }
.inner { height: stretch; margin: 10px; }

6.2. コンテインフィットサイズ: アスペクト比を保ったまま伸縮

コンテインフィットサイズは本質的にストレッチフィットサイズを適用しますが、 ボックスの推奨アスペクト比を維持するために 一方の軸でサイズを縮小します。 これはcontainキーワードやobject-fitbackground-sizeプロパティに似ています。

まずターゲット矩形を決定します:

  1. 初期のターゲット矩形はボックスの包含ブロックのサイズです。 未確定なサイズは無限大とみなします。 両方の寸法が未確定な場合は、 初期ターゲット矩形はボックスがストレッチフィットサイズになった場合の外縁に一致します。
  2. 次に、ボックスが非nonemax-widthmax-heightを持つ場合、 その寸法でターゲット矩形をボックスのマージンボックスの「最大サイズ」以下に制限します。 (これは通常のbox-sizingルールと同じく、 この「最大サイズ」はボックスのmin-width/min-heightの効果で下限が設定されます。)
  3. 最後に、ターゲット矩形の一方の寸法を ボックスの推奨アスペクト比に 一致させるために必要最小限だけ縮小します。

各寸法でのコンテインフィットサイズは、 ターゲット矩形にストレッチフィットした場合に得られるサイズです。

マージン折りたたみに関してはストレッチフィットの挙動をコピーすること。

もし一方の寸法の最小サイズがアスペクト比を尊重した場合にターゲット矩形をオーバーフローさせる場合、アスペクト比を優先するか画像を歪めるか? 前者の場合は#2と同様に関連する最小値を適用するステップが必要。

6.3. パーセンテージサイズ

変更点

最近の変更

2020年10月20日 作業草案 以降の主な変更点:

2020年5月26日 初公開作業草案 以降の主な変更点:

Level 3からの追加点

謝辞

Aaron Gustafson氏、L. David Baron氏に本モジュールへの貢献を特に感謝します。

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

本仕様は新たなプライバシーまたはセキュリティ上の考慮事項を導入しません。

適合性

文書の表記規則

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

注:これは情報提供の注記です。

アドバイス文は特に注意を促すための規範部分であり、<strong class="advisement" で他の規範文から分離されます。例: UAはアクセシブルな代替手段を提供しなければなりません

適合クラス

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

style sheet
CSSスタイルシート
renderer
スタイルシートの意味を解釈し、それを使った文書をレンダリングするUA
authoring tool
スタイルシートを作成するUA

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

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

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

部分的な実装

著者が前方互換なパースルールを活用してフォールバック値を割り当てられるようにするため、 CSSレンダラーは、利用可能なサポートレベルがないat-rule、プロパティ、プロパティ値、キーワード、 その他の構文要素を無効(および適切に無視)として扱わなければなりません。特にUAは、 ひとつの複数値プロパティ宣言内で未サポート値のみを選択的に無視し サポートされている値だけを適用してはなりません:いずれかの値が無効(未サポート値はそうなる)とみなされた場合、 CSSは宣言全体の無視を要求します。

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

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

非実験的な実装

仕様が候補勧告(Candidate Recommendation)段階に達すると、非実験的な実装が可能になります。そして実装者は、仕様に準拠して正しく実装できることを示せるCRレベルの機能について、プリフィックスなしの実装を公開すべきです。

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

テストケースや実装報告書の提出方法についての詳細は、CSSワーキンググループのウェブサイト https://www.w3.org/Style/CSS/Test/ を参照してください。質問は public-css-testsuite@w3.org メーリングリストへどうぞ。

索引

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

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

参考文献

規範参照

[CSS-ALIGN-3]
Elika Etemad; Tab Atkins Jr.. CSS Box Alignment Module Level 3(CSSボックスアラインメントモジュール レベル3). 2020年4月21日. WD. URL: https://www.w3.org/TR/css-align-3/
[CSS-BACKGROUNDS-3]
Bert Bos; Elika Etemad; Brad Kemper. CSS Backgrounds and Borders Module Level 3(CSS背景および境界モジュール レベル3). 2020年12月22日. CR. URL: https://www.w3.org/TR/css-backgrounds-3/
[CSS-BOX-4]
Elika Etemad. CSS Box Model Module Level 4(CSSボックスモデルモジュール レベル4). 2020年4月21日. WD. URL: https://www.w3.org/TR/css-box-4/
[CSS-CASCADE-5]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS Cascading and Inheritance Level 5(CSSカスケーディングおよび継承 レベル5). 2021年3月19日. WD. URL: https://www.w3.org/TR/css-cascade-5/
[CSS-CONTAIN-1]
Tab Atkins Jr.; Florian Rivoal. CSS Containment Module Level 1(CSSコンテインメントモジュール レベル1). 2020年12月22日. REC. URL: https://www.w3.org/TR/css-contain-1/
[CSS-DISPLAY-3]
Tab Atkins Jr.; Elika Etemad. CSS Display Module Level 3(CSSディスプレイモジュール レベル3). 2020年12月18日. CR. URL: https://www.w3.org/TR/css-display-3/
[CSS-IMAGES-3]
Tab Atkins Jr.; Elika Etemad; Lea Verou. CSS Images Module Level 3(CSSイメージモジュール レベル3). 2020年12月17日. CR. URL: https://www.w3.org/TR/css-images-3/
[CSS-LOGICAL-1]
Rossen Atanassov; Elika Etemad. CSS Logical Properties and Values Level 1(CSS論理プロパティおよび値 レベル1). 2018年8月27日. WD. URL: https://www.w3.org/TR/css-logical-1/
[CSS-OVERFLOW-3]
David Baron; Elika Etemad; Florian Rivoal. CSS Overflow Module Level 3(CSSオーバーフローモジュール レベル3). 2020年6月3日. WD. URL: https://www.w3.org/TR/css-overflow-3/
[CSS-SIZING-3]
Tab Atkins Jr.; Elika Etemad. CSS Box Sizing Module Level 3(CSSボックスサイジングモジュール レベル3). 2021年3月17日. WD. URL: https://www.w3.org/TR/css-sizing-3/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 3(CSS値および単位モジュール レベル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(CSS値および単位モジュール レベル4). 2020年11月11日. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS-WRITING-MODES-4]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 4(CSSライティングモード レベル4). 2019年7月30日. CR. URL: https://www.w3.org/TR/css-writing-modes-4/
[CSS2]
Bert Bos; 他. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification(カスケーディングスタイルシート レベル2 改訂1(CSS 2.1)仕様). 2011年6月7日. REC. URL: https://www.w3.org/TR/CSS21/
[CSS3COL]
Håkon Wium Lie; Florian Rivoal; Rachel Andrew. CSS Multi-column Layout Module Level 1(CSSマルチカラムレイアウトモジュール レベル1). 2021年2月12日. WD. URL: https://www.w3.org/TR/css-multicol-1/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels(RFCで要件レベルを示すためのキーワード). 1997年3月. Best Current Practice. URL: https://tools.ietf.org/html/rfc2119

参考情報

[CSS-GRID-2]
Tab Atkins Jr.; Elika Etemad; Rossen Atanassov. CSS Grid Layout Module Level 2(CSSグリッドレイアウトモジュール レベル2). 2020年12月18日. CR. URL: https://www.w3.org/TR/css-grid-2/
[CSS-POSITION-3]
Elika Etemad; 他. CSS Positioned Layout Module Level 3(CSS配置レイアウトモジュール レベル3). 2020年5月19日. WD. URL: https://www.w3.org/TR/css-position-3/
[HTML]
Anne van Kesteren; 他. HTML Standard(HTML標準). Living Standard. URL: https://html.spec.whatwg.org/multipage/

プロパティ一覧

名前 初期値 適用対象 継承 パーセンテージ アニメーション型 正準順序 算出値
aspect-ratio auto || <ratio> auto インラインボックスおよび内部のruby/テーブルボックスを除くすべての要素 no n/a 算出値による 文法順 指定キーワードまたは2つの数値のペア
contain-intrinsic-block-size none | <length> | auto && <length> none サイズコンテインメントを持つ要素 no n/a 算出値型による 文法順 指定通り(<length>値は算出)
contain-intrinsic-height none | <length> | auto && <length> none サイズコンテインメントを持つ要素 no n/a 算出値型による 文法順 指定通り(<length>値は算出)
contain-intrinsic-inline-size none | <length> | auto && <length> none サイズコンテインメントを持つ要素 no n/a 算出値型による 文法順 指定通り(<length>値は算出)
contain-intrinsic-size [ none | <length> | auto && <length> ]{1,2} 各プロパティ参照 各プロパティ参照 各プロパティ参照 各プロパティ参照 各プロパティ参照 文法順 各プロパティ参照
contain-intrinsic-width none | <length> | auto && <length> none サイズコンテインメントを持つ要素 no n/a 算出値型による 文法順 指定通り(<length>値は算出)
min-intrinsic-sizing legacy | zero-if-scroll || zero-if-extrinsic legacy インラインボックスを除くすべての要素 no n/a discrete 文法順 指定通り

課題一覧

これはCSS Sizing Level 3 との差分仕様です。 現在は探索的ワーキングドラフトです。 実装を行う場合はLevel 3 を参照してください。 この草案がCRに到達したらLevel 3 のテキストをこの草案に統合します。
CSS Sizing 3 §2 用語
CSS Sizing 3 §3 ボックスサイズの指定
ショートハンドを追加すること。<https://github.com/w3c/csswg-drafts/issues/820>
このセクションの詳細はまだ作業中です。 もしここで定義されている挙動が、 置換要素推奨アスペクト比を持つ場合に CSS2Flex Layout、 および Grid Layout の仕様(本仕様なしの場合)と 異なる動作になる場合は、それはエラーなので CSSWG へ報告 してください
CSS2.1は 置換要素とアスペクト比を持つ要素の区別が明確ではありません。 不明確な具体例を洗い出し、該当するLevel 3仕様またはここで定義する必要があります。
すべてのサイズ指定情報をここに移す場合、 2.1に無理やり割り込むより、コアの原則は単純になります。 すなわち、比率決定軸の解決後の 推奨サイズ(min/max適用前)が比率で転送されます。 min/max制約はその後に転送され、 その後はアスペクト比とは関係なく各軸ごとに個別に適用されます。
このセクションは正しく書かれていないかもしれません。<https://github.com/w3c/csswg-drafts/issues/6071>
CSS Sizing 3 §5.1 内在サイズ
CSS Sizing 3 §5.2 内在寄与
このプロパティの名称はさらなる議論が必要です。
CSS Sizing 3 §4 外在サイズの決定
マージン折りたたみに関してはストレッチフィットの挙動をコピーすること。
もし一方の寸法の最小サイズがアスペクト比を尊重した場合にターゲット矩形をオーバーフローさせる場合、アスペクト比を優先するか画像を歪めるか? 前者の場合は#2と同様に関連する最小値を適用するステップが必要。