ボックスモデル

CSSのボックスモデルは文書ツリー内の各要素に拠って生成され,視覚整形モデルに従って配置されます。ボックスはテキストや画像などの内容領域を持ち,その周囲にはさらに四つの周辺領域を持つことがあります。

目次

ボックスの概要と寸法

文書ツリーにある各要素はボックス(box)と呼ばれる矩形領域を生成します。各ボックスは,テキストや画像などの内容領域を持ち,その周囲には更にパディング,ボーダー,マージンという順に “周辺領域” を持つことがあります。以降ではこれら領域について概説します:

【図】ボックスモデルの概念.
マージン(margin)

ボックスの最も外側にある餘白部分をマージンと呼びます。

要素に指定された背景はこの領域には適用されず,常に透明になります(親ボックスの背景が透けて見える)。また,隣接するブロック間の垂直マージンは時により相殺されます。

ボーダー(border)

パディングの外側にある枠の領域部分をボーダーと呼びます。

ボーダーはすべて,ボックスの背景の上に重ねて描かれます。従ってこの領域の背景は,が透明で見えるときか,スタイルが点線・破線・二重線のときに隙間から覗き見えるだけです。

パディング(padding)

ボーダーと内容領域の間にある空間の詰物をパディングと呼びます。

要素に指定された背景はこの領域面にも及び,背景画像はこのを参照して配置されます。

内容領域(content area)

テキストや画像などがレンダリングされる内容領域です。要素の背景はこの領域面にも及びます。

内容領域の寸法――すなわち内容幅(content width)および高さ(content height)はいくつかの要因で決ります。たとえばブロック要素もしくは置換要素であれば,その寸法は 'width' および 'height'プロパティで与えられます。(see 下記資料)。

非置換インライン要素では,内容幅を表現済み内容と同じくし,内容の高さはフォントサイズに基かれます。

マージン,ボーダー,パディングはそれぞれ上(*-top),右(*-right),下(*-bottom),左(*-left)の四つに区分されます。

補足:非置換インライン要素の分割とその周辺領域について

インラインボックスがひとつの行に収り切らない場合,それらは幾つかのボックスに分割されます。すなわち,それらのボックスは幾つかの行にまたがって分配されます。その分割が生じる左/右の境界面では,各周辺領域の視覚効果は現れません。

従って左右の各周辺領域は,先頭にある分割ボックスの左側,最後にある分割ボックスの右側に描かれます('direction: ltr' の場合)。上下のボーダーとパディングは各行内にある分割ボックスで上下に描かれ,上下マージンは効果を持ちません。

