1.ビジュアルフォーマットモデル
ビジュアルフォーマットモデルは、
ユーザーエージェントが
ビジュアルメディアの
ドキュメントツリーを
処理する方法です。
ビジュアルフォーマットモデル
(Visual formatting model.) とは、ユーザー
HTMLの仕様と共に提示されている「処理する方法」についての記述(提案)方法は、主に CSSを用いて行われています。
ビジュアルフォーマットモデルでは、ドキュメントツリーの各要素は、ボックスモデル(箱の雛型)に従って0個以上のボックス(箱)を生成します。これらのボックスのレイアウトは、次の要素によって決まります。
- ボックスの寸法(ボックス
モデル )とタイプ(レンダリングの提案)。 - 位置決めスキーム。(通常フロー, フロート, 絶対位置決め)
- 通常フロー
- 通常フローには、ブロックレベルボックスのブロックフォーマット, インラインレベルボックスのインラインフォーマット, およびブロックレベルボックスとインラインレベルボックスの相対位置決めが含まれます。
通常フローのボックスは、テーブル
書式設定 , ブロックコンテキスト 書式設定 , またはインラインコンテキスト 書式設定 に属します。他の種類の書式設定コンテキスト コンテキスト で、ルビ書式設定 , フレックスコンテキスト 書式設定 もあります。コンテキスト - フロート
- フロートモデルでは、ボックスは最初に通常フローに従ってレイアウトされ、次にフローから取り出されて、可能な限り左または右に移動します。コンテンツはフロートの側面に沿って流れる場合があります。
- 絶対位置決め
- 絶対位置決めモデルでは、ボックスは通常フローから完全に削除され(後続の兄弟には影響しません)、包含ブロックに対する位置が割り当てられます。
- ドキュメント ツリー内の要素間の関係。
- 外部情報。(例:ビューポートのサイズ, 画像の固有寸法など)
要素がフロートされているか、絶対位置決めされているか、またはルート要素である場合、その要素はフロー外と呼ばれます。 要素がフロー外ではない場合、その要素はフロー内と呼ばれます。 要素 A のフローは、A と、最も近いフロー外祖先が A であるすべてのフロー内要素で構成されるセットです。
一般に、生成されたボックスは、子孫ボックスのブロック(纏まり)を含むものとして機能します。これはコンテナ(容器)といいます。
(ここでの説明は、左から右, 上から下に流れる横書きの日本語を前提にしています。)
フォーマット |
生成する |
参加する |
ブロック |
ブロック (テーブル |
ブロック |
---|---|---|
インライン |
ブロック |
インライン |
テーブル |
テーブル |
内部テーブル |
ルビ |
ルビ |
ルビ |
フレックス |
フレックス |
フレックス |
2.ブロックフォーマットコンテキスト
ブロックフォーマットの
コンテキストでは、
ボックスは、
含まれているブロックの
上部から始めて、
垂直方向に
次々に配置されます。
ブロック
ブロック
言い換えると、長方形用の整形の環境では、箱は、含まれている長方形の入れ物の上部から始めて、垂直方向に次々に配置されます。2 つの兄弟ボックス間の垂直距離は、margin(マージン)プロパティによって決定されます。ブロック
ブロックフォーマットの
フロート, 絶対位置指定の要素, ブロックボックスではないブロックコンテナー (インラインブロック, テーブルセル, テーブルキャプションなど), および 'overflow' が 'visible' 以外のブロックボックス (その値がビューポートに伝播されている場合を除く) は、そのコンテンツに対して新しいブロック
親フォーマットコンテキストがブロックフォーマットコンテキストでない場合、
<!DOCTYPE html>
<html lang=
"ja"> <head>
<meta charset=
"utf-8"> <title>サンプル</title>
</head>
<body>
コンテンツ
</body>
</html>
<button>
ボタン
</button>
button
フォーマット
コンテキスト
フォーマット
コンテキスト
3.インラインフォーマットコンテキスト
インラインフォーマットの
コンテキストでは、
ボックスは、
含まれているブロックの
上部から始めて、
水平方向に
次々に配置されます。
インライン
コンテキスト
インライン
行ボックスの幅は、包含ブロックとフロートの存在によって決まります。行ボックスの高さは、行の高さの計算に関するセクションで示されている規則によって決まります。
行ボックスは常に、その中に含まれるすべてのボックスを収容できる高さです。ただし、その中に含まれる最も高いボックスよりも高くなる場合があります (たとえば、ボックスがベースラインを揃えるように配置されている場合)。ボックス B の高さが、それを含む行ボックスの高さよりも低い場合、行ボックス内の B の垂直方向の配置は、「vertical-align」プロパティによって決定されます。複数のインライン レベル ボックスが 1 つの行ボックス内に水平方向に収まらない場合、それらは 2 つ以上の垂直方向に積み重ねられた行ボックスに分散されます。したがって、段落は行ボックスの垂直方向の積み重ねです。行ボックスは垂直方向に分離されることなく積み重ねられ (他の場所で指定されている場合を除く)、重なり合うことはありません。
一般に、行ボックスの左端は包含ブロックの左端に接し、右端は包含ブロックの右端に接します。ただし、フローティング ボックスは包含ブロックの端と行ボックスの端の間に来ることがあります。したがって、同じインライン書式設定コンテキスト内の行ボックスは一般に同じ幅 (包含ブロックの幅) を持ちますが、フロートによって使用可能な水平方向のスペースが削減されると、幅が変わることがあります。同じインライン書式設定コンテキスト内の行ボックスは一般に高さが変わります (たとえば、1 つの行に背の高い画像が含まれ、他の行にはテキストのみが含まれる場合があります)。
行のインライン レベル ボックスの合計幅が、それらを含む行ボックスの幅よりも小さい場合、行ボックス内でのそれらの水平方向の配置は、「text-align」プロパティによって決定されます。そのプロパティの値が「justify」の場合、ユーザー エージェントは、インライン ボックス内のスペースと単語も伸ばすことができます (ただし、インライン テーブル ボックスとインライン ブロック ボックスは伸ばしません)。
コンテキスト
2つ目のボックスの途中で、
行を折り返した例
インライン ボックスが行ボックスの幅を超える場合、インライン ボックスは複数のボックスに分割され、これらのボックスは複数の行ボックスに分散されます。インライン ボックスを分割できない場合 (たとえば、インライン ボックスに 1 つの文字が含まれている場合、または言語固有の単語区切りルールによってインライン ボックス内での区切りが許可されていない場合、またはインライン ボックスが空白値 nowrap または pre の影響を受ける場合)、インライン ボックスは行ボックスをオーバーフローします。
インライン ボックスが分割されると、分割が発生した場所 (または複数の分割がある場合はどの分割でも) で、マージン、境界線、およびパディングは視覚的な効果を持ちません。
インライン ボックスは、双方向テキスト処理のため、同じ行ボックス内で複数のボックスに分割されることもあります。
行ボックスは、インライン フォーマット コンテキスト内でインライン レベルのコンテンツを保持するために必要に応じて作成されます。テキスト、保持された空白、ゼロ以外のマージン、パディング、または境界線を持つインライン要素、その他のインフロー コンテンツ (画像、インライン ブロック、インライン テーブルなど) が含まれず、保持された改行で終了しない行ボックスは、その中の要素の位置を決定する目的で高さゼロの行ボックスとして扱われ、他の目的では存在しないものとして扱われる必要があります。
インライン フォーマットコンテキストは、ブロックレベルボックスを含まないブロックコンテナーボックスによって確立されます。
インライン
尚、この処理を簡素にする為に、インラインレベルとブロックレベルが混在する場合は、そのインラインレベルのボックスを連続する纏まりで匿名のブロックボックスで囲みます。
他にも、インラインレベルのボックスがないブロックコンテナにテキストがある場合に、このテキストを覆う匿名のインラインボックスが生成されます。
4.表(テーブル)モデル
テーブルモデルでは、
テーブルは
オプションのキャプションと
任意の数のセル行で
構成されます。
表(テーブル)モデルでは、表はオプションのキャプションと任意の数のセル行で構成されます。作成者がドキュメント言語で明示的に列ではなく行を指定するため、表(テーブル)モデルは「行プライマリ」と呼ばれます。すべての行が指定されると、列が派生します。各行の最初のセルは最初の列に属し、2番目のセルは2番目の列に属します。行と列は構造的にグループ化でき、このグループ化はプレゼンテーションに反映されます。
1A | 1B | 1C |
2A | 2B | 2C |
3A | 3B | 3C |
一行 | 一行 | 一行 |
二行 | 二行 | 二行 |
三行 | 三行 | 三行 |
一列 | 二列 | 三列 |
一列 | 二列 | 三列 |
一列 | 二列 | 三列 |
セルは複数の行または列にまたがることがあります。
1A | 1B | 1C | |
2A | 2B | 2C | |
3A | 3B | 3C |
1A | 1B | 1C |
2A | 2B | 2C |
3A | 3B | 3C |
1A | 1B | 1C | |
2A | 2B | 2C | |
3A | 3B | 3C |
列は明示的に指定されるのではない点がポイントと思います。二列目だけをコピペなど出来ないし、二列目と三列目の入れ替えは個々のセルの順番の入れ替えで行わなければならず大変です。
列を纏まりとして重視するならば、列ごとをボックスとして捉え、そのボックスをインラインレベルのブロックコンテナとして扱うとか、
<table>
<caption>キャプション</caption>
<tbody>
<tr>
<td>セル</td>
</tr>
</tbody>
</table>
tabletable
が提案されていて、
caption
フォーマット
コンテキスト
キャプション
ボックス
グリッド
ボックス
tbody
フォーマット
コンテキスト
フォーマット
コンテキスト
テーブル
ボックス
td
フォーマット
コンテキスト
フォーマット
コンテキスト
5.ルビモデル
ルビモデルでは、
フレージングコンテンツを
マークできます。
ruby
ruby
要素の内部表示タイプがルビで、外部表示タイプがインライン以外の場合、必要な外部表示タイプの主ボックスとインラインレベルのルビコンテナーの 2つのボックスが生成されます。 要素で指定されたすべてのプロパティは主ボックスに適用されます(継承可能な場合は、ルビコンテナーボックスに継承されます)。 これにより、内部のルビ構造を正しく維持しながら、要素をブロックとしてスタイル設定できます。
CSSモデルでは、ドキュメント言語にこれらの各コンポーネントに対応する要素が含まれている必要はありません。 構造の欠落部分は、表の正規化に使用されるものと同様の匿名ボックス生成ルールによって暗示されます。
<ruby>
<rbc>
<rb>2024</rb>
<rb>12</rb>
<rb>15</rb>
</rbc>
<rtc>
<rt>Year</rt>
<rt>Month</rt>
<rt>Day</rt>
</rtc>
<rtc>
<rt rbspan=
"3">Sample Date</rt> </rtc>
</ruby>
Year | Month | Day |
2024 | 12 | 15 |
Sample Date |
ルビ
注釈レベルの
インライン
- ルビコンテナボックス(ruby container box.)
-
display
プロパティ が、ruby の時、要素がルビコンテナ を生成します。ボックス ruby
要素 のdisplayプロパティ の既定値が、rubyです。ルビコンテナは非アトミックなインラインレベルボックスです。通常のインラインボックスと同様に、ルビコンテナは行をまたいで分割され、その包含ブロックは最も近いブロックコンテナの祖先です。インラインボックスのコンテンツがインラインボックス自体を含む同じインラインフォーマットコンテキストに参加するのと同様に、ルビコンテナとその基本レベルのコンテンツはルビコンテナ自体を含む同じインラインフォーマットコンテキストに参加します。
ただし、ルビコンテナは、注釈をホストするために、インラインフォーマットコンテキストのセグメントの周りにさらに構造を構築するルビフォーマットコンテキストも確立します。注: このフォーマットコンテキストは独立したフォーマットコンテキストではありません。ルビベース, ルビ注釈, ルビベースコンテナー, およびルビ注釈コンテナーは、内部ルビボックスです。内部テーブル要素と同様に、ルビレイアウトで特定の役割を持ち、ルビコンテナーのルビ書式設定コンテキストに参加します。ルビ書式設定コンテキストでの役割に加えて、ルビベースはルビコンテナーと同じベースレベルのインライン書式設定コンテキストに同時に参加しますが、ルビ注釈はルビコンテナーによって確立された別の注釈レベルのインライン書式設定コンテキストに参加します。
インラインボックスの内容と同様に、ルビコンテナー(およびそのすべての内部ルビボックス) の内容の包含ブロックは、ルビコンテナーの包含ブロックです。したがって、たとえばフロートは、ルビボックスタイプではなく、ルビコンテナーの包含ブロックによってトラップされます。
- ルビベースボックス(ruby base box.)
-
display
プロパティ が、ruby-base の時、要素がルビベース を生成します。ボックス ルビ
ベース は、内部ボックス ルビ です。ルビレイアウトで特定の役割を持ち、ルビボックス コンテナ のルビフォーマット に参加します。ルビコンテキスト フォーマット での役割に加えて、ルビコンテキスト ベース は、ルビコンテナ と同じベースレベルのインラインフォーマット に同時に参加しますコンテキスト rb
要素 のdisplayプロパティ の既定値が、ruby-baseです。ただ、HTML Living Standard ではこの要素は採用されていません。 構造の欠落部分は、匿名ボックス生成ルールによって暗示されます。この場合は、匿名のルビ でラップされます。ベース - ルビ注釈ボックス(ruby annotation box.)
-
display
プロパティ が、ruby-text の時、要素がルビ注釈 を生成します。ボックス ルビ
注釈 は、内部ボックス ルビ です。ルビレイアウトで特定の役割を持ち、ルビボックス コンテナ のルビフォーマット に参加します。ルビコンテキスト フォーマット での役割に加えて、ルビコンテキスト 注釈 は、ルビコンテナ によって確立された別の注釈レベルのインラインフォーマット に参加します。コンテキスト rt
要素 のdisplayプロパティ の既定値が、ruby-textです。 - ルビベースコンテナボックス(ruby base container box.)
-
display
プロパティ が、ruby-base-container の時、要素がルビベース を生成します。コンテナ ボックス ルビ
ベース は、内部コンテナ ボックス ルビ です。ルビレイアウトで特定の役割を持ち、ルビボックス コンテナ のルビフォーマット に参加します。コンテキスト rbc
要素 のdisplayプロパティ の既定値が、ruby-base-containerです。ただ、HTML Living Standard ではこの要素は採用されていません。 構造の欠落部分は、匿名ボックス生成ルールによって暗示されます。この場合は、匿名のルビ でラップされます。コンテナ - ルビ注釈コンテナボックス(ruby annotation container box.)
-
display
プロパティ が、ruby-text--container の時、要素がルビ注釈 を生成します。コンテナ ボックス ルビ
注釈 は、内部コンテナ ボックス ルビ です。ルビレイアウトで特定の役割を持ち、ルビボックス コンテナ のルビフォーマット に参加します。コンテキスト rtc
要素 のdisplayプロパティ の既定値が、ruby-text--containerです。ただ、HTML Living Standard ではこの要素は採用されていません。 構造の欠落部分は、匿名ボックス生成ルールによって暗示されます。この場合は、匿名のルビ でラップされます。コンテナ
6.フレックスフォーマットコンテキスト
フレックスフォーマットの
コンテキストでは、
ボックスは、
その開始位置も、
配置の方向も、
個別に指定できます。
フレックスフォーマットコンテキスト(Flex formatting context.) では、ボックスは、その開始位置も、配置の方向も、個別に指定できます。
div
<style>
.XHSample42601 > * {
border: dotted 1px rgba(153,153,153,1.0);
}
</style>
<div class=
"XHSample42601"> <span>span</span><div>div<br>
div</div> </div>
div
<style>
.XHSample42602 {
display: flex;
}
.XHSample42602 > * {
border: dotted 1px rgba(153,153,153,1.0);
}
</style>
<div class=
"XHSample42602"> <span>span</span><div>div<br>
div</div> </div>
class
div
7.フロート
フロートは、
現在の行で
左または右に
シフトされる
ボックスです。
フロートとは、現在の行で左または右にシフトされるボックスです。 フロート(または「フロートされた」または「フローティング」ボックス) の特徴は、コンテンツがその側面に沿って流れる可能性がある(または「クリア」プロパティによってそれが禁止される) ことです。 コンテンツは、左フロートボックスの右側に流れ、右フロートボックスの左側に流れます。
<style>
.XHSample42701 {
float: left;
width: 5em;
margin: 0;
border: dotted 2px rgba(153,153,153,1.0);
}
</style>
<p class=
"XHSample42701">フロートの指定がされている要素です。</p> <p>回り込みの例示です。</p>
<p>フロートボックスにつづくボックスは、側面が終わるまで続きます。</p>
class
フロートの指定がされている要素です。
回り込みの例示です。
フロートボックスにつづくボックスは、側面が終わるまで続きます。
<style>
.XHSample42701 {
float: left;
width: 5em;
margin: 0;
border: dotted 2px rgba(153,153,153,1.0);
}
.XHSample42702 {
clear: both;
}
</style>
<p class=
"XHSample42701">フロートの指定がされている要素です。</p> <p>回り込みの例示です。</p>
<p class=
"XHSample42702">クリアの指定がされている要素です。</p>
class
フロートの指定がされている要素です。
回り込みの例示です。
クリアの指定がされている要素です。
8.配置の指定
positionプロパティで、
文書内で要素が
どのように配置されるかを
設定できます。
position
positionstatic
であり、この要素は文書の通常のフローに従って配置されます。relative
は相対位置指定であり、absolute
または fixed
は絶対位置指定となります。