CSSボックスサイズ モジュール レベル 3

W3C作業草案,

この文書の詳細情報
このバージョン:
https://www.w3.org/TR/2021/WD-css-sizing-3-20211217/
最新公開バージョン:
https://www.w3.org/TR/css-sizing-3/
編集者草案:
https://drafts.csswg.org/css-sizing-3/
以前のバージョン:
履歴:
https://www.w3.org/standards/history/css-sizing-3
フィードバック:
CSSWG課題リポジトリ
CSSWG GitHub
仕様内でインライン
編集者:
Tab Atkins (Google)
Elika J. Etemad / fantasai (招待専門家)
この仕様への編集提案:
GitHub エディター

概要

このモジュールは、CSSのサイズ指定プロパティを、コンテンツに基づく「内在的」サイズと、文脈に基づく「外在的」サイズを表すキーワードで拡張し、CSSでコンテンツに合わせたり、特定のレイアウト文脈に合わせたりするボックスをより簡単に記述できるようにします。

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

この文書のステータス

このセクションは、公開時点での文書のステータスについて説明しています。 現在のW3C公開文書一覧や、この技術レポートの最新版は、W3C技術レポート一覧 https://www.w3.org/TR/で確認できます。

この文書は、CSS作業グループによって作業草案として、 勧告トラックを利用して公開されました。 作業草案としての公開は、W3Cおよびその会員による承認を意味しません。

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

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

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

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

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

「リスクあり」はW3Cプロセスでの専門用語であり、必ずしも機能が削除や遅延の危険があることを意味しません。 作業グループが、その機能の相互運用可能な実装がタイムリーに困難だと考えている場合にこう記載し、 提案勧告段階への移行時に、必要があれば機能を削除できるようにしています(機能を除外した新しい候補勧告を公開する必要がありません)。

1. はじめに

このセクションは規定的ではありません。

CSSのレイアウトには、様々なレイアウト計算で使用される自動サイズ指定の異なる概念がいくつかあります。 このセクションでは、この仕様のレイアウト動作を他のモジュールで使われる計算と結びつけるための、より厳密な用語の定義と、 width および height プロパティのための新しいキーワードをいくつか紹介します。 これにより、著者はこれらのサイズ計算の結果となる寸法を要素に割り当てることができます。

この仕様には図解が必要です!issue を参照してください。

1.1. モジュール間の関係

このモジュールは、widthheightmin-widthmin-heightmax-widthmax-height、および column-width の各機能を[CSS2]第10章及び[CSS3COL]で定義されたものに拡張します。

このモジュールで定義される box-sizing プロパティの定義は、[CSS-UI-3] の定義に優先します。

1.2. 値の定義

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

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

2. 用語集

座標軸や寸法に関する主要な用語はCSS Writing Modes 3 § 6 抽象ボックス用語で定義されています。

サイズ
一次元または二次元の測定値: ブロックサイズや、インラインサイズ、 または、widthheight
左から右、上から下の横書き英語では、横方向のwidthとinline sizeが同義で、縦方向のheightとblock sizeが同義です。 上から下、右から左の縦書き日本語では、横方向のwidthとblock sizeが同義で、縦方向のheightとinline sizeが同義です。
width または height が、 インラインサイズか、ブロックサイズかは、 書字モードによって異なります。
内側サイズ
content-boxサイズ
内側サイズ
外側サイズ
margin-boxサイズ
外側サイズ
確定サイズ
レイアウトを行わずに決定できるサイズ。 つまり、<length>、 テキストの測定値(改行を考慮しない)、 初期包含ブロックのサイズ、 または <percentage> やその他の式 (例えば非置換ブロックの「stretch-fit」サイズ指定[CSS2]) で、確定サイズだけを基準に解決されるもの。

さらに、絶対位置指定要素の包含ブロックのサイズは、当該要素に関して常に 確定です。

不確定サイズ
確定でないサイズ。不確定利用可能な空間は本質的に無限です。
利用可能な空間
ボックスがレイアウトされる空間を表すサイズであり、 そのボックスが参加するフォーマットコンテキストの規則によって決定されます。 ボックスの利用可能な空間は通常、 包含ブロックの測定値(それが確定している場合) か、無限サイズ(不確定な場合)です。利用可能な空間は、min-content制約max-content制約でもあり得ます。 これにより、そこにレイアウトされるボックスはその制約下でレイアウトされます。
stretch fit
指定されたサイズへのストレッチフィットは、 そのサイズから、ボックスの計算上のマージン(折り畳まない、autoはゼロとする)、 境界線、およびその寸法でのパディングを差し引いたものです (外側サイズがぴったり合うように)、 かつゼロで切り捨てます (内側サイズが負にならないように)。

注: これは、auto幅の非置換ブロックが通常フローで計算される際の CSS2.1§10.3.3で使われる式です。

フォールバックサイズ
一部のサイズ指定アルゴリズムは、無限サイズではうまく機能しません。 その場合は、代わりにフォールバックサイズが使用されます。 特に指定がない限り、 これは初期包含ブロックのサイズです。

2.1. 自動ボックスサイズ

CSSには、文脈に応じてautoのサイズ指定規則から導出される、4種類の自動的に決定されるサイズがあります:

ストレッチフィットサイズ
ストレッチフィットインラインサイズ
ストレッチフィットブロックサイズ
ボックスの外側サイズが指定した軸の利用可能な空間を満たす場合のサイズ。 つまり、利用可能な空間確定している場合、その空間へのストレッチフィット利用可能な空間不確定の場合は未定義。

注: インライン軸の場合、これはCSS2.1§10.3.5で「利用可能幅」と呼ばれ、CSS2.1§10.3.3の規則で計算されます。

注: このサイズを使う計算では、利用可能な空間不確定の場合のフォールバック動作を指定する必要があります。

max-contentサイズ
無限の利用可能な空間が与えられた時、ボックスがその軸で取る「理想的な」サイズ。 通常、その軸でボックスがコンテンツにぴったり収まる最小のサイズであり、 空きスペースを最小化し、オーバーフローを避ける形。
max-contentインラインサイズ

ボックスがインライン軸で取る「理想的な」サイズ。 通常、ボックス内のソフトラップ機会が一つも取られない場合に、コンテンツに収まる最も狭いインラインサイズ。 (§ 5 内在的サイズ決定参照。)

注: これはCSS2.1§10.3.5では「推奨幅」、CSS2.1§17.5.2.2では「最大セル幅」と呼ばれます。

max-contentブロックサイズ

ボックスがブロック軸で取る「理想的な」サイズ。 通常、レイアウト後のコンテンツのブロックサイズ

min-contentサイズ
名目上、ボックスが取れる最小のサイズで、より大きなサイズを選ぶことで回避できるオーバーフローが発生しないもの。 厳密には、ボックスがmin-content制約下でサイズ指定された場合のサイズ。 § 5 内在的サイズ決定参照。
min-contentインラインサイズ

min-contentサイズインライン軸での値。 通常、ボックス内のソフトラップ機会が全て取られた場合にコンテンツに収まるインラインサイズ

注: これはCSS2.1§10.3.5では「推奨最小幅」、CSS2.1§17.5.2.2では「最小コンテンツ幅」と呼ばれます。

min-contentブロックサイズ

min-contentサイズブロック軸での値。 ブロックコンテナ、テーブル、インラインボックスの場合、 これはmax-contentブロックサイズと同等です。

fit-contentサイズ
fit-contentインラインサイズ
fit-contentブロックサイズ
指定した軸の利用可能な空間確定している場合、 次の値と等しい: clamp(min-contentサイズ, ストレッチフィットサイズ, max-contentサイズ) (すなわち max(min-contentサイズ, min(max-contentサイズ, ストレッチフィットサイズ)))。 min-content制約下では min-contentサイズと同じ。 それ以外の場合は、その軸のmax-contentサイズと同じ。

注: これはCSS2.1§10.3.5CSS Multi-column Layout § 3.4で「縮小フィット幅」と呼ばれます。

内在的サイズ
max-contentサイズまたはmin-contentサイズ、 すなわち主にコンテンツのサイズから生じるサイズ。 (この用語の一部は、これら2つのサイズのどちらか主に由来するサイズを指す場合もあります。)

置換要素は、その内在的サイズ自然寸法から導くことが多いです。

2.2. 内在的サイズの寄与

max-content寄与
ボックスが自身の包含ブロックmax-contentサイズに寄与するサイズ。
min-content寄与
ボックスが自身の包含ブロックmin-contentサイズに寄与するサイズ。
内在的サイズ寄与
max-content寄与min-content寄与、または同様に計算されるコンテンツベースのサイズ寄与。

内在的サイズの寄与はボックスの外側サイズに基づきます。 この目的ではautoマージンはゼロとして扱います。

2.3. 内在的サイズ制約

max-content制約
ボックスの包含ブロックによって課され、ボックスがmax-content寄与を生成するようにするサイズ制約。
min-content制約
ボックスの包含ブロックによって課され、ボックスがmin-content寄与を生成するようにするサイズ制約。
推奨アスペクト比
ボックス固有のwidth:height比率で、各種サイズ指定アルゴリズムが可能な限り他のサイズ指定と矛盾しない範囲でこの比率を保とうとします。 特に指定がない限り、ボックスの推奨アスペクト比は、もしあれば自然アスペクト比であり、content boxに適用されます。 ほとんどのボックスは推奨アスペクト比を持ちません。

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

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

このセクションでは、サイズ指定プロパティであるwidthheightmin-widthmin-heightmax-width、および max-heightを定義します。 それらの値の候補は次のセクション§ 3.2 サイズ値: <length-percentage>, auto | none, min-content, max-content, fit-content()値で定義されています。

注: これらのプロパティには追加のフロー相対のエイリアスが[CSS-LOGICAL-1]で定義されています。

サイズ指定プロパティの各ペア(例:widthheight)の略記法を定義したいですが、@pagesize記述子([CSS-PAGE-3])との命名衝突があるため、Level 4に延期されています。 この問題の解決方法についての提案を歓迎します。議論参照。

3.1.1. 推奨サイズ指定プロパティ:widthおよびheightプロパティ

