ボックスには
など、いくつかの種類があります。このページではボックスの種類と、ボックスが設置する包含ブロックの定義について説明します。
ボックスの種類を決めるのがdisplay
プロパティです。値には以下のキーワードを指定します。
block
inline-block
inline-block
の内側はブロックボックスと同じように整形されます。inline
list-item
none
display
プロパティは無視されます。run-in
table
, inline-table
, table-row-group
, table-column
, table-column-group
, table-header-group
, table-footer-group
, table-row
, table-cell
, table-caption
CSSではdisplay
プロパティの値が
block
list-item
table
run-in
(文脈による)である要素をブロックレベル要素と言います。HTMLにも同じ言葉がありますがCSSとは定義が違うので混同しないよう注意してください。
ブロックレベル要素は主要ブロックボックスを生成します(ただし、display:table
である要素を除く)。主要ブロックボックスの中にはブロックボックスかインラインボックスのどちらか一方のみを含むことができます。
主要ブロックボックスはブロック整形文脈に加わります。
以下のような文書があるとします。(div
要素とp
要素はdisplay:block
であると仮定します。)
<div>
ある文章
<p>別の文章</p>
</div>
上に述べたように主要ブロックボックスの中にはブロックボックスかインラインボックスのどちらか一方しか含めることができません。ですから、p要素がブロックボックスを生成するため、その前にある「ある文章」もブロックボックスでなければなりません。そこで、「ある文章」の部分には匿名ブロックボックス(anonymous block box)が生成されると考えます。
こうすることで、div要素のボックスの中にブロックボックスしか存在しない状態にするのです。
匿名ブロックボックスのプロパティは親から継承され、継承しないプロパティについては初期値が使われます。
display
プロパティの値が
inline
inline-table
run-in
(文脈による)である要素をインラインレベル要素と言います。これもまたHTMLのインライン要素とは別物です。
インラインレベル要素はインライン整形文脈に加わります。
以下のような文書があるとします。(p
要素はdisplay:block
、em
要素はdisplay:inline
であると仮定します。)
<p>ある<em>強調された</em>文章。</p>
p
要素は主要ブロックボックスを生成し、em
要素はインラインボックスを生成します。すると、匿名ブロックボックスの場合と同様の理由で「ある」と「文章」もインラインボックスにならなければいけません。そこで、それらを匿名インラインボックス(anonymous inline box)と考え、p
要素のブロックボックスの中をインラインボックスだけの状態にします。
匿名インラインボックスのプロパティも、継承可能なものは親から継承され、不可能なものは初期値が利用されます。
display
プロパティがrun-in
のボックスはランインボックス(run-in box)と呼ばれます。ランインボックスは状況に応じてブロックレベルボックスかインラインレベルボックスになります。
ランインボックスは通常のボックスと同じように、ソース文書上の親要素からプロパティを継承します。
<dl>
<dt>ランインボックス</dt>
<dd>状況によってブロックボックスにも
インラインボックスにもなるボックス。<dd>
<dl>
dl, dd { display: block }
dt { display: run-in }
dt:after { content: ": " }
この例では、ランインボックスの後続がブロックボックスであるため、ランインボックスはインラインボックスになります。
ボックスの位置やサイズは包含ブロック(containing block)と呼ばれる矩形領域を基準に計算されることがあります。例えばwidth
プロパティの<パーセント値>は包含ブロックの横幅を参照します。また、絶対位置決めされたボックスは包含ブロックを基準に配置されます。包含ブロックの定義を知らなければposition
プロパティを使いこなせないでしょう。包含ブロックの定義を理解しておくことは非常に重要です。
包含ブロックの定義は以下の通りです。
position
プロパティが"static
"か"relative
"である要素の場合、直近の祖先であるブロックレベル要素、セル要素、インラインブロック要素のボックスの内辺を包含ブロックとする。position
プロパティが"fixed
"である要素の場合、「連続」グループのメディアなら表示域の長方形、「ページ」グループのメディアならページボックスを包含ブロックとする。position
プロパティが"absolute
"である要素の場合、直近の祖先でposition
プロパティが"absolute
"か"relative
"か"fixed
"である要素によって包含ブロックが設置される。
direction:ltr
の場合。direction:rtl
なら左右が逆になる。)以上の定義を表にしてまとめると次のようになります。
要素 | 定義 |
---|---|
ルート要素 | 表示域の長方形 |
position:normal |
直近の祖先であるブロックレベル要素、セル要素、インラインブロック要素のボックスの内辺 |
position:relative |
|
position:absolute |
直近の祖先でposition プロパティが"absolute "か"relative "か"fixed "である要素のパディング辺。該当する要素がなければ初期包含ブロック。 |
position:fixed |
表示域の長方形 |
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<link rel="stylesheet" href="style.css" type="text/css" media="screen,print">
<title>包含ブロックの説明</title>
</head>
<body>
<p id="p1"><em id="em1">最初</em>の段落です。</p>
<div id="div1">
<p id="p2"><em id="em2">2番目</em>の段落です。</p>
</div>
</body>
</html>
html, body, p, div {
display: block
}
em { display: inline }
em#em1 { position: absolute }
div#div1 { position: relative }
em#em2 { position: absolute }
この例では、まずhtml
要素によって初期包含ブロックが設置されます。その他、position
プロパティが"static
"(初期値)か"relative
"である要素は、最も近い祖先のブロックボックスを包含ブロックとします。ただし、position:absolute
であるem#em1
は、position
プロパティが"static
"でない要素が祖先に存在しないため、初期包含ブロックを包含ブロックとします。em#em2
はposition:relative
であるdiv#div1
のボックスのパディング辺を包含ブロックとします。
要素 | 包含ブロック |
---|---|
html |
初期包含ブロック |
body |
html |
p#p1 |
body |
em#em1 |
初期包含ブロック |
div#div1 |
body |
p#p2 |
div#div1 |
em#em2 |
div#div1 |