10 視覚的フォーマットモデルの詳細

内容

10.1 「包含ブロック」の定義

要素のボックスの位置とサイズは、時々、特定の矩形に対して計算されます。この矩形はその要素の包含ブロックと呼ばれます。要素の包含ブロックは以下のように定義されます:

  1. ルート要素が存在する包含ブロックは、初期包含ブロックと呼ばれる矩形です。連続メディアの場合、それはビューポートの寸法を持ち、キャンバスの原点に固定されています。ページ化されたメディアの場合、それはページエリアとなります。初期包含ブロックの『direction』プロパティはルート要素と同じです。
  2. その他の要素の場合、要素の位置が『relative』または『static』である場合、包含ブロックは最も近い祖先ボックスの内容エッジによって形成され、それがブロックコンテナであるか、フォーマットコンテキストを確立するものでなければなりません。
  3. 要素が『position: fixed』の場合、包含ブロックは連続メディアの場合はビューポート、ページ化されたメディアの場合はページエリアによって確立されます。
  4. 要素が『position: absolute』の場合、包含ブロックは以下のように、『absolute』、『relative』または『fixed』の『position』を持つ最も近い祖先によって確立されます:
    1. 祖先がインライン要素である場合、包含ブロックは、その要素のために生成された最初のインラインボックスと最後のインラインボックスのパディングボックスを囲む境界ボックスです。CSS 2.2では、インライン要素が複数行に分割されている場合、包含ブロックは未定義です。
    2. それ以外の場合、包含ブロックは祖先のパディングエッジによって形成されます。

    そのような祖先が存在しない場合、包含ブロックは初期包含ブロックです。

ページ化されたメディアでは、絶対配置された要素は、ページ区切りを無視してその包含ブロックに対して位置を決定します(文書が連続しているかのように)。その後、その要素は複数のページにわたって分割される場合があります。

現在のページ以外のページに位置が解決される、または印刷にすでにレンダリングされた現在のページ上の位置に解決される絶対配置されたコンテンツについては、プリンターはコンテンツを以下のように配置する場合があります:

注意: 複数のページに分割されたブロックレベル要素は、各ページで異なる幅を持つ場合があり、デバイス固有の制限が存在する場合があります。

例:

以下の文書で位置指定がない場合、包含ブロック(C.B.)は次のように確立されます:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<HTML>
   <HEAD>
      <TITLE>包含ブロックの説明</TITLE>
   </HEAD>
   <BODY id="body">
      <DIV id="div1">
      <P id="p1">これは最初の段落のテキストです...</P>
      <P id="p2">これは<EM id="em1">2番目の<STRONG id="strong1">段落</STRONG>内</EM>のテキストです。</P>
      </DIV>
   </BODY>
</HTML>

次のように確立されます:

ボックスが生成される対象 C.B.が確立される対象
html 初期C.B.(UA依存)
body html
div1 body
p1 div1
p2 div1
em1 p2
strong1 p2

「div1」を位置指定すると:

   #div1 { position: absolute; left: 50px; top: 50px }

その包含ブロックはもう「body」ではなくなり、初期包含ブロックになります(他の位置指定された祖先ボックスが存在しないため)。

「em1」も位置指定すると:

   #div1 { position: absolute; left: 50px; top: 50px }
   #em1  { position: absolute; left: 100px; top: 100px }

包含ブロックの表は次のようになります:

ボックスが生成される対象 C.B.が確立される対象
html 初期C.B.(UA依存)
body html
div1 初期C.B.
p1 div1
p2 div1
em1 div1
strong1 em1

「em1」を位置指定することにより、その包含ブロックは最も近い位置指定された祖先ボックス(つまり、「div1」によって生成されたもの)になります。

10.2 コンテンツ幅: 『width』プロパティ

名前: width
値: <length> | <percentage> | auto | inherit
初期値: auto
適用対象: すべての要素。ただし、置換されないインライン要素、テーブル行、および行グループを除く
継承: no
パーセンテージ: 包含ブロックの幅を基準とする
メディア: ビジュアル
計算値: パーセンテージまたは『auto』は指定された通り、または絶対的な長さ

このプロパティはボックスのコンテンツ幅を指定します。

このプロパティは置換されないインライン要素には適用されません。 置換されないインライン要素のボックスのコンテンツ幅は、内部のレンダリングされたコンテンツの幅(子要素の相対オフセット)に基づきます。 インラインボックスは行ボックスに流れ込みます。 行ボックスの幅はその包含ブロックによって決まりますが、 フロートの存在によって短縮される場合があります。

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

<length>
長さ単位を使用してコンテンツ領域の幅を指定します。
<percentage>
パーセンテージ幅を指定します。このパーセンテージは、生成されたボックスの包含ブロックの幅に基づいて計算されます。 包含ブロックの幅がこの要素の幅に依存している場合、CSS 2.2では結果のレイアウトは未定義です。 注意: 包含ブロックがブロックコンテナ要素に基づいている絶対配置された要素の場合、パーセンテージはその要素のパディングボックスの幅に基づいて計算されます。 これはCSS1からの変更であり、CSS1ではパーセンテージ幅は常に親要素のコンテンツボックスの幅に基づいて計算されていました。
auto
幅は他のプロパティの値に依存します。 以下のセクションを参照してください。

『width』に負の値を指定することは禁止されています。

例:

例えば、以下のルールは段落のコンテンツ幅を100ピクセルに固定します:

p { width: 100px }

10.3 幅とマージンの計算