名前: width, height
値: auto | <length-percentage> | min-content | max-content | fit-content(<length-percentage>)
初期値: auto
適用対象: 全ての要素(ただし非置換インラインを除く)
継承: しない
パーセンテージ: 包含ブロックのwidth/heightに対して相対
算出値: 指定通り。ただし<length-percentage>値は計算後
正規順序: 構文に従う
アニメーション型: 算出値型ごとに、fit-content()を再帰的に評価

widthheight物理)プロパティは、 ボックスの推奨 widthおよびheightをそれぞれ指定します。

3.1.2. 最小サイズ指定プロパティ:min-widthおよびmin-height プロパティ

名前: min-width, min-height
値: auto | <length-percentage> | min-content | max-content | fit-content(<length-percentage>)
初期値: auto
適用対象: widthまたはheightを受け付けるすべての要素
継承: しない
パーセンテージ: 包含ブロックのwidth/heightに対して相対
算出値: 指定通り。ただし<length-percentage>値は計算後
正規順序: 構文に従う
アニメーション型: 算出値ごとに、fit-content()を再帰的に評価

min-widthおよびmin-heightプロパティは、 ボックスの最小幅(または“min width”)、 最小高さ(または“min height”)をそれぞれ指定します。

注: autoの初期値は新しく追加されたものです。 [CSS2]では初期値はゼロでした。

3.1.3. 最大サイズ指定プロパティ:max-widthおよびmax-height プロパティ

名前: max-width, max-height
値: none | <length-percentage> | min-content | max-content | fit-content(<length-percentage>)
初期値: none
適用対象: widthまたはheightを受け付けるすべての要素
継承: しない
パーセンテージ: 包含ブロックのwidth/heightに対して相対
算出値: 指定通り。ただし<length-percentage>値は計算後
正規順序: 構文に従う
アニメーション型: 算出値ごとに、fit-content()を再帰的に評価

max-widthおよびmax-heightプロパティは、 ボックスの最大幅(または“max width”)、 最大高さ(または“max height”)をそれぞれ指定します。

3.2. サイズ値:<length-percentage>auto | nonemin-contentmax-contentfit-content()

<length-percentage>
<length>および<percentage>でボックスのサイズを指定します。 box-sizingプロパティは、content boxborder boxかを指定します。

パーセンテージはボックスの包含ブロックのwidth/heightに対して解決されます。 もし特定の軸で包含ブロックのサイズがボックスのサイズに依存する場合、 パーセンテージの解決方法は該当するレイアウトモジュールを参照してください。

負の値は無効です。

auto
width/heightの場合、自動サイズ自動的なブロックサイズ/自動的なインラインサイズ)を指定します。 計算方法は該当するレイアウトモジュールを参照してください。

min-width/min-heightの場合、 自動的な最小サイズを指定します。 該当するレイアウトモジュールで特に定義されていなければ、 使用値は0になります。 互換性維持のため、 このキーワードの解決値はすべての[CSS2] display型(ブロック・インライン・インラインブロック・テーブルレイアウトボックス)でゼロになります。 ボックスが生成されない場合もゼロになります。

none
ボックスのサイズに制限なし。
min-content
該当軸のmin-contentサイズを使用。 ボックスのブロックサイズの場合、特に指定がなければ自動サイズと同じです。
max-content
該当軸のmax-contentサイズを使用。 ボックスのブロックサイズの場合、特に指定がなければ自動サイズと同じです。
fit-content(<length-percentage>)
fit-contentの計算式を使用し、 利用可能な空間を指定引数に置き換えます。 すなわち min(max-content, max(min-content, <length-percentage>))です。 <length-percentage>引数は、単独値の場合と同様に解決されます。

負の<length-percentage>値は無効です。

いずれの場合も、使用値は非負の内側サイズを保つようにゼロで切り捨てられます。

注: min-contentmax-contentfit-content()値はLevel 3で新しく追加されたものです。

注: flex-basisプロパティにもこれらの新しいキーワードが追加されます。 その値は<width>参照で定義されます。

注: このセクションでは以前、stretchおよびfit-contentをそれぞれストレッチフィットサイズおよびfit-contentサイズとしてキーワード定義していました。 これらのキーワードはLevel 4に延期されました (containキーワードも追加される予定で、 これはstretchと似た挙動ですが、 推奨アスペクト比(もしあれば)を保持します) 不確定な利用可能な空間がある場合の挙動の整理のためです。

3.2.1. autoとして振る舞う」

widthheightautoに算出される場合と、autoが指定されたかのように振る舞う場合(例:ブロックのパーセンテージheight不確定なサイズに対して解決される場合、CSS2§10.5参照)、 これら両方のケースで、そのプロパティはautoとして振る舞うと言います。

注: レガシー仕様の記述(特に[CSS2])では、width/heightの算出値がautoであることを条件として明示的に言及されることがあります。 これらの一部は「autoとして振る舞う」と解釈するべきケースであり、CSSWGに報告して仕様の更新を促してください。

このセクションは新しい用語自動サイズへの参照で置き換える必要があります。

3.2.2. フロートの包含または除外

このセクションは規定的ではありません。

ブロックボックスの境界は通常フロートを通しますが、 著者が自身の(子孫の)フロートを含めたり、外部のフロートを除外したい場合があります。 ブロックレイアウトでは、 display: flow-rootを指定すると、そのボックスはフォーマッティングコンテキストのrootとなり、この挙動を持ちます。

