Revised: Jun./22nd/2004
CSS2 では、文書の木構造を、ボックスモデルに従ってレンダリングします。本ページを読むに当たっては、ボックスモデルから先に読むように強くお勧めします。
要素が生成するボックスは、親要素の確立する包含ブロックに基づいてレンダリングされます。新しくブロック・ボックスを生成する要素をブロック・レベルと呼び、新しいブロックを生成せずに、行内に配置される要素をインライン・レベルと呼びます。インラインレベルの要素が生成するボックスを、インラインボックスと呼びます。
視覚フォーマットモデルを決定するコンテキストは、大きく分けると、ブロックフォーマットと、インラインフォーマットに分けられます。
'display' の値が block である要素を、ブロックレベル要素と呼びます。HTML のデフォルトでは、div,h1,h2,h3,h4,h5,h6,p,blockquote,address,dl,ul,ol,table などが該当します。視覚的な表現では、要素の開始が新しい行の開始となるような要素です。
ブロックレベルの要素のレンダリングに使われるフォーマットがブロックフォーマットです。要素が生成するボックスは、親要素の設定する包含ブロックに内部に配置され、前後のボックスとはマージンの指定値を隔てて隣接します。
ボックスは、包含ブロックの位置に基づいて位置が計算されますが、'position' 指定の値によっては、包含ブロックからはみ出したり、完全に外部に位置づけられることもあります。
'display' の値が inline である要素を、インラインレベル要素と呼びます。HTML のデフォルトでは、span,strong,em,q,ruby などが該当します。
インラインレベルの要素のレンダリングに使われるフォーマットがインラインフォーマットです。行ボックスは矩形領域ですが、インラインボックスは、改行する(矩形領域をまたいで存在する)ことができます。
要素が生成するインラインボックスは、親要素の設定する包含ブロック幅の行ボックス内部に流し込まれる形で配置されます。行ボックスの高さは、'margin', 'top', 'bottom' に依存するほか、'line-height' によって決定します。
行ボックス内部でのインラインボックスの配置は、上下方向は 'vertical-align' によって揃えられます。'vertical-align の値が top であれば、行ボックスとインラインボックスの上辺が一致するように配置され、baseline であれば、テキストのベースラインが一致するように配置されます。
水平方向は 'text-align' 方向に揃えられます。'text-align' の値が left であれば、行ボックスとインラインボックスの左辺が一致するように配置され、justify であれば、双方の左右の辺が一致するように、インラインボックスの幅が拡張されます。
displayプロパティ 'display' は、任意の要素に指定可能です。セレクタにマッチした対象が生成するボックスの種類を指定します。ボックスの種類を指定するものなので、このプロパティはその名前とは裏腹に、視覚的でないメディアタイプに対しても有効です。
| プロパティ名 | 値 |
|---|---|
| display | inline | block | list-item | run-in | compact | marker | table | inline-table | table-row-group | table-header-group | table-footer-group | table-row | table-column-group | table-column | table-cell | table-caption | none | inherit |
'display' は子要素に継承されません。デフォルトの値は、inline です。inherit は、親要素の値を明示的に継承する指定です。
blockinlinelist-itemmarker:before, :after と共に使われる。その他の場合は、'inline' と等価となる。nonerun-incompacttable,inline-table,table-row-group, table-column, table-column-group, table-header-group, table-footer-group, table-row,table-cell, table-caption'display' の例:
/* hr 要素は非表示で、文書のフォーマッティングに影響しない */
hr { display: none }
/* dt の幅が dd のマージンと等しいか、それよりも小さい場合は、
一行のインライン・ボックスとして、マージン内に表示される */
dt { display: compact }
dd { margin-left: 4em }
/* h3 要素は後続のブロックレベル要素の最初のインライン・ボックスとなる */
h3 { display: run-in }
positionプロパティ 'position' は、任意の要素に指定可能です。セレクタにマッチした対象が生成するボックスの位置を計算するために使われます。
| プロパティ名 | 値 |
|---|---|
| position | static | relative | absolute | fixed | inherit |
'position' は子要素に継承されません。デフォルトの値は、static です。inherit は、親要素の値を明示的に継承する指定です。
staticleft', 'top' は適用されない。 relativeabsoluteleft','right','top', 'bottom' を用いて、ボックスの包含ブロックに関するオフセットを指定する。独立したレイヤーとしてレンダリングされ、後続のボックスの位置の計算には影響しない。fixedabsolute' に従って計算された後、ページやウィンドウなどの表示域に対して固定され、スクロールやページ分割に対して移動しない。'position' の値が static 以外の場合、ボックスの包含ブロックに対するオフセット値を指定できます。
| プロパティ名 | 値 |
|---|---|
| top, right, bottom, left | <length> | <percentage> | auto | inherit |
オフセット関連のプロパティは子要素に継承されません。デフォルトの値は、auto です。inherit は、親要素の値を明示的に継承する指定です。
<percentage>top', 'bottom' に対しては、包含ブロックの高さが明示的に指定されない場合は、'auto' の場合と同様に解釈される。autofloatプロパティ 'float' は、'position' が absolute か fixed である要素(絶対位置決めされた要素)を除いた、任意の要素に指定可能です。セレクタにマッチした対象が生成するボックスの浮動化方法を指定します。
| プロパティ名 | 値 |
|---|---|
| float | left | right | none | inherit |
'float' は子要素に継承されません。デフォルトの値は、none です。inherit は、親要素の値を明示的に継承する指定です。
値が left か right の場合は、'display' の値は無視されます。
leftrightnone
/* img は左に浮動化される */
img { float: left }
clearプロパティ 'clear' は、ブロックレベル要素に指定可能です。セレクタにマッチした対象が生成するボックスのどの側が先行するボックスに隣接しないかを指定します。
| プロパティ名 | 値 |
|---|---|
| clear | none | left | right | both | inherit |
'clear' は子要素に継承されません。デフォルトの値は、none です。inherit は、親要素の値を明示的に継承する指定です。
leftrightbothnone
/* h2 要素は浮動ブロックの脇に回り込まない */
h2 { clear: both }
z-indexプロパティ 'z-index' は、任意の要素に指定可能です。セレクタにマッチした対象が生成するボックスの上限関係を指定します。
| プロパティ名 | 値 |
|---|---|
| z-index | auto | <integer> | inherit |
'z-index' は子要素に継承されません。デフォルトの値は、auto です。inherit は、親要素の値を明示的に継承する指定です。
<integer> は、相互に重なり合うボックス間で、垂直方向のレイヤーのレベルを表し、数字が大きい程、上に表示されます。負の値が許されます。
値は継承されませんが、初期値が auto なので、親要素のボックスと同じレイヤー上にフォーマットされます。
/* img は下から 1 番目 */
img { position: fixed; top: 2em; left: 4em;
z-index: 1 }
/* p は下から 2 番目(img より上) */
p { z-index: 2 }
/* 無指定の他の要素は一番下の 0 番目(img より下) */
directionプロパティ 'direction' は、任意の要素に指定可能です。セレクタにマッチした対象が生成するボックスの表記方向を指定します。
| プロパティ名 | 値 |
|---|---|
| direction | ltr | rtl | inherit |
'direction' は子要素に継承されます。デフォルトの値は、左から右 (left to right) を意味する ltr です。inherit は、親要素の値を明示的に継承する指定です。
値は継承されませんが、初期値が auto なので、親要素のボックスと同じレイヤー上にフォーマットされます。
アラビア語、ヘブライ語、古い日本語などが右から左の例としてよく知られています。テーブルに指定された場合は、列の並べ方として採用されながら、列に含まれるセルの文字表記方向には依存しません。
時系列のタイトルを持つ列や座標軸が、右から左に向くこともあれば、左から右に向くこともあります(出版物では圧倒的に右向きが多くなりますが、時代を遡ると左向きの比率も高まり、意外と違和感がありませんます)。これは、言語文化の表記方向だけではなく、日時計を太陽に向かって北側から見ると、右から左に進んでいくことや、右利きの文化圏で右から入ってくる(左へ抜けることもあれば、右に戻って退出することもある)ことが定着していたからではないかと思われます。日本では左が上座の左上になりますが、ヨーロッパ文化圏では時計回りの順で右が上座となるそうです。
/* 属性classの値がJapanese_classicのp要素は右から左へ */
p.Japanese_classic { direction: rtl }
unicode-bidiプロパティ 'unicode-bidi' は、任意の要素に指定可能です。セレクタにマッチした対象が従う Unicode の制御双方向アルゴリズムに対する制御を提供します。
| プロパティ名 | 値 |
|---|---|
| unicode-bidi | normal | embed | bidi-override | inherit |
'unicode-bidi' は子要素に継承されません。デフォルトの値は、normal です。inherit は、親要素の値を明示的に継承する指定です。
normalembeddirection' の値が採用されながら、Unicode による暗黙的な指定値が反映される余地が残される。bidi-overridedirection' の値が採用され、Unicode による暗黙的な指定値が反映される余地が残さない。embed の場合は、要素の先頭に LRE (U+202A,'direction: ltr' と等価)又は RLE (U+202B,'direction: rtl' に等価)を追加し、要素の末尾に PDF (U+202C)を追加する
bidi-override の場合は、要素の先頭に LRO (U+202D,'direction: ltr' と等価)又は RLO (U+202E,'direction: rtl' と等価)を追加し、要素の末尾に PDF (U+202C)を追加する
/* 文字方向は右から左
Unicodeの文字方向をdirectionの指定で上書きする */
p { direction: rtl; unicode-bidi: embed" }
次の HTML 文書に対するフォーマット化方法を、ご利用のブラウザで確かめてください。
<p style="direction: rtl; unicode-bidi: embed">ここは p 要素の内容部分です。<em style="direction: rtl; unicode -bidi: embed">ここは emphasized 要素の内容部です。</em> ここは再び p 要素の内容部分です。</p>
表示例:
ここは p 要素の内容部分です。ここは emphasized 要素の内容部です。 ここは再び p 要素の内容部分です。
'direction' と 'unicode-bidi' の例:
文字表記方向のプロパティ。
direction: ltr; unicode-bidi: embed
文字表記方向のプロパティ。
direction: rtl; unicode-bidi: embed
文字表記方向のプロパティ。
direction: ltr; unicode-bidi: bidi-override
文字表記方向のプロパティ。
direction: rtl; unicode-bidi: bidi-override