レイアウトに使用される要素の『width』『margin-left』『margin-right』『left』および『right』プロパティの値は、 生成されるボックスのタイプやそれぞれのプロパティ同士に依存します。(レイアウトに使用される値は時々使用値と呼ばれます。) 原則として、使用される値は計算値と同じで、必要に応じて『auto』が適切な値に置き換えられ、 パーセンテージが包含ブロックに基づいて計算されますが、例外があります。以下の状況を区別する必要があります:

  1. インライン、置換されない要素
  2. インライン、置換された要素
  3. ブロックレベル、置換されない要素(通常フロー内)
  4. ブロックレベル、置換された要素(通常フロー内)
  5. フロート、置換されない要素
  6. フロート、置換された要素
  7. 絶対配置、置換されない要素
  8. 絶対配置、置換された要素
  9. 『インラインブロック』、置換されない要素(通常フロー内)
  10. 『インラインブロック』、置換された要素(通常フロー内)

ポイント1-6および9-10の場合、相対配置された要素の『left』および『right』の値は、9.4.3節のルールによって決定されます。

注意。 以下で計算される『width』の使用値は暫定値であり、 『min-width』および『max-width』によって複数回計算される必要がある場合があります。 以下の最小幅と最大幅のセクションを参照してください。

10.3.1 インライン、置換されない要素

『width』プロパティは適用されません。 『margin-left』 または『margin-right』 の計算値が『auto』の場合、使用値は『0』になります。

10.3.2 インライン、置換された要素

『margin-left』 または『margin-right』 の計算値が『auto』の場合、使用値は『0』になります。

『height』および 『width』 の計算値が両方とも『auto』で、要素に固有の幅がある場合、その固有の幅が 『width』 の使用値になります。

『height』および 『width』 の計算値が両方とも『auto』で、要素に固有の幅がなく、固有の高さと固有の比率を持つ場合、または 『width』 の計算値が『auto』で、 『height』 の計算値が他の値で、要素が固有の比率を持つ場合、 『width』 の使用値は以下のように計算されます:

(使用する高さ) * (固有の比率)

『height』および 『width』 の計算値が両方とも『auto』で、要素が固有の比率を持ち、固有の高さまたは幅を持たない場合、 CSS 2.2では『width』の使用値は未定義です。ただし、包含ブロックの幅が置換要素の幅に依存しない場合、 『width』の使用値は通常フロー内のブロックレベル、置換されない要素の制約方程式を使用して計算されることが推奨されます。

それ以外の場合、 『width』 の計算値が『auto』で、要素に固有の幅がある場合、その固有の幅が 『width』 の使用値になります。

それ以外の場合、 『width』 の計算値が『auto』で、上記の条件に該当しない場合、 『width』 の使用値は300pxになります。300pxがデバイスに収まらない場合、ユーザーエージェントはデバイスに収まる2:1比率を持つ最大の矩形幅を使用するべきです。

10.3.3 ブロックレベル、置換されない要素(通常フロー内)

以下の制約は、他のプロパティの使用値間で成立する必要があります:

『margin-left』 + 『border-left-width』 + 『padding-left』 + 『width』 + 『padding-right』 + 『border-right-width』 + 『margin-right』 = 包含ブロックの幅

『width』が『auto』でなく、さらに 『border-left-width』 + 『padding-left』 + 『width』 + 『padding-right』 + 『border-right-width』 (および『margin-left』または『margin-right』が『auto』でない場合の値)が包含ブロックの幅を超える場合、 『margin-left』または『margin-right』の『auto』値は以下のルールに従い『0』として扱われます。

上記のすべてが『auto』以外の計算値を持つ場合、これらの値は「過剰制約」とされ、 いずれかの使用値が計算値と異なる必要があります。 包含ブロックの『direction』 プロパティが『ltr』の場合、『margin-right』の指定値が無視され、等式が成立するように値が計算されます。 『direction』プロパティが『rtl』の場合、この処理は『margin-left』に発生します。

値がちょうど1つ『auto』と指定されている場合、その使用値は等式に従います。

『width』 が『auto』に設定されている場合、その他の『auto』値は『0』になり、 『width』 は結果の等式に従います。

『margin-left』 および『margin-right』 が両方『auto』である場合、それらの使用値は等しくなります。 これにより、要素は包含ブロックのエッジに対して水平に中央揃えされます。

10.3.4 ブロックレベル、置換された要素(通常フロー内)

『width』 の使用値は、 インライン置換要素と同じ方法で決定されます。 次に、置換されないブロックレベル要素のルールを適用してマージンを決定します。

10.3.5 浮動、置換されない要素

『margin-left』または『margin-right』の計算値が『auto』の場合、その使用値は『0』になります。

『width』 の計算値が『auto』の場合、その使用値は「収縮適合幅 (shrink-to-fit width)」になります。

収縮適合幅の計算は、自動テーブルレイアウトアルゴリズムを使用してテーブルセルの幅を計算する方法に似ています。 大まかに言えば、明示的な改行が発生する場所を除き、行を分割せずにコンテンツをフォーマットして希望する幅を計算し、 次に可能なすべての改行を試して希望する最小幅を計算します。 CSS 2.2では正確なアルゴリズムは定義されていません。 第三に、利用可能な幅を計算します。この場合、これは包含ブロックの幅から 『margin-left』、『border-left-width』、『padding-left』、『padding-right』、 『border-right-width』、『margin-right』の使用値および関連するスクロールバーの幅を引いた値になります。

その後、収縮適合幅は次のように計算されます: min(max(希望する最小幅, 利用可能な幅), 希望する幅)。

10.3.6 浮動、置換された要素

『margin-left』または『margin-right』の計算値が『auto』の場合、その使用値は『0』になります。 『width』 の使用値はインライン置換要素と同様に決定されます。

10.3.7 絶対配置、置換されない要素