注: Flex、Grid、Tableレイアウトに参加するボックスは自動的にこの挙動を持ちます。

3.3. サイズ指定のボックス端:box-sizingプロパティ

名前: box-sizing
値: content-box | border-box
初期値: content-box
適用対象: widthまたはheightを受け付けるすべての要素
継承: しない
パーセンテージ: N/A
算出値: 指定キーワード
正規順序: 構文に従う
アニメーション型: 離散

box-sizingプロパティは、 固定サイズ(<length><percentage>)が content boxに割り当てられるか、border boxに割り当てられるかを定義します。 これは全てのサイズ指定プロパティflex-basisなども含む)に影響します。

値には以下の意味があります:

content-box
サイズ指定プロパティ<length-percentage>で指定されたサイズは、ボックスの内側サイズ(マージン・ボーダー・パディングは含めない)を表します。 つまりcontent boxに適用されます。 ボックスのパディングとボーダーは 指定したwidthheightの外側にレイアウト・描画されます。

注: これはCSS2.1で指定されたwidth/heightの挙動であり、デフォルトです。

border-box
サイズ指定プロパティ<length-percentage>で指定されたサイズは、 ボーダー・パディング(マージンは含まない)も含めた視覚的なサイズを表します。 これはborder boxに適用されます。 パディングとボーダーは 指定したwidthheightの内側にレイアウト・描画され、 content boxが残りのスペースを埋めるようにサイズ指定され、ゼロで切り捨てられます(負にならない)。

コンテンツ幅・高さは、各辺のボーダー・パディングの幅を指定された<length-percentage>から差し引いて計算されます。 コンテンツ幅・高さは負にならないため、この計算はゼロで切り捨てられます。

使用値(例:getComputedStyle()などで取得)はborder boxを参照します。

box-sizingの影響を受ける値には、 素の<length-percentage>値や、fit-content()などの関数的記法で使われる値が含まれます。 一方、 automin-contentなどの非量的な値は (特に指定されていなければ)box-sizingプロパティの影響を受けません。

例えば、以下のプロパティはボックスのcontent-boxサイズを100pxに設定し、border-boxサイズは120pxになります:
.box {
  box-sizing:   content-box; /* default */
  width:        100px;
  padding-left: 10px;
  border-left:  10px solid;
}

一方、border-boxに変更すると、border-boxが100pxになり、content-boxサイズは80pxになります:

.box {
  box-sizing:   border-box;
  width:        100px;
  padding-left: 10px;
  border-left:  10px solid;
}

内側サイズはゼロ未満になりません。 もしpaddingborderがborder-boxの指定サイズを超える場合、 ボックスは指定より大きくなります。 この場合、content-boxサイズは0pxで切り捨てられ、border-boxサイズは120pxになります。 たとえwidth: 100pxがborder boxに指定されていても:

.box {
  box-sizing:   border-box;
  width:        100px;
  padding-left: 60px;
  border-left:  60px solid;
  /* padding + border = 120px */
}
この例はbox-sizingを使って、固定サイズのボーダーを持つ2つのdivをdivコンテナ内で水平に均等分割するもので、追加のマークアップなしで実現できます。

サンプルCSS:

div.container {
  width:38em;
  border:1em solid black;
}

div.split {
  box-sizing:border-box;
  width:50%;
  border:1em silver ridge;
  float:left;
}

サンプルHTML断片:

<div class="container">
<div class="split">このdivは左半分を占有します。</div>
<div class="split">このdivは右半分を占有します。</div>
</div>

サンプルCSSとHTMLのデモ:

このdivは左半分を占有します。
このdivは右半分を占有します。
上記2つのdivは横並びで表示され、各div(ボーダー含む)はコンテナのコンテンツ幅の50%になります。もし縦に積み重なって表示される場合は、お使いのブラウザが box-sizingをサポートしていません。

注: 一部のHTML要素( buttonなど)は デフォルトでborder-boxの挙動になります。 どの要素がこの挙動かはHTML仕様を参照してください。

レガシーCSS仕様では、 widthheight最小(min)幅最小(min)高さ最大(max)幅、および最大(max)高さなどの用語は、特に指定がない限りボックスの内側サイズ (content-boxサイズ)を指します。

明確化が必要な場合は、CSS User Interface 3 § 3.1 Changing the Box Model: the box-sizing propertyや、 Visual formatting model details[CSS2])のセクションを参照してください。

曖昧さを避けるため、仕様書の著者はwidthやheightなどの用語を補足なしで曖昧に使うことを避け、 必要に応じて明確に参照・リンクしてください。 例えば内側サイズ外側サイズborder-boxのサイズ、 算出値サイズ指定プロパティなど、 各ケースに応じて明示的に参照してください。

3.4. 新しいカラム幅指定値:min-contentmax-contentfit-content()

名前: column-width
新しい値: min-content | max-content | fit-content(<length-percentage>)
算出値: 指定通り。ただし<length-percentage>値は計算後
アニメーション型: 算出値タイプごと

column-widthでこれらの新しいキーワードを使う場合、最適なカラム幅を指定します:

min-content
マルチカラムコンテナの内容のmin-contentインラインサイズとして最適なカラム幅を指定します。
max-content
マルチカラムコンテナの内容のmax-contentインラインサイズとして最適なカラム幅を指定します。
fit-content(<length-percentage>)
最適なカラム幅を min(max-content size, max(min-content size, <length-percentage>)) として指定します。

注: カラム幅はカラムごとに変わりません。 カラム幅がマルチカラムコンテナの内容によって決まる場合 (上記のキーワードのように)、 すべての内容が考慮され、計算された幅は全カラムで共通となります。

4. 外在的サイズ決定

外在的サイズ指定は、要素の内容を考慮せず、要素の文脈に基づいてサイズを決定します。

4.1. パーセンテージサイズ指定

パーセンテージは、ボックスの包含ブロックに対してボックスのサイズを指定します。

例:次のマークアップの場合:
<article style="height: 60em">
  <figure style="height: 50%;">
    <img style="height: 50%;">
  </figure>
</article>

包含ブロックのサイズが内容依存の場合のパーセンテージの解決方法詳細は§ 5.2.1 パーセンテージサイズボックスの内在的寄与を参照してください。

5. 内在的サイズ決定

内在的サイズ指定は、要素の文脈を考慮せず、要素の内容に基づいてサイズを決定します。

5.1. 内在的サイズ

ボックスの各軸におけるmin-contentサイズは、その軸で autoサイズ(かつその軸に最小最大サイズなし)が指定され、 さらに包含ブロックがその軸でゼロサイズの場合のfloatのサイズです。 (つまり「縮小フィット」時の最小サイズ。)

ボックスの各軸におけるmax-contentサイズは、その軸で autoサイズ(かつその軸に最小最大サイズなし)が指定され、 さらに包含ブロックがその軸で無限サイズの場合のfloatのサイズです。 (つまり「縮小フィット」時の最大サイズ。)

min-contentサイズmax-contentサイズは合わせて 内在的サイズと呼ばれます。

注: ボックスに推奨アスペクト比がある場合、反対側の寸法のサイズ制約が伝播し、 対象軸のautoサイズに影響する場合があります。 CSS2§10参照。

この仕様ではfloatのサイズ決定方法は定義しません。 [CSS2]を参照してください。 ただし、内在的サイズについて、 置換要素自然サイズを持たない場合は以下に定義します:

推奨アスペクト比がある場合:
min-contentサイズにはゼロを使用します。

max-contentサイズについて:

  • 利用可能な空間確定したインライン軸の場合、そのサイズへのストレッチフィットのインラインサイズを使い、アスペクト比でブロックサイズを計算します。

  • それ以外の場合 <length>算出値としてmin-widthまたはmin-heightに持つ場合、その値を使い、もう一方の寸法はアスペクト比で計算します。 両方の寸法に<length>の最小値がある場合は、全体サイズが大きくなる方を選びます。

    注: このケースは以前は300x150のデフォルトサイズから計算されていましたが、 現在はボックスのminサイズから計算します。 この挙動の方が望ましく、Web互換性も高いと考えますが、問題があればCSSWGまでご連絡ください。

  • それ以外の場合は、 インラインサイズ初期包含ブロックの対応寸法に合わせ、 もう一方はアスペクト比で計算します。

推奨アスペクト比がない場合:
min-contentサイズmax-contentサイズの両方について:
  • その寸法に<length>算出した最小サイズmin-width/min-height)に持つ場合は、その値を使います。

    注: この挙動は新しいauto値の追加によって、著者が制御できるようになりました。 この方が望ましいですが、Web互換性が不明なため、問題があればCSSWGまでご連絡ください。

  • それ以外の場合は、必要に応じて幅は300px、高さは150pxを使います。

heightwidthautoとして振る舞うブロックレベルまたはインラインレベルの置換要素は、 実質的にmax-contentサイズを使用する定義となっています(CSS2§10.3.2)。 この仕様では、heightwidthが両方ともautoとして振る舞う置換要素の未定義ケースにも上記の規則を適用します。

注: この仕様ではfloatのサイズ決定方法は定義しません。 [CSS2]や該当するCSS仕様、既存実装等を参照してください。 将来的な仕様で詳細定義され、CSS2の「定義」に置き換えられる予定です。


autoサイズのtext inputコントロール(HTMLの<input type=text><textarea>要素)は通常は固定サイズですが、 これらの要素の内容も、非置換ブロックコンテナと同様に内容ベースの内在的サイズの決定に利用できます。 min-contentmax-contentキーワードは、 サイズ指定プロパティで フォームコントロールの見える内容に基づくサイズを表し、 通常の非置換要素と同じように、値の内容にフィットするサイズ指定が可能です。

この場合の内容は、inputコントロールの値(textareaの場合はraw valueinputの場合はvalue) であり、より人間可読・ローカライズされた表示形式に変換される場合もあります。 このテキストはinputコントロールの子text runとして扱われ、ラップ可能箇所は、コントロールが実際にラップ可能な場所だけで許可されます。 (CSSプロパティやUA内部制約による) inputコントロールにプレースホルダテキストが指定されている場合は、 そのテキストも内容ベースサイズ計算の対象となり、表示されていなくても計算に含まれます。 (したがってinputコントロールの内容ベース内在的サイズは、 プレースホルダテキストと値の内容のうち大きい方のサイズとなります。)