(参考資料:ブロック要素とインライン要素 - Web標準化Tips Web標準普及プロジェクト

行の高さは 'line-height' の計算で決りますが,非置換ボックスの各周辺領域は使用されません。

〔補足終了〕

参考

(餘談:"content area" を “コンテン” と称する人もいます。しかし一つのボックスに対して "content area" は常に一つなので,単数形で “コンテン” と表記せねばなりません。抑々カタカナで単数と複数を遣い分けるのもおかしいので,当サイトでは一貫して "内容" または "内容領域" と呼びます。)

(edges)

内容領域と各周辺領域の境界線を辺(edge)と呼び,各ボックスは四種類の辺を持ちます:

内容辺(content edge)あるいは内辺(inner edge)
ボックスの寸法計算で与えられる内容領域をかこむ辺; しばしば要素の表現済み内容に依存。
パディング辺(padding edge)
ボックスのパディングをかこむ辺。パディングに幅がないなら,パディング辺および内容辺は同じ。
ボーダー辺(border edge)
ボックスのボーダーをかこむ辺。ボーダーに幅がないなら,ボーダー辺およびパディング辺は同じ。
マージン辺(margin edge)あるいは外辺(outer edge)
ボックスのマージンをかこむ辺。マージンに幅がないなら,マージン辺およびボーダー辺は同じ。

各辺はそれぞれ上(top),右(right),下(bottom),左(left)の四部分に区分されます。

CSS2.1仕様ではより明確な概説のために,これら四種類の辺を取囲む矩形をそれぞれ内容ボックス(content box)パディングボックス(padding box)ボーダーボックス(border box)およびマージンボックス(margin box)と呼びよう,正式に定めました。

マージンのプロパティ

ボックスを構成するマージン領域の幅を指定するプロパティで,あらゆる要素に適用可能です。簡略表記プロパティの 'margin' は四つの側(上,右,下,左)のマージン幅を一括して指定でき,それ以外のプロパティは各々決った部分のマージン幅のみを指定します。

マージンの各プロパティは <margin-width> を参照し,これは以下の何れか一つを指定します:

<length>

マージンを定数長で指定する。負の値も指定可能。

<percentage>

マージンを包含ブロック横幅に対する割合とする。負の値も指定可能。

これはたとい 'margin-top' や 'margin-bottom' の場合でも,横幅を参照します。

auto

他のかかわるプロパティとの兼ね合いで,マージンを算出する。下記参照。

負の値は不正ではありませんが,実装上は値に特定の制限範囲が生じる事もあります。

【註】:おなじ内容の文字列を負のマージンで少しづつずらし重ねて,影文字を作りだすようなトリックを使わないでください。制作者スタイルが無効であれば,無意味な繰返しにしか見えません。また,非視覚系(音声出力や点字出力)UAの利用者を混乱させます。

'auto' 算出の概略

インライン要素またはフロート要素なら,あらゆるマージン指定値 'auto' の算出値は,常に '0' になります。

通常の流れにあるブロックレヴェル要素であれば,各マージンの 'auto' は以下のように算出されます:

この値の効果についての詳細はCSS2勧告邦訳 10.3および10.6,そして附録:CSS2.1の整形モデルを参照のこと。

参考

マージンの相殺(Collapsing margins)

相互に隣り合っているか入れ子関係にある複数のボックス間において,(その間が空でない内容,パディングもしくはボーダーで隔てられずに)隣接するマージン同士が結合してひとつのマージンになることを「マージンが相殺される」(collapsing margins)と謂います。

水平マージンは相殺されません。垂直マージンは以下の条件に依って異ります:

次のリストからは,CSS2.1仕様において新たに追加され,明確にされた条件です:

CSS2.1ではさらに精しい相殺の条件が明確にされています。(see CSS21-8.3.1マージンの相殺

margin-topmargin-right
margin-bottommargin-left

プロパティの解説
<margin-width> | inherit
初期値0
適用要素あらゆる要素(以降は除外; 表の行・行グループ類・列・列グループ・セル要素)
継承性なし
パーセント値包含ブロックの横幅に対する割合
メディアグループvisual

各プロパティはそれぞれ,各側のマージンについてを個別に指定します。使用例

これらは次節で述べる簡略表記プロパティによって,一括した指定もできます。

margin(マージンの簡略表記プロパティ)

プロパティの定義
<margin-width>{1,4} | inherit
初期値個別のプロパティを参照
適用要素あらゆる要素(以降は除外; 表の行・行グループ類・列・列グループ・セル要素)
継承性なし
パーセント値包含ブロックの横幅に対する割合
メディアグループvisual

これは簡略表記プロパティであり,四部分のマージンについてを一括して指定できます。使用例

各値は空白類文字で区切って複数指定が可能です。指定数により次のようになります:

値が1つの場合値1:上下左右
値が2つの場合値1:上下,値2:左右
値が3つの場合値1:上,値2:左右,値3:下
値が4つの場合値1:上,値2:右,値3:下,値4:左

パディングのプロパティ

ボックスを構成するパディング領域の幅を指定するプロパティで,あらゆる要素に適用可能です。簡略表記プロパティの 'padding' は四つの側(上,右,下,左)のパディング幅を一括して指定でき,それ以外のプロパティは各々決った部分のパディング幅のみを指定します。

パディングの各プロパティは <padding-width> を参照し,これは以下の何れか一つを指定します:

<length>

パディングを定数長で指定する。負の値は不正。

<percentage>

パディングを包含ブロック横幅に対する割合とする。負の値は不正。

これはたとい 'padding-top' や 'padding-bottom' の場合でも,横幅を参照します。

padding-toppadding-right
padding-bottompadding-left

プロパティの定義
<padding-width> | inherit
初期値0
適用要素あらゆる要素(以降は除外; 表の行・行グループ類・列・列グループ要素,結合ボーダーモデルの表)
継承性なし
パーセント値包含ブロックの横幅に対する割合
メディアグループvisual

各プロパティはそれぞれ,各側のパディングについてを個別に指定します。使用例

これらは次節で述べる簡略表記プロパティによって,一括した指定もできます。

padding(パディングの簡略表記プロパティ)

プロパティの解説
<padding-width>{1,4} | inherit
初期値個別のプロパティを参照
適用要素あらゆる要素(以降は除外; 表の行・行グループ類・列・列グループ要素,結合ボーダーモデルの表)
継承性なし
パーセント値包含ブロックの横幅に対する割合
メディアグループvisual

これは簡略表記プロパティであり,四部分のパディングについてを一括して指定できます。使用例

各値は空白類文字で区切って複数指定が可能です。指定数により次のようになります:

値が1つの場合値1:上下左右
値が2つの場合値1:上下,値2:左右
値が3つの場合値1:上,値2:左右,値3:下
値が4つの場合値1:上,値2:右,値3:下,値4:左

ボーダーのプロパティ

ボックスを構成するボーダー領域の幅・色・種類を設定するプロパティで,あらゆる要素に適用可能です。

ボーダーの幅

ボーダーの幅は <border-width> を参照し,これは以下の何れか一つを指定します:

thin, medium, thick

ボーダー幅をそれぞれUA依存の解釈で,細め・通常・太めにする。

これらは少くとも thin ≤ medium ≤ thick の関係は保持される。

<length>

ボーダー幅を定数長で指定する。負の値は不正。

border-top-widthborder-right-width
border-bottom-widthborder-left-width

プロパティの定義
<border-width> | inherit
初期値medium
適用要素あらゆる要素(以降は除外; 分離ボーダーモデルの表内のうち,行・行グループ類・列・列グループ要素)
継承性なし
パーセント値受けつけない
メディアグループvisual

各プロパティはそれぞれ,各側のボーダー領域についてを個別に指定します。

次節で述べる簡略表記プロパティによって,これら各側は一括して指定できます。

使用例

border-width

プロパティの解説
<border-width>{1,4} | inherit
初期値個別のプロパティを参照
適用要素あらゆる要素(以降は除外; 分離ボーダーモデルの表内のうち,行・行グループ類・列・列グループ要素)
継承性なし
パーセント値受けつけない
メディアグループvisual

これは簡略表記プロパティであり,四部分のボーダー領域についてを一括指定します。

各値は空白類文字で区切って複数指定が可能です。指定数により次のようになります:

値が1つの場合値1:上下左右
値が2つの場合値1:上下,値2:左右
値が3つの場合値1:上,値2:左右,値3:下
値が4つの場合値1:上,値2:右,値3:下,値4:左
使用例

ボーダーの色

border-top-colorborder-right-color
border-bottom-colorborder-left-color

プロパティの定義
<color> | transparent | inherit
初期値'color'プロパティの値
適用要素あらゆる要素(以降は除外; 分離ボーダーモデルの表内のうち,行・行グループ類・列・列グループ要素)
継承性なし
パーセント値受けつけない
メディアグループvisual

これらプロパティはそれぞれ,各側のボーダーについて色を個別に指定します。

各値は以下のような意味を持ちます:

<color>

色の値は,キーワードかRGB数値のどちらかで指定する。

transparent

ボーダー領域を透明にするが,ボーダー幅は確保される

次節で述べる簡略表記プロパティによって,これら各側は一括して指定できます。

使用例

border-color

プロパティの解説
<color>{1,4} | transparent | inherit
訂正された値[<color> | transparent]{1,4} | inherit
初期値個別のプロパティを参照
適用要素あらゆる要素(以降は除外; 分離ボーダーモデルの表内のうち,行・行グループ類・列・列グループ要素)
継承性なし
パーセント値受けつけない
メディアグループvisual

これは簡略表記プロパティであり,四部分のボーダーについて色を一括指定します。

各値は以下のような意味を持ちます:

<color>

色の値は,キーワードかRGB数値のどちらかで指定する。

transparent

ボーダー領域を透明にするが,ボーダー幅は確保される

各値は空白類文字で区切って複数指定が可能です。指定数により次のようになります:

値が1つの場合値1:上下左右
値が2つの場合値1:上下,値2:左右
値が3つの場合値1:上,値2:左右,値3:下
値が4つの場合値1:上,値2:右,値3:下,値4:左

【註】:CSS2仕様では 'transparent' と他の値は併用不可; 正誤表およびCSS2.1仕様では訂正済み。

使用例

ボーダーの種類

ボーダーの種類は <border-style> を参照し,これは以下の何れか一つを指定します:

none

ボーダーなし(幅もゼロ)。表を 'border-collapse:collapse' にするなら,内部の競合で最劣位になる。

hidden

'none' とほぼ同じ。ただし表を 'border-collapse:collapse' にするなら,内部の競合で最優位になる。

dotted, dashed

ボーダーは点線・破線になる; 線と線の隙間部分からはその要素の背景が見える。

solid, double

ボーダーは実線・二重の実線になる; 二重線の間からはその要素の背景が見える。

('double' の描画は,二本の実線とその間にある空白の合計幅が 'border-width' と等価になる。)

groove, ridge

ボーダーのそれは恰も,カンヴァスに彫込まれたかのごとく・カンヴァスから隆起したかのごとく描かれる。

inset, outset

ボックス自身が恰も,カンヴァスに窪んだかのごとく・カンヴァスから盛り上ったかのごとくボーダーを見せる。

ただし表を 'border-collapse:collapse' にするなら,内部の表構成でそれぞれ 'groove' と 'ridge' と同じ。

ボーダーはすべてボックスの背景の上に重ねて描かれます。しかし,ボーダーから背景が見える場合もあります: たとえば 'dotted', 'dashed', 'double' で描かれる線と線の間から覗見える部分,そして 'border-color' の値が 'transparent' であるときのボーダー領域。

値として 'groove','ridge','inset','outset' が指定された場合,その描画はその要素が持つボーダー色に依存しますが,UAは自身のアルゴリズムで実際の色を選択できます。たとえばボーダー色が 'silver' なら,白から暗い灰までの濃淡で勾配を表現できます。

CSS2.0以前の適合性では,'none' と 'hidden'以外のこれらを 'solid' として解釈してもよい,とされています。

border-top-styleborder-right-style
border-bottom-styleborder-left-style

プロパティの解説
<border-style> | inherit
初期値none
適用要素あらゆる要素(以降は除外; 分離ボーダーモデルの表内のうち,行・行グループ類・列・列グループ要素)
継承性なし
パーセント値受けつけない
メディアグループvisual

各プロパティはそれぞれ,各側のボーダー領域について種類を個別に指定します。

次節で述べる簡略表記プロパティによって,これら各側は一括して指定できます。

使用例

border-style

プロパティの解説
<border-style>{1,4} | inherit
初期値個別のプロパティを参照
適用要素あらゆる要素(以降は除外; 分離ボーダーモデルの表内のうち,行・行グループ類・列・列グループ要素)
継承性なし
パーセント値受けつけない
メディアグループvisual

これは簡略表記プロパティであり,四部分のボーダー領域について種類を一括指定します。

各値は空白類文字で区切って複数指定が可能です。指定数により次のようになります:

値が1つの場合値1:上下左右
値が2つの場合値1:上下,値2:左右
値が3つの場合値1:上,値2:左右,値3:下
値が4つの場合値1:上,値2:右,値3:下,値4:左
使用例

ボーダーの簡略表記プロパティ

border-topborder-right
border-bottomborder-left

プロパティの解説
[<'border-top-width'> || <'border-style'> || <color>] | inherit
訂正された値[<border-width> || <border-style> || <'border-top-color'>] | inherit
初期値個別のプロパティを参照
適用要素あらゆる要素(以降は除外; 分離ボーダーモデルの表内のうち,行・行グループ類・列・列グループ要素)
継承性なし
パーセント値受けつけない
メディアグループvisual

これらは簡略表記プロパティで,各側のボーダーについて種類を一括して指定します。

三つの値(種類)のうち何れか一つ以上の値を,順不同に空白類文字で区切って指定します。これらプロパティを用いると,該当する側にかかわるボーダーの各プロパティはすべて初期値にリセットされ,それから指定値にわりあて直されます。

<border-width> の値が省略されても,幅の初期値は 'medium' なので,ボーダーは描かれます。

<border-style> の値が省略された場合,種類の初期値は 'none' なので,そのほかの値が設定されていてもボーダーは描かれません。この場合ボーダーを描かせるためには,個別プロパティによりボーダーの種類を上書き指定する必要があります。

<'border-top-color'> が省略された場合,'color'プロパティの値が初期値として用いられます。

【註】:CSS2仕様では 'transparent' の指定が不許可; 正誤表およびCSS2.1仕様では訂正済み。

使用例

border

プロパティの解説
[<'border-width'> || <'border-style'> || <color>] | inherit
訂正された値[<border-width> || <border-style> || <'border-top-color'>] | inherit
初期値個別のプロパティを参照
適用要素あらゆる要素(以降は除外; 分離ボーダーモデルの表内のうち,行・行グループ類・列・列グループ要素)
継承性なし
パーセント値受けつけない
メディアグループvisual

このプロパティは簡略表記プロパティで,四部分のボーダーをおなじ種類に設定します。'margin''padding' とは異り,'border'プロパティでは各側を別々に設定できないので,そうしたい場合,ほかの個別プロパティを用いる必要があります。

三つの値(種類)のうち何れか一つ以上の値を,順不同に空白類文字で区切って指定します。この簡略表記プロパティを用いると,まづボーダーにかかわる各プロパティはすべて初期値にリセットされ,それから指定値にわりあて直されます。

<border-width> の値が省略されても,幅の初期値は 'medium' なので,ボーダーは描かれます。

<border-style> の値が省略された場合,種類の初期値は 'none' なので,そのほかの値が設定されていてもボーダーは描かれません。この場合ボーダーを描かせるためには,個別プロパティによりボーダーの種類を上書き指定する必要があります。

<'border-top-color'> が省略された場合,'color'プロパティの値が初期値として用いられます。

【註】:CSS2仕様では 'transparent' の指定が不許可; 正誤表およびCSS2.1仕様では訂正済み。

使用例
  • 'transparent' に対応したUAでは,ボーダー領域が(幅は確保されたまま)透明になります。
    div { border: dashed 1em transparent; background: #eee url(stripe.png); }
  • :hover疑似クラスに対応していれば,カーソルを重ねるとボーダーが見えるようになります。
    div:hover { border-color: #888; }