このセクションおよび次のセクションの目的のために、用語「静的位置 (static position)」 (要素の)とは、概ね要素が通常フロー内にあった場合の位置を指します。より正確には:

ただし、実際にその仮想ボックスの寸法を計算するのではなく、ユーザーエージェントはそのおおよその位置を推測する自由があります。

静的位置を計算する目的では、固定配置された要素の包含ブロックはビューポートではなく初期包含ブロックと見なされ、 すべてのスクロール可能なボックスは原点にスクロールされていると仮定されるべきです。

これらの要素の使用値を決定する制約は次の通りです:

'left' + 'margin-left' + 'border-left-width' + 'padding-left' + 'width' + 'padding-right' + 'border-right-width' + 'margin-right' + 'right' = 包含ブロックの幅

'left'、『width』、および『right』の3つすべてが『auto』の場合: 最初に『margin-left』および『margin-right』の『auto』値を0に設定します。 次に、静的位置包含ブロックを確立する要素の『direction』プロパティが『ltr』の場合、 『left』を静的位置に設定し、以下のルール番号3を適用します。 それ以外の場合、『right』を静的位置に設定し、ルール番号1を適用します。

3つのいずれも『auto』でない場合: 『margin-left』および『margin-right』の両方が『auto』の場合、 2つのマージンが等しい値になるという追加の制約の下で方程式を解きます。 ただし、これによってマージンが負になる場合、包含ブロックの『direction』が『ltr』の場合は『margin-left』、 『rtl』の場合は『margin-right』を0に設定し、残りの値を解きます。 『margin-left』または『margin-right』のいずれかが『auto』の場合、その値を解きます。 値が過剰制約されている場合、『direction』が『rtl』の場合は『left』の値を無視し、 『ltr』の場合は『right』の値を無視して解きます。

それ以外の場合、『margin-left』および『margin-right』の『auto』値を0に設定し、次の6つのルールの1つを適用します。

  1. 『left』および『width』が『auto』で『right』が『auto』でない場合、幅は収縮適合幅になります。その後、『left』を解きます。
  2. 『left』および『right』が『auto』で『width』が『auto』でない場合、静的位置包含ブロックを確立する要素の『direction』プロパティが『ltr』の場合、 『left』を静的位置に設定します。それ以外の場合、『right』を静的位置に設定します。 次に、『direction』が『rtl』の場合は『left』を解き、『ltr』の場合は『right』を解きます。
  3. 『width』および『right』が『auto』で、『left』が『auto』でない場合、幅は収縮適合幅になります。その後、『right』を解きます。
  4. 『left』が『auto』で、『width』および『right』が『auto』でない場合、『left』を解きます。
  5. 『width』が『auto』で、『left』および『right』が『auto』でない場合、『width』を解きます。
  6. 『right』が『auto』で、『left』および『width』が『auto』でない場合、『right』を解きます。

収縮適合幅の計算は、自動テーブルレイアウトアルゴリズムを使用してテーブルセルの幅を計算する方法に似ています。 大まかに言えば、明示的な改行が発生する場所を除いて行を分割せずにコンテンツをフォーマットして希望する幅を計算し、 次に可能なすべての改行を試して希望する最小幅を計算します。 CSS 2.2では正確なアルゴリズムは定義されていません。 第三に、利用可能な幅を計算します。これは、ケース1では『left』を0に、ケース3では『right』を0に設定して『width』を解くことで求められます。

その後、収縮適合幅は次のように計算されます: min(max(希望する最小幅, 利用可能な幅), 希望する幅)。

10.3.8 絶対配置、置換された要素

この場合、10.3.7節が制約方程式を含む部分まで適用されますが、それ以外の部分は以下のルールに置き換えられます:

  1. 『width』 の使用値はインライン置換要素と同様に決定されます。 『margin-left』 または『margin-right』 が『auto』と指定されている場合、その使用値は以下のルールによって決定されます。
  2. 『left』『right』 の両方が『auto』の場合、静的位置包含ブロックを確立する要素の『direction』プロパティが『ltr』の場合、 『left』 を静的位置に設定します。それ以外の場合(『direction』が『rtl』の場合)、 『right』 を静的位置に設定します。
  3. 『left』 または『right』 が『auto』の場合、『margin-left』 または『margin-right』 の『auto』を『0』に置き換えます。
  4. この時点で『margin-left』『margin-right』 の両方が『auto』の場合、2つのマージンが等しい値になるという追加の制約の下で方程式を解きます。ただし、 これによりマージンが負になる場合、包含ブロックの方向が『ltr』の場合は 『margin-left』 を0に設定し、『margin-right』 を解きます(『rtl』の場合は逆)。
  5. この時点で『auto』が残っている場合、その値を解きます。
  6. この時点で値が過剰制約されている場合、包含ブロックの『direction』 プロパティが『rtl』の場合は 『left』 の値を無視し、『ltr』の場合は 『right』 の値を無視して解きます。

10.3.9 『インラインブロック』、置換されない要素(通常フロー内)

『width』 が『auto』の場合、使用値は浮動要素と同様に 収縮適合幅になります。

『margin-left』 または『margin-right』 の計算値が『auto』の場合、その使用値は『0』になります。

10.3.10 『インラインブロック』、置換された要素(通常フロー内)

インライン置換要素とまったく同じです。

10.4 最小幅と最大幅: 『min-width』および『max-width』