UAはフォームコントロールのmin-contentmax-contentサイズについて、 キャレットを十分に表示できるスペースやタッチターゲットの最小使用サイズなど、最小値を強制しても構いません。

注: この仕様は iframe や他の内容を持つ置換要素にも拡張される可能性があります(議論参照)。 ただしtext inputが主な利用例であり、文書内部なので追加の複雑性も最小です。

5.2. 内在的寄与

ボックスの各軸におけるmin-content寄与/max-content寄与は、 仮想的なautoサイズのfloatが、そのボックスのみを含み、 その仮想floatの包含ブロックがゼロサイズ/無限サイズの場合のコンテンツボックスのサイズです。

注: この仕様ではこれらのサイズの厳密な決定方法は定義していません。 [CSS2]や該当するCSS仕様、パーセンテージ処理の規則(下記)、 既存実装などを参照してください。

5.2.1. パーセンテージサイズボックスの内在的寄与

パーセンテージサイズボックスの包含ブロックのサイズが、 ボックス自身の内在的サイズ寄与に依存する場合、 循環依存が生じます。 このようなボックスの内在的サイズ寄与を計算する際 (内容ベースの自動最小サイズの計算も含む)、 同じ軸のサイズを基準に解決されるパーセンテージ値 (循環パーセンテージサイズ)は特別に解決されます:

  1. ボックスが非置換の場合、 パーセンテージを含む式で指定されたmaxサイズプロパティ推奨サイズプロパティwidth/max-width/height/max-height) の値が10%calc(10px + 0%)など循環の場合、ボックスの内在的サイズ寄与の計算目的のみそのプロパティの初期値として扱います。 例えば、width: calc(20px + 50%)の場合、 max-content寄与はwidthautoとして計算されます。 (ただし実際のボックスサイズ指定時には、パーセンテージは通常通り評価されます。下記参照。)
  2. 同様に、ボックスが置換の場合も、 パーセンテージを含む式で指定されたmaxサイズプロパティ推奨サイズプロパティの値が循環の場合、ボックスのmax-content寄与の計算目的のみそのプロパティの初期値として扱います。
  3. ボックスが置換の場合、 循環パーセンテージmaxサイズプロパティ推奨サイズプロパティwidth/max-width/height/max-height) の値に含まれる場合、対応する軸のmin-content寄与の計算時にはゼロとして解決します。 (これがHTMLのどの要素に該当するかは§ 5.2.2 圧縮可能な置換要素参照。) さらにボックスに推奨アスペクト比がある場合、 このmin-content寄与は、 反対軸の<length-percentage> 最小サイズでゼロとして解決した値で床処理され、 推奨アスペクト比で伝播されます。

    伝播前にパーセンテージはゼロでなく包含ブロックで解決すべきか?議論参照。

    UAはUIの都合でmin-content寄与をさらに床処理しても構いません (例:selectのドロップダウン矢印が見えるようにするなど)。

    注: min-content寄与は常に、 自軸の最小サイズでも床処理されます。

    この規則は内容ベースの自動最小サイズや対応するサイズ寄与の計算にも適用され、 確定した「指定サイズの提案」を生みます。

    例: inputwidth: calc(50% + 50px)を指定した場合、 min-content寄与50px+左右のmargin/border/paddingとなります。
  4. minサイズプロパティmarginpaddinggutterも)については、 循環パーセンテージは 内在的サイズ寄与の決定時にゼロとして解決されます。
循環パーセンテージの内在的サイズ寄与規則(上記)のまとめ
要素タイプ 置換 非置換
寄与タイプ min-content max-content min-content max-content
minサイズmargin/padding zeroᵈ zeroᵈ zeroᵈ zeroᵈ
max推奨サイズ zeroᶜ initialᵇ initialᵃ initialᵃ

そして、特に指定がなければ、包含ブロックの内容の使用サイズや位置を計算する際:

注: これらの規則は、CSS2§10.2CSS2§8.3CSS2§8.4で未定義だった循環ケースの挙動を定めます。 またCSS2§10.5の挙動は、 各レイアウトモード(例:flexレイアウト) の仕様で上書きされています。

例:次のマークアップの場合:
<article style="width: min-content">
  <aside style="width: 50%;">
  LOOOOOOOOOOOOOOOOOOOONG
  </aside>
</article>

外側の<article>の幅を計算する際、 内側の<aside>width: autoとして振る舞うので、 <article>は長い単語の幅に合わせます。 <article>の幅は「本当の」レイアウトに依存していないため、<aside>の解決時には確定値として扱われ、<aside>の幅は<article>の幅の半分になります。

この例では、
<article style="height:auto">
  <aside style="height: 50%;">
    <div class=block style="height: 150px;"></div>
  </aside>
  <section style="height: 30px;"></section>
</article>

ブロックレベル要素のパーセンテージblock-size (ここではheight)は、内容サイズの包含ブロック内では解決されない定義なので、 <aside>のパーセンテージheightは無視され、autoと指定された時と同じ挙動になります。

min-heightが内在的の場合でも、パーセンテージが確定したheightで解決されるべきかは未決。CSS2では「高さが内容依存」という一般的記述があり、 技術的にはこれも該当しますが、CSS2にはmin-heightの内容依存キーワードはありませんでした。 新仕様なので違う挙動も可能と考えます。

