CSSでは文書ツリー中の要素から生成されるボックスを基本単位とします。ボックスは下図に示すようにマージン、ボーダー、パディング、内容領域の四つの領域に分かれ、それぞれの外枠を外辺(マージン辺)、ボーダー辺、パディング辺、内辺(内容辺)と言います。マージン、ボーダー、パディングはさらに上下左右の四つに分かれます。
ボックスの高さ、ボックスの横幅は以下のように計算されます。
詳細はボックスのサイズで説明します。
上下左右のマージン幅はmargin-top
プロパティ、margin-bottom
プロパティ、margin-left
プロパティ、margin-right
プロパティで指定します。値は<長さ>、<パーセント値>、"auto
"を取ります。<長さ>には負の値も指定できます。<パーセント値>は包含ブロックの横幅を基準にします。(上下のマージンについてもそうであることに注意してください。)"auto
"の場合は特殊な計算によって算出されます。ボックスのサイズを参照してください。
p {
margin-top: 1em;
margin-bottom: 1em;
margin-left: 20px;
margin-right: 40px
}
margin
プロパティを利用すると、上下左右のマージンを一つのプロパティで指定できます。簡略化プロパティを参照してください。
CSSでは隣接しているマージンが、以下のルールに従って一つにまとめられます。これをマージンの相殺(collapsing margins)と言います。
overflow
プロパティの値が"visible
"以外の要素のマージンは、その内側の通常フローにある子要素とマージンを相殺しない。覚えておきたいのは、基本的にマージンは隣接してさえいれば、親要素と子要素のボックスのマージンでも、また複数のマージンでも相殺が起こるということです。
<div id="boxA">boxA</div>
<div id="boxB">boxB</div>
div#boxA { margin-bottom: 100px }
div#boxB { margin-top: 50px }
この例ではboxAの下マージンとboxBの上マージンが隣接します。そのためマージンが相殺され、マージンは100pxになります。
<div id="boxA">
<div id="boxB">SAMPLE</div>
</div>
div#boxA {
margin-top:100px;
padding: 0;
border-style: none
}
div#boxB { margin-top:50px }
この例ではboxAのパディング、ボーダーが存在しないため、boxAの上マージンとboxBの上マージンが隣接します。そのためマージンが相殺されマージンは100pxになります。
<div id="boxA">boxA</div>
<div id="boxB"></div>
<div id="boxC">boxC</div>
div#boxA { margin-bottom: 20px }
div#boxB {
margin-top: 30px;
margin-bottom: 40px
padding: 0;
border-style: none
}
div#boxC { margin-top: 50px }
この例ではboxBが内容領域、パディング、ボーダを持たず、自身の上下マージンが隣接しています。そのため、boxBの上下マージン、それらと隣接するboxAの下マージン、boxCの上マージンとの間で相殺が起こり、マージンは50pxとなります。
上下左右のパディング幅はpadding-top
プロパティ、padding-bottom
プロパティ、padding-left
プロパティ、padding-right
プロパティで指定します。値には<長さ>、<パーセント値>を指定できます。パーセント値はmaring
プロパティと同じく包含ブロックの横幅を基準にします。
padding
プロパティを使うと上下左右のパディングを一つのプロパティで指定できます。簡略化プロパティを参照してください。
上下左右のボーダーの幅はborder-top-width
プロパティ、border-bottom-width
プロパティ、border-left-width
プロパティ、border-right-width
プロパティで指定します。値には<長さ>を指定しますが、負の値は認められません。また<長さ>の他にキーワード"thin
"、"medium
"、"thick
"を指定できます。"thin
" ≤ "medium
" ≤ "thick
"の順に太くなります。実際にどのような太さになるかはユーザーエージェントの実装に任されています。
border-width
プロパティなら、上下左右のボーダーの幅を一つのプロパティで指定できます。簡略化プロパティを参照してください。
上下左右のボーダーの色はborder-top-color
プロパティ、border-bottom-color
プロパティ、border-left-color
プロパティ、border-right-color
プロパティで指定します。値は<色>に限られます。また、キーワード"transparent
"を指定すると透明になります。何も指定されていないときはcolor
プロパティの算出値を使います。
border-color
プロパティは上下左右のボーダーの色をまとめて指定します。簡略化プロパティを参照してください。
上下左右のボーダーのスタイルはborder-top-style
プロパティ、border-bottom-style
プロパティ、border-left-style
プロパティ、border-right-style
プロパティで指定します。値には以下のキーワードを指定します。初期値は"none
"です。
none
hidden
none
"と同じですが、テーブル関連の要素に指定したときは例外があります。(参考: 17.6.2.1 Border conflict resolution - Tables)dotted
dashed
solid
double
groove
ridge
inset
outset
マージン、パディング、ボーダーの各プロパティには簡略化プロパティが定められています。これを利用すると上下左右のマージン、パディング、ボーダーを一つのプロパティで指定できます。
プロパティ | 簡略化プロパティ |
---|---|
margin-top , margin-bottom , margin-left , margin-right |
margin |
padding-top , padding-bottom , padding-left , padding-right |
padding |
border-top-width , border-bottom-width , border-left-width , border-right-width |
border-width |
border-top-color , border-bottom-color , border-left-color , border-right-color |
border-color |
border-top-style , border-bottom-style , border-left-style , border-right-style |
border-style |
これらの簡略化プロパティは値を一つから四つまで指定できます。値が一つのときは上下左右、二つのときは上下と左右、三つのときは上、左右、下、四つのときは上、右、下、左に各値が対応します。値が四つのときは上から時計回りと覚えておくといいでしょう。
p { padding: 1em } / * 上 = 右 = 下 = 左 = 1em */
p { padding: 1em 2em } /* 上 = 下 = 1em, 左 = 右 = 2em */
p { padding: 1em 2em 3em } /* 上 = 1em, 左 = 右 = 2em, 下 = 3em */
p { padding: 1em 2em 3em 4em } /* 上 = 1em, 右 = 2em, 下 = 3em, 左 = 4em */
プロパティ | 簡略化プロパティ |
---|---|
border-top-width , border-top-color , border-top-style |
border-top |
border-bottom-width , border-bottom-color , border-bottom-style |
border-bottom |
border-left-width , border-left-color , border-left-style |
border-left |
border-right-width , border-right-color , border-right-style |
border-right |
border-top , border-bottom , border-left , border-right |
border |
これらの簡略化プロパティでは、ボーダーの幅、色、スタイルを任意の順番で指定します。指定されなかったものについては初期値が利用されます。スタイルを指定しないと初期値の"none
"が適用され、何も表示されなくなってしまうので注意してください。
h1 {
border-left: 5px solid blue; /* 左ボーダー */
border-bottom: 2px dotted blue /* 下ボーダー */
}