First step CSS の Section 9 で,CSS では要素はボックスという長方形の領域に配置されることを説明した。これまでマージン,枠,パディングといったボックスに関係する属性がたくさん出てきたが,これらを整理してボックスという概念を明らかにしていこう。
今まで見てきたボックスに関する属性を総合すると,図 12.1 のようになる。要素のすぐ外をパディングがとりまき,その外に枠があって,マージンがとられている,という層状になっている。
背景色が適用されるのは枠を含めてその内側で,マージンの部分はつねに“透過色”である。
ここで注意したいのは,ボックスの大きさは要素の大きさ以上になるということである。
ボックスの幅は次のように定義される。
(box width) = (margin-left) + (border-left-width) + (padding-left) + (width) + (padding-right) + (border-right-width) + (margin-right)
width は要素の内容の幅である。
いっぽう,ボックスの高さは,
(box height) = (margin-top) + (border-top-width) + (padding-top) + (height) + (padding-bottom) + (border-bottom-width) + (margin-bottom)
と定義できる(height は要素の内容の高さ)が,次に説明するマージンの圧縮でボックスどうしが垂直方向に重なり合う場合がある。
通常のブロック要素ではマージンが狭くなることがあるというのは First step CSS の Section 10 で触れた。通常のブロック要素が上下に並置されたとき,その間のマージンは上の要素のボトムマージンと下の要素のトップマージンの和にはならず,それらの最大値がとられるというものである。
このようなマージンの圧縮は,上下に並置されたとき以外に,マージンを持つブロック要素の中にマージンを持つブロック要素が入れ子になったときにも起こる。ただし,この場合は無条件ではなく,一定の条件の下でしか圧縮は起こらない。
外側のブロック要素に枠,パディングの両方とも指定されていないとき,その要素のトップマージンとその内側のもっとも上にある要素のトップマージンの最大値がその部分のトップマージンになる。ボトムマージンについても同様である。ただし,外側の要素に枠もしくはパディングが指定されている場合はこのようなマージンの圧縮は起こらない。
たとえば,次のように指定がされていたとする。
BODY { margin: 1pc; }
P { margin: 6pt; }
このとき <BODY> の最上部から <P> の内容の上端までのマージンは 1[pc]+6[pt]=18[pt](1[pc]=12[pt])にはならず,1pc と 6pt の大きい方,すなわち 1pc がとられる。
このようなことから,3 つ以上の直接隣り合った垂直マージンから圧縮が起こる場合もある。
<P STYLE="margin: 10pt;">ブロック要素 1</P>
<DIV STYLE="margin: 20pt;">
<P STYLE="margin: 5pt;">ブロック要素 2</P>
</DIV>
このときの最初の <P> と <DIV> の中にある <P> との間隔はいくらになるだろうか。実際に出力させてみよう。
ブロック要素 1
ブロック要素 2
これは明らかに合計の 35pt より少ない。3 つのマージン(10pt,20pt,5pt)が枠やパディングを隔てずに隣り合っていて,そのため圧縮が起こり 20pt が間隔になっているのである。
まとめると,マージン部分は垂直に隣り合っているときは重ねてよいのである。だがマージンと枠,マージンとパディングは重ねてはならないのである。
マージンの圧縮は垂直マージンでのみ起こり,水平マージンは圧縮されない。さきほどの例では,<DIV> の中の <P> の水平マージンは 25pt になっているはずである。また,通常のブロック要素以外ではマージンはつねにそのまま適用され,隣り合ったら和になる。
このようなマージンの圧縮を行うのは,このほうが往々にして美しく配置されるからである。
ちなみに,負のマージンが含まれていたときの処理であるが,正のマージンの最大値から負のマージンの最小値(絶対値がもっとも大きい負のマージン)が差し引される。正のマージンがないときは,最小の負のマージンが適用される。
IE4/5 パディングや枠が指定されていてもマージンの圧縮が起こってしまう。
IE3 マージンに関する解釈の違いがあることを再び触れておく。
NN4 マージンの圧縮が正しく行われないことがある。