以下の例は、ブロック軸のパーセンテージが内容依存の包含ブロックサイズでどう解決されるかを示します。

<article style="height:100px; min-height: min-content;">
  <aside style="height: 50%;">
    <div style="height: 150px;"></div>
  </aside>
  <section style="height: 30px;"></section>
</article>

初期の<article>の高さは指定の100pxであり、 <aside>はパーセンテージ解決時に50pxになります。 しかしmin-heightを計算するためにheightのかわりに代入します。 これにより<aside>のパーセンテージはautoとして振る舞うので、<aside>は150pxになります。 内容全体の高さは180pxとなります。 これは指定の100pxより大きいので、<article>は180pxに調整されます。

元々パーセンテージは100pxで解決できたので、今度は180pxで解決され、<aside>は90pxになります。

<article style="height:auto; min-height: min-content;">
  <aside style="height: 50%;">
    <div class=block style="height: 150px;"></div>
  </aside>
  <section style="height: 30px;"></section>
</article>

この場合、<aside>のパーセンテージは通常解決されません。 なぜなら包含ブロックの高さがauto(内容サイズ依存)だからです。 そのためautoとして振る舞うことになり、 <aside>は150px、<article>は初期で180pxの高さになります。 min-heightはこれを変えません。height: min-content;height: auto;と同様に振る舞い同じサイズとなります。

<article style="height:100px; min-height: min-content;">
  <aside style="height: 200%;">
    <div style="height: 150px;"></div>
  </aside>
  <section style="height: 30px;"></section>
</article>

これは最初のコード例のバリエーションで同様の流れを辿ります。 <aside>は初期計算では200px(100pxの包含ブロック高さの200%)を求めます。 min-heightの効果を計算すると、 パーセンテージはautoとして振る舞い、 150pxとなり、包含ブロックのmin-content高さは180pxになります。 これが100pxより大きいため、<article>は180pxに調整されます。 パーセンテージは新しい高さ(180px)で解決され、<aside>は360pxとなり、<article>をはみ出します。

5.2.2. 圧縮可能な置換要素

置換要素としてHTML§14.4 [HTML]に挙げられているものに加えて、以下のHTML要素も、上記パーセンテージサイズ置換要素規則の対象となり、 min-content寄与が圧縮される場合があります。 これは、width/heightmax-width/max-heightが循環パーセンテージで指定された場合に該当します:

max-width/heightへの適用のウェブ互換性・実装進捗はIssue 6348で追跡中。[Issue #6348]

変更点

最近の変更

2020年12月18日 作業草案以降の変更点:

2019年5月22日 作業草案以降の主な変更点:

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

2017年2月7日 作業草案以降の主な変更点:

CSS Level 2以降の追加点

自動・内容ベースのサイズ指定アルゴリズムの詳細強化に加え、[CSS2]以降、以下の新機能が追加されています:

謝辞

このモジュールへの貢献に感謝します: L. David Baron、 Aaron Gustafson、 Daniel Holbert、 Mats Palmgren

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

自動レイアウトをサポートするため、 CSSはボックスを内容にフィットするようサイズ指定します。 [DOM][CSSOM]などのAPIと併用することで、 スクリプトからボックスサイズ情報が取得でき、 内容に関する情報が露出する可能性があります。 ただし、この情報はボックスサイズ経由よりも、DOMから内容を直接調査する方が簡単で直接的です。 内容の調査ができないコンテナ (例:クロスオリジンiframeなど)は、 外部ページにサイズ情報を露出しません。 ただし置換要素(画像など)は、自然サイズやアスペクト比を露出する場合があります。

適合性

文書の慣例

適合性要件は記述的断定と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"で分離されます:

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

勧告(advisement)は注意を喚起するためにスタイルされ、<strong class="advisement">で規範テキストから分離されます。例: UAはアクセシビリティ代替を提供しなければならない。

適合クラス

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

スタイルシート
CSSスタイルシート
レンダラー
UAで、スタイルシートの意味を解釈し、それを使った文書をレンダリングするもの
オーサリングツール
UAで、スタイルシートを書き出すもの

スタイルシートは、本モジュールで定義された構文を使った記述が、汎用CSS構文と各機能の個別構文に従い有効であれば本仕様に適合します。

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

オーサリングツールは、汎用CSS構文と各機能の個別構文に従って正しい構文のスタイルシートを書き出し、本モジュールで記述された適合要件を満たせば適合となります。

部分的な実装

将来互換性のあるパース規則を活用してフォールバック値を割り当てられるように、CSSレンダラーは、サポートレベルが十分でないat規則、プロパティ、プロパティ値、キーワード、構文構造については無効扱い適切に無視)しなければなりません。特に、UAは、サポートされない値だけを選択的に無視し、サポートされる値だけを尊重することはしてはなりません。値が1つでも無効(サポートされない値は必ずそうなる)なら、CSSでは宣言全体を無視する必要があります。

不安定・独自機能の実装

将来の安定CSS機能との競合を避けるため、CSSWGは最良慣行に従い、不安定機能独自拡張の実装を推奨しています。

非実験的な実装

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