名前: min-width
値: <length> | <percentage> | inherit
初期値: 0
適用対象: すべての要素。ただし、置換されないインライン要素、テーブル行、および行グループを除く
継承: no
パーセンテージ: 包含ブロックの幅を基準とする
メディア: ビジュアル
計算値: 指定されたパーセンテージまたは絶対的な長さ
名前: max-width
値: <length> | <percentage> | none | inherit
初期値: none
適用対象: すべての要素。ただし、置換されないインライン要素、テーブル行、および行グループを除く
継承: no
パーセンテージ: 包含ブロックの幅を基準とする
メディア: ビジュアル
計算値: 指定されたパーセンテージ、絶対的な長さ、または『none』

これらの2つのプロパティは、コンテンツ幅を特定の範囲に制約することを可能にします。値の意味は以下の通りです:

<length>
固定された最小または最大の使用幅を指定します。
<percentage>
使用値を決定するためのパーセンテージを指定します。 パーセンテージは生成されたボックスの包含ブロックの幅に基づいて計算されます。 包含ブロックの幅が負の場合、使用値は0になります。 包含ブロックの幅がこの要素の幅に依存している場合、CSS 2.2では結果のレイアウトは未定義です。
none
(『max-width』にのみ適用) ボックスの幅に制限を設けません。

『min-width』 および『max-width』 に負の値を指定することは禁止されています。

CSS 2.2では、テーブル、インラインテーブル、テーブルセル、テーブル列、列グループにおける『min-width』および『max-width』の効果は未定義です。

以下のアルゴリズムは、これらの2つのプロパティが『width』 プロパティの使用値にどのように影響を与えるかを説明しています:

  1. 暫定的な使用幅は、上記の「幅とマージンの計算」のルールに従って (『min-width』 および『max-width』 を考慮せずに)計算されます。
  2. 暫定的な使用幅が『max-width』 を超える場合、上記のルールが再度適用されますが、この場合『max-width』 の計算値を『width』の計算値として使用します。
  3. 結果の幅が『min-width』 より小さい場合、上記のルールが再度適用されますが、この場合『min-width』 の値を『width』の計算値として使用します。

これらのステップは、上記のプロパティの実際の計算値には影響を与えません。

ただし、固有比率を持つ置換要素で、『width』 および『height』が 両方とも『auto』に指定されている場合、アルゴリズムは以下の通りです:

違反した制約に対して解決された高さと幅の値を次の表から選択します。 max-widthおよびmax-heightをmax(min, max)として取り、それによりminmaxが成り立つようにします。 この表ではwhは、『min-width』『min-height』『max-width』 および『max-height』プロパティを無視した状態での幅と高さの計算結果を示します。 通常、これらは固有幅と固有高さですが、固有比率を持つ置換要素の場合は異なる場合があります。

注意: 明示的な幅または高さが設定され、もう一方の次元が『auto』である場合、自動側に最小または最大制約を適用すると過剰制約の状況が発生する可能性があります。 仕様ではこの動作は明確ですが、著者が予期していない結果になる場合があります。このような場合、CSS3のobject-fitプロパティを使用して異なる結果を得ることができます。

制約違反 解決された幅 解決された高さ
なし w h
w > max-width max-width max(max-width * h/w, min-height)
w < min-width min-width min(min-width * h/w, max-height)
h > max-height max(max-height * w/h, min-width) max-height
h < min-height min(min-height * w/h, max-width) min-height
(w > max-width) and (h > max-height), where (max-width/w ≤ max-height/h) max-width max(min-height, max-width * h/w)
(w > max-width) and (h > max-height), where (max-width/w > max-height/h) max(min-width, max-height * w/h) max-height
(w < min-width) and (h < min-height), where (min-width/w ≤ min-height/h) min(max-width, min-height * w/h) min-height
(w < min-width) and (h < min-height), where (min-width/w > min-height/h) min-width min(max-height, min-width * h/w)
(w < min-width) and (h > max-height) min-width max-height
(w > max-width) and (h < min-height) max-width min-height

その後、上記の「幅とマージンの計算」のルールを適用し、 『width』 がこの値として計算されたかのように処理します。

10.5 コンテンツの高さ: 『height』プロパティ

名前: height
値: <length> | <percentage> | auto | inherit
初期値: auto
適用対象: すべての要素。ただし、置換されないインライン要素、テーブル列、および列グループを除く
継承: no
パーセンテージ: 本文を参照
メディア: ビジュアル
計算値: 指定されたパーセンテージまたは『auto』、または絶対的な長さ

このプロパティはボックスのコンテンツの高さを指定します。

このプロパティは置換されないインライン要素には適用されません。 代わりに使用されるルールについては、置換されないインライン要素の高さとマージンの計算に関するセクションを参照してください。

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

<length>
長さの値を使用してコンテンツ領域の高さを指定します。
<percentage>
パーセンテージの高さを指定します。パーセンテージは生成されたボックスの包含ブロックの高さに基づいて計算されます。 包含ブロックの高さが明示的に指定されていない場合(つまり、コンテンツの高さに依存している場合)で、この要素が絶対配置されていない場合、 使用される高さは『auto』が指定された場合と同様に計算されます。 ルート要素におけるパーセンテージの高さは、 初期包含ブロックに対して相対的です。 注意: 包含ブロックがブロックレベル要素に基づいている絶対配置された要素の場合、パーセンテージはその要素のパディングボックスの高さに基づいて計算されます。 これはCSS1からの変更であり、CSS1ではパーセンテージは常に親要素のコンテンツボックスに基づいて計算されていました。
auto
高さは他のプロパティの値に依存します。 以下の本文を参照してください。

注意: 絶対配置された要素の包含ブロックの高さは、要素自体のサイズに依存しないため、 このような要素におけるパーセンテージの高さは常に解決可能です。ただし、高さが文書内の後続の要素が処理されるまで判明しない場合があります。

『height』に 負の値を指定することは禁止されています。

例:

例えば、以下のルールは段落のコンテンツの高さを100ピクセルに設定します:

p { height: 100px }

コンテンツの高さが100ピクセルを超える段落は、オーバーフロー プロパティに従って処理されます。

10.6 高さとマージンの計算

『top』『margin-top』『height』『margin-bottom』、 および『bottom』 の値を計算するために、さまざまな種類のボックスを区別する必要があります:

  1. インライン、置換されない要素
  2. インライン、置換された要素
  3. ブロックレベル、置換されない要素(通常フロー内)
  4. ブロックレベル、置換された要素(通常フロー内)
  5. 浮動、置換されない要素
  6. 浮動、置換された要素
  7. 絶対配置、置換されない要素
  8. 絶対配置、置換された要素
  9. 『インラインブロック』、置換されない要素(通常フロー内)
  10. 『インラインブロック』、置換された要素(通常フロー内)

ポイント1-6および9-10の場合、『top』および『bottom』の使用値は9.4.3節のルールによって決定されます。

注意: これらのルールは他の要素と同様にルート要素にも適用されます。

注意。 以下で計算される『height』の使用値は暫定値であり、 『min-height』 および『max-height』 に応じて複数回計算される必要がある場合があります。以下の最小高さと最大高さのセクションを参照してください。

10.6.1 インライン、置換されない要素

『height』 プロパティは適用されません。コンテンツ領域の高さはフォントに基づいて設定されるべきですが、この仕様ではその方法を指定していません。 ユーザーエージェントは例えばem-boxやフォントの最大アセンダーおよびディセンダーを使用することができます (後者はem-boxの上または下にある文字がコンテンツ領域内に収まることを確実にしますが、異なるフォントで異なるサイズのボックスになる可能性があります。 一方、前者は『line-height』に相対的な背景スタイリングを制御できることを確実にしますが、文字がコンテンツ領域の外に描画される可能性があります)。

注意: CSSのレベル3では、コンテンツの高さに使用されるフォントの測定基準を選択するプロパティが含まれる可能性があります。

インライン、置換されないボックスの垂直方向のパディング、ボーダー、およびマージンはコンテンツ領域の上端と下端から始まり、 『line-height』 とは関係がありません。ただし、行ボックスの高さを計算する際に使用されるのは 『line-height』 のみです。

複数のフォントが使用される場合(例えば、文字が異なるフォントで見つかる場合)、 コンテンツ領域の高さはこの仕様では定義されていません。ただし、以下のいずれかを満たすような高さを選択することを提案します: (1) すべてのフォントのem-box、または (2) すべてのフォントの最大アセンダーとディセンダー。 なお、これはフォントサイズの中で最も大きなものよりも大きくなる場合があり、フォントのベースラインの整列に依存します。

10.6.2 インライン置換要素、 通常フロー内のブロックレベル置換要素、『インラインブロック』置換要素および浮動置換要素

『margin-top』または『margin-bottom』が『auto』の場合、その使用値は0になります。

『height』 および 『width』 の計算値が両方とも『auto』で、要素に固有の高さがある場合、その固有の高さが 『height』 の使用値になります。

それ以外の場合、『height』 の計算値が『auto』で、要素に固有の比率がある場合、その使用値は次のように計算されます:

(使用される幅) / (固有の比率)

それ以外の場合、『height』 の計算値が『auto』で、要素に固有の高さがある場合、その固有の高さが 『height』 の使用値になります。

それ以外の場合、『height』 の計算値が『auto』で、上記の条件を満たさない場合、 『height』 の使用値は、2:1の比率を持ち、高さが150pxを超えず、デバイスの幅を超えない最大の矩形の高さに設定されます。

10.6.3 通常フロー内のブロックレベル置換されない要素(『overflow』が『visible』に計算される場合)

このセクションは、『overflow』が『visible』に計算されないがビューポートに伝播された場合の通常フロー内のブロックレベル置換されない要素にも適用されます。

『margin-top』または『margin-bottom』が『auto』の場合、その使用値は0になります。 『height』 が『auto』の場合、高さは要素がブロックレベルの子要素を持つかどうか、またパディングやボーダーを持つかどうかに依存します:

要素の高さは、以下のうち最初に該当する基準までの距離です:

  1. 1つ以上の行を持つインラインフォーマッティングコンテキストを確立する場合、最後の行ボックスの下端
  2. 最後のインフロー子要素の下マージンが要素の下マージンと折りたたまれていない場合、その子要素の下部(折りたたまれている場合もある)マージンの下端
  3. 要素の下マージンと折りたたまれていない最後のインフロー子要素の上マージンを持つ最後の子要素の下ボーダーエッジ
  4. それ以外の場合、ゼロ

通常フロー内の子要素のみが考慮されます(つまり、浮動ボックスや絶対配置されたボックスは無視され、相対配置されたボックスはオフセットを考慮せずに考慮されます)。 子ボックスは匿名ブロックボックスである場合があります。

10.6.4 絶対配置、置換されない要素

このセクションおよび次のセクションの目的のために、「静的位置 (static position)」(要素の)とは、概ね要素が通常フロー内にあった場合の位置を指します。 より正確には、『top』の静的位置は、指定された『position』値が『static』であり、 指定された『float』が『none』であり、 指定された『clear』が『none』であった場合、その要素の最初のボックスとなるであろう仮想的なボックスの上マージンエッジまでの包含ブロックの上端からの距離です。 (9.7節のルールにより、これは『display』の異なる計算値を仮定する必要がある場合もあります。) 仮想ボックスが包含ブロックの上にある場合、値は負になります。

ただし、実際にその仮想ボックスの寸法を計算するのではなく、ユーザーエージェントはそのおおよその位置を推測する自由があります。

静的位置を計算する目的では、固定配置された要素の包含ブロックはビューポートではなく初期包含ブロックと見なされるべきです。

絶対配置された要素の場合、垂直方向の寸法の使用値は次の制約を満たす必要があります:

'top' + 'margin-top' + 'border-top-width' + 'padding-top' + 'height' + 'padding-bottom' + 'border-bottom-width' + 'margin-bottom' + 'bottom' = 包含ブロックの高さ

'top'、『height』および『bottom』の3つすべてが『auto』の場合、『top』を静的位置に設定し、以下のルール3を適用します。

3つのいずれも『auto』でない場合: 『margin-top』および『margin-bottom』の両方が『auto』の場合、 2つのマージンが等しい値になるという追加の制約の下で方程式を解きます。 『margin-top』または『margin-bottom』のいずれかが『auto』の場合、その値を解きます。 値が過剰制約されている場合、『bottom』の値を無視してその値を解きます。

それ以外の場合、以下の6つのルールの1つを適用します。

  1. 『top』および『height』が『auto』で『bottom』が『auto』でない場合、高さは10.6.7に基づいてコンテンツに基づく、 『margin-top』および『margin-bottom』の『auto』値を0に設定し、『top』を解きます。
  2. 『top』および『bottom』が『auto』で『height』が『auto』でない場合、『top』を静的位置に設定し、 『margin-top』および『margin-bottom』の『auto』値を0に設定し、『bottom』を解きます。
  3. 『height』および『bottom』が『auto』で『top』が『auto』でない場合、高さは10.6.7に基づいてコンテンツに基づく、 『margin-top』および『margin-bottom』の『auto』値を0に設定し、『bottom』を解きます。
  4. 『top』が『auto』で『height』および『bottom』が『auto』でない場合、『margin-top』および『margin-bottom』の『auto』値を0に設定し、『top』を解きます。
  5. 『height』が『auto』で『top』および『bottom』が『auto』でない場合、『margin-top』および『margin-bottom』の『auto』値を0に設定し、『height』を解きます。
  6. 『bottom』が『auto』で『top』および『height』が『auto』でない場合、『margin-top』および『margin-bottom』の『auto』値を0に設定し、『bottom』を解きます。

10.6.5 絶対配置、置換された要素

この状況は前述のものと似ていますが、要素に固有の高さがある点が異なります。 置換の順序は次の通りです:

  1. 『height』 の使用値はインライン置換要素と同様に決定されます。 『margin-top』または『margin-bottom』が『auto』と指定されている場合、その使用値は以下のルールによって決定されます。
  2. 『top』 および『bottom』 の両方が『auto』の場合、 『top』 を要素の静的位置に置き換えます。
  3. 『bottom』 が『auto』の場合、 『margin-top』 または『margin-bottom』 にある『auto』を『0』に置き換えます。
  4. この時点で『margin-top』 および『margin-bottom』 の両方がまだ『auto』である場合、2つのマージンが等しい値になるという追加の制約の下で方程式を解きます。
  5. この時点で『auto』が1つだけ残っている場合、その値を解きます。
  6. この時点で値が過剰制約されている場合、 『bottom』 の値を無視してその値を解きます。

10.6.6 複雑なケース

このセクションは以下の場合に適用されます:

『margin-top』または『margin-bottom』が『auto』の場合、 その使用値は0になります。 『height』 が『auto』の場合、高さは10.6.7節に基づいて要素の子孫によって決定されます。

『インラインブロック』要素の場合、行ボックスの高さを計算する際にマージンボックスが使用されます。

10.6.7 ブロックフォーマットコンテキストルートにおける『auto』高さ

特定の場合(例えば、10.6.4節および 10.6.6節を参照)、ブロックフォーマットコンテキストを確立する要素の高さは以下のように計算されます:

インラインレベルの子要素のみを持つ場合、高さは最上部の行ボックスの上端から最下部の行ボックスの下端までの距離です。

ブロックレベルの子要素を持つ場合、高さは最上部のブロックレベル子ボックスの上マージンエッジから 最下部のブロックレベル子ボックスの下マージンエッジまでの距離です。

絶対配置された子要素は無視され、相対配置されたボックスはオフセットを考慮せずに考慮されます。 子ボックスは匿名ブロックボックスである場合があります。

さらに、要素がその下コンテンツエッジよりも下に下マージンエッジを持つ浮動子孫を持つ場合、 そのエッジを含めるように高さが増加します。 このブロックフォーマットコンテキストに参加する浮動のみが考慮されます。 例えば、絶対配置された子孫や他の浮動内の浮動は考慮されません。

10.7 最小高さと最大高さ: 『min-height』および『max-height』

要素の高さを特定の範囲に制約することが有用な場合があります。2つのプロパティがこの機能を提供します:

名前: min-height
値: <length> | <percentage> | inherit
初期値: 0
適用対象: すべての要素。ただし、置換されないインライン要素、テーブル列、および列グループを除く
継承: no
パーセンテージ: 本文を参照
メディア: ビジュアル
計算値: 指定されたパーセンテージまたは絶対的な長さ
名前: max-height
値: <length> | <percentage> | none | inherit
初期値: none
適用対象: すべての要素。ただし、置換されないインライン要素、テーブル列、および列グループを除く
継承: no
パーセンテージ: 本文を参照
メディア: ビジュアル
計算値: 指定されたパーセンテージ、絶対的な長さ、または『none』

これらの2つのプロパティは、ボックスの高さを特定の範囲に制約することを可能にします。値の意味は以下の通りです:

<length>
固定された最小または最大の計算高さを指定します。
<percentage>
使用値を決定するためのパーセンテージを指定します。 パーセンテージは生成されたボックスの包含ブロックの高さに基づいて計算されます。 包含ブロックの高さが明示的に指定されていない場合(つまり、コンテンツの高さに依存している場合)で、この要素が絶対配置されていない場合、 パーセンテージ値は『min-height』の場合は『0』、『max-height』の場合は『none』として扱われます。
none
(『max-height』にのみ適用) ボックスの高さに制限を設けません。

『min-height』 および『max-height』 に負の値を指定することは禁止されています。

CSS 2.2では、テーブル、インラインテーブル、テーブルセル、テーブル行、および行グループにおける『min-height』および『max-height』の効果は未定義です。

以下のアルゴリズムは、これらの2つのプロパティが『height』 プロパティの使用値にどのように影響を与えるかを説明しています:

  1. 暫定的な使用高さは、上記の「高さとマージンの計算」のルールに従って (『min-height』 および『max-height』 を考慮せずに)計算されます。
  2. 暫定的な高さが『max-height』 を超える場合、上記のルールが再度適用されますが、この場合『max-height』の値を『height』の計算値として使用します。
  3. 結果の高さが『min-height』 より小さい場合、上記のルールが再度適用されますが、この場合『min-height』の値を『height』の計算値として使用します。

これらのステップは『height』 の実際の計算値には影響を与えません。その結果、例えば、計算値に依存するマージン折りたたみには影響を与えません。

ただし、『width』 および『height』 の両方が『auto』に計算される置換要素の場合、使用幅と使用高さを見つけるために 「最小幅と最大幅」のセクションのアルゴリズムを使用します。 次に、それらを計算値として使用するかのように、 「高さとマージンの計算」のルールを適用します。

10.8 行の高さの計算: 『line-height』および『vertical-align』 プロパティ

インラインフォーマットコンテキストのセクションで説明されているように、 ユーザーエージェントはインラインレベルボックスを行ボックスの垂直スタックに流し込みます。 行ボックスの高さは次のように決定されます:

  1. 行ボックス内の各インラインレベルボックスの高さを計算します。 置換要素、インラインブロック要素、およびインラインテーブル要素の場合、これはそれらのマージンボックスの高さです。 インラインボックスの場合、これはそれらの『line-height』です。 (「高さとマージンの計算」およびインラインボックスの高さ「行間と半行間」内で参照してください。)
  2. インラインレベルボックスはその『vertical-align』プロパティに従って垂直方向に整列されます。 『top』または『bottom』に整列される場合、それらは行ボックスの高さを最小化するように整列される必要があります。 これらのボックスが十分に高い場合、複数の解が存在し、CSS 2.2では行ボックスのベースライン (つまり、支柱の位置、以下を参照)の位置を定義していません。
  3. 行ボックスの高さは、最上部のボックストップから最下部のボックスボトムまでの距離です。 (これは、以下で説明する支柱を含みます。)

空のインライン要素は空のインラインボックスを生成しますが、これらのボックスにはマージン、パディング、ボーダー、および行の高さがあり、 コンテンツを持つ要素と同様にこれらの計算に影響を与えます。

10.8.1 行間と半行間

CSSは、すべてのフォントがベースライン上に特徴的な高さとその下に深さを指定するフォントメトリクスを持つことを前提としています。 このセクションでは、Aをその高さ(特定のフォントとサイズにおける)、 Dをその深さとし、AD = A + D、つまり上から下までの距離を定義します。 (TrueTypeおよびOpenTypeフォントにおけるAおよびDの見つけ方については、以下の注意を参照してください。) これらはフォント全体のメトリクスであり、特定のグリフのアセンダーやディセンダーに対応する必要はありません。

ユーザーエージェントは、非置換インラインボックス内のグリフを、関連するベースラインで互いに整列させる必要があります。 次に、各グリフについてAおよびDを決定します。 単一の要素内のグリフは異なるフォントから来る場合があり、すべてが同じAおよびDを持つ必要はありません。 インラインボックスにグリフがまったく含まれていない場合、これは支柱 (幅ゼロの不可視グリフ)を含むと見なされ、その支柱は要素の最初の利用可能なフォントのAおよびDを持ちます。

さらに各グリフについて、追加する行間Lを決定します。 ここで、L = 『line-height』 - ADです。 半分の行間がAの上に、もう半分がDの下に追加され、それによりグリフとその行間の合計高さは ベースラインの上でA' = A + L/2、 合計深さはD' = D + L/2となります。

注意。 Lは負になる場合があります。

インラインボックスの高さは、すべてのグリフとその両側の半行間を囲むため、正確に『line-height』になります。 子要素のボックスはこの高さに影響を与えません。

非置換要素のマージン、ボーダー、およびパディングは行ボックスの計算には影響しませんが、それでもインラインボックスの周りに表示されます。 これは、『line-height』 で指定された高さが含まれるボックスのコンテンツの高さよりも小さい場合、パディングとボーダーの背景や色が隣接する行ボックスに 「はみ出す」可能性があることを意味します。 ユーザーエージェントは文書の順序でボックスをレンダリングする必要があります。 これにより、後続の行のボーダーが前の行のボーダーやテキストの上に描画されることになります。

注意。 CSS 2.2はインラインボックスのコンテンツ領域が何であるかを定義していません(上記の10.6.1を参照)。 したがって、異なるユーザーエージェントが背景やボーダーを異なる場所に描画する可能性があります。

注意。 OpenTypeまたはTrueTypeフォントを使用する実装では、 フォントのOS/2テーブルのメトリクス「sTypoAscender」および「sTypoDescender」をAおよびDとして使用することを推奨します (現在の要素のフォントサイズにスケーリングした後)。 これらのメトリクスがない場合、HHEAテーブルの「Ascent」および「Descent」メトリクスを使用するべきです。

名前: line-height
値: normal | <number> | <length> | <percentage> | inherit
初期値: normal
適用対象: すべての要素
継承: yes
パーセンテージ: 要素自体のフォントサイズに基づきます
メディア: ビジュアル
計算値: <length>および <percentage>の場合は絶対値、それ以外の場合は指定された値

ブロックコンテナ要素で内容がインラインレベルの要素で構成されている場合、'line-height'は要素内の行ボックスの最小の高さを指定します。最小の高さは、ベースラインの上の最小高さとその下の最小深さから構成されます。これは、各行ボックスが要素のフォントと行高さプロパティを持つ幅ゼロのインラインボックスで始まるかのように扱われます。この仮想ボックスを「ストラット」と呼びます(名前はTeXに由来します)。

フォントのベースライン上および下の高さと深さは、フォントに含まれるメトリクスであると想定されます。(詳細についてはCSSレベル3を参照してください。)

非置換のインライン要素では、'line-height'は行ボックスの高さ計算に使用される高さを指定します。

このプロパティの値には以下の意味があります:

normal
ユーザーエージェントに、要素のフォントに基づいて「適切な」値を使用するよう指示します。この値は、<number>と同じ意味を持ちます。'normal'の使用値として1.0から1.2の間を推奨します。計算値は 'normal' です。
<length>
指定された長さが行ボックスの高さ計算に使用されます。負の値は不正です。
<number>
プロパティの使用値は、この数値に要素のフォントサイズを掛けたものです。負の値は不正です。計算値は指定された値と同じです。
<percentage>
プロパティの計算値は、このパーセンテージに要素の計算フォントサイズを掛けたものです。負の値は不正です。

例:

以下の例の3つのルールは、同じ結果の行高さを持ちます:

div { line-height: 1.2; font-size: 10pt }     /* 数値 */
div { line-height: 1.2em; font-size: 10pt }   /* 長さ */
div { line-height: 120%; font-size: 10pt }    /* パーセンテージ */

要素が複数のフォントでレンダリングされる場合、ユーザーエージェントは最大のフォントサイズに基づいて 'normal' の'line-height'値を決定することがあります。

注記。 すべてのインラインボックスが同じフォントであり、置換要素やインラインブロック要素などがない場合、'line-height'の値が順次の行のベースラインの間隔を正確に保証します。これは、異なるフォントで列を揃える必要がある場合(例: テーブル)に重要です。

名前: vertical-align
値: baseline | sub | super | top | text-top | middle | bottom | text-bottom | <percentage> | <length> | inherit
初期値: baseline
適用対象: インラインレベルおよび 'table-cell' 要素
継承: いいえ
パーセンテージ: 要素自体の 'line-height' を参照
メディア: 視覚
計算値: <percentage> および <length> の場合は絶対長、それ以外の場合は指定された値

このプロパティは、インラインレベル要素によって生成されるボックスの行ボックス内の垂直位置に影響を与えます。

注記。 このプロパティの値は、テーブルの文脈では異なる意味を持ちます。詳細はテーブルの高さアルゴリズムのセクションを参照してください。

以下の値は、親インライン要素または親ブロックコンテナ要素のストラットに関連してのみ意味を持ちます。

以下の定義では、インライン非置換要素の場合、整列に使用されるボックスは 'line-height' の高さを持つボックス(ボックスのグリフと各側の半リーディングを含む、上記を参照)です。それ以外の要素では、整列に使用されるボックスはマージンボックスです。

baseline
ボックスのベースラインを親ボックスのベースラインに揃えます。ボックスにベースラインがない場合は、親のベースラインにボックスの下端マージンを揃えます。
middle
ボックスの垂直中央を親ボックスのベースラインプラス親のx高さの半分に揃えます。
sub
ボックスのベースラインを親ボックスの下付き文字の適切な位置に下げます。(この値は要素のテキストのフォントサイズには影響を与えません。)
super
ボックスのベースラインを親ボックスの上付き文字の適切な位置に上げます。(この値は要素のテキストのフォントサイズには影響を与えません。)
text-top
ボックスの上端を親の内容領域の上端に揃えます(10.6.1を参照)。
text-bottom
ボックスの下端を親の内容領域の下端に揃えます(10.6.1を参照)。
<percentage>
ボックスをこの距離だけ上下に移動します('line-height'値のパーセンテージ)。値 '0%' は 'baseline' と同じ意味です。
<length>
ボックスをこの距離だけ上下に移動します。値 '0cm' は 'baseline' と同じ意味です。

以下の値は、行ボックスに対して要素を整列させます。要素にはそれに対して整列された子孫が含まれる場合があるため(その子孫にも整列された子孫が含まれることがあります)、これらの値は整列されたサブツリーの境界を使用します。インライン要素の整列されたサブツリーには、その要素と 'top' または 'bottom' 以外の計算 'vertical-align' 値を持つすべての子孫インライン要素の整列されたサブツリーが含まれます。整列されたサブツリーの上端はサブツリー内のボックスの上端の中で最も高いものであり、下端はそれに対応します。

top
整列されたサブツリーの上端を行ボックスの上端に揃えます。
bottom
整列されたサブツリーの下端を行ボックスの下端に揃えます。

'inline-table' のベースラインは、テーブルの最初の行のベースラインです。

'inline-block' のベースラインは、通常のフロー内の最後の行ボックスのベースラインですが、インフロー行ボックスがない場合、または 'overflow' プロパティの計算値が 'visible' 以外の場合、ベースラインは下端マージンエッジになります。