CSSの実装間の相互運用性を確立・維持するため、CSS作業グループは非実験的なCSSレンダラーが実装レポート(必要なら使用したテストケースも)を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. 2020年4月21日. WD. URL: https://www.w3.org/TR/css-align-3/
[CSS-BOX-4]
Elika Etemad. CSS Box Model Module Level 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. 2021年12月3日. WD. URL: https://www.w3.org/TR/css-cascade-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-FLEXBOX-1]
Tab Atkins Jr.; et al. CSS Flexible Box Layout Module Level 1. 2018年11月19日. CR. URL: https://www.w3.org/TR/css-flexbox-1/
[CSS-IMAGES-3]
Tab Atkins Jr.; Elika Etemad; Lea Verou. CSS Images Module Level 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. 2018年8月27日. WD. URL: https://www.w3.org/TR/css-logical-1/
[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-4]
Tab Atkins Jr.; Elika Etemad; Jen Simmons. CSS Box Sizing Module Level 4. 2021年5月20日. WD. URL: https://www.w3.org/TR/css-sizing-4/
[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-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年10月16日. WD. 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日. CR. URL: https://www.w3.org/TR/css-writing-modes-4/
[CSS2]
Bert Bos; et al. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. 2011年6月7日. REC. URL: https://www.w3.org/TR/CSS21/
[CSS3COL]
Florian Rivoal; Rachel Andrew. CSS Multi-column Layout Module Level 1. 2021年10月12日. CR. URL: https://www.w3.org/TR/css-multicol-1/
[CSSOM]
Daniel Glazman; Emilio Cobos Álvarez. CSS Object Model (CSSOM). 2021年8月26日. WD. URL: https://www.w3.org/TR/cssom-1/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119

参考情報文献

[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-GRID-2]
Tab Atkins Jr.; Elika Etemad; Rossen Atanassov. CSS Grid Layout Module Level 2. 2020年12月18日. CR. URL: https://www.w3.org/TR/css-grid-2/
[CSS-UI-3]
Tantek Çelik; Florian Rivoal. CSS Basic User Interface Module Level 3 (CSS3 UI). 2018年6月21日. REC. URL: https://www.w3.org/TR/css-ui-3/
[DOM]
Anne van Kesteren. DOM Standard. Living Standard. URL: https://dom.spec.whatwg.org/

プロパティ索引

名前 初期値 適用対象 継承 パーセンテージ アニメーション可能 アニメーション型 正規順序 算出値
box-sizing content-box | border-box content-box widthまたはheightを受け付ける全要素 しない N/A 離散 構文に従う 指定キーワード
height auto | <length-percentage> | min-content | max-content | fit-content(<length-percentage>) auto 非置換インライン以外の全要素 しない 包含ブロックのwidth/heightに対して相対 算出値型ごとにfit-content()を再帰的に評価 構文に従う 指定通り(<length-percentage>値は計算後)
max-height none | <length-percentage> | min-content | max-content | fit-content(<length-percentage>) none widthまたはheightを受け付ける全要素 しない 包含ブロックのwidth/heightに対して相対 算出値ごとにfit-content()を再帰的に評価 構文に従う 指定通り(<length-percentage>値は計算後)
max-width none | <length-percentage> | min-content | max-content | fit-content(<length-percentage>) none widthまたはheightを受け付ける全要素 しない 包含ブロックのwidth/heightに対して相対 算出値ごとにfit-content()を再帰的に評価 構文に従う 指定通り(<length-percentage>値は計算後)
min-height auto | <length-percentage> | min-content | max-content | fit-content(<length-percentage>) auto widthまたはheightを受け付ける全要素 しない 包含ブロックのwidth/heightに対して相対 算出値ごとにfit-content()を再帰的に評価 構文に従う 指定通り(<length-percentage>値は計算後)
min-width auto | <length-percentage> | min-content | max-content | fit-content(<length-percentage>) auto widthまたはheightを受け付ける全要素 しない 包含ブロックのwidth/heightに対して相対 算出値ごとにfit-content()を再帰的に評価 構文に従う 指定通り(<length-percentage>値は計算後)
width auto | <length-percentage> | min-content | max-content | fit-content(<length-percentage>) auto 非置換インライン以外の全要素 しない 包含ブロックのwidth/heightに対して相対 算出値型ごとにfit-content()を再帰的に評価 構文に従う 指定通り(<length-percentage>値は計算後)

課題索引

この仕様には図解が必要です!issue
サイズ指定プロパティの各ペア(例:widthheight)の略記法を定義したいですが、@pagesize記述子 [CSS-PAGE-3]との命名衝突があるため、Level 4に延期されています。 この問題の解決方法についての提案を歓迎します。議論参照。
このセクションは新しい用語自動サイズへの参照で置き換える必要があります。
伝播前にパーセンテージはゼロでなく包含ブロックで解決すべきか?議論参照。
min-heightが内在的の場合でも、パーセンテージが確定したheightで解決されるべきかは未決。 CSS2には「高さが内容依存」という一般的記述があり、技術的にはこれも該当しますが、CSS2にはmin-heightの内容依存キーワードはありませんでした。 新仕様なので違う挙動も可能と考えます。
max-width/heightへの適用のウェブ互換性・実装進捗はIssue 6348で追跡中。[Issue #6348]