ボックスモデルとは2

今回もボックスの基本を紹介します。

ボーダー

まず紹介するのはボーダーです。ボーダーとは枠線のことです。

ボーダーを特徴付けるのは、border-color(線の色)・border-style(線の種類)・border-width(線の幅)という3つのプロパティです。試してみましょう。

<div style="width:200px;height:100px;background-color:#aaffff;border-color:#ff0000;border-style:solid;border-width:8px">div</div>
div
border-typeがsolidというのは、ふつうの線です。この場合、赤くて8pxの線になりましたね。

ここでまず、border-typeにどんな値があるのかを紹介しておきます。

solid
ふつうの一本線。
dotted
丸いドットが並んだ線。
dashed
破線。
double
二重線。
inset
中が彫り込まれたような陰影がついた線。
outset
逆に中が飛び出したような陰影がついた線。
groove
彫ったような陰影がついた線。
ridge
飛び出したような陰影がついた線。
none, hidden
ボーダー無し。

ボーダーが無いやつがnoneとhiddenの2種類ある理由はのちに紹介します。また、ブラウザによってはdottedが丸じゃなくて四角だったりします。

気づいたとおもいますが、border-color,border-style,border-widthの3つのプロパティは、上下左右の枠線を一括で指定していました。ちゃんと別々に指定することも可能です。

それぞれ、border-top-color, border-right-color, border-bottom-color, border-left-color・border-top-style, border-right-style, border-bottom-style, border-left-style・border-top-width, border-right-width, border-bottom-width, border-left-widthという計12個のプロパティで表すことができます。

実はborder-color,border-style,border-widthはこれらを一括で指定する意味を持つプロパティです。margin・paddingと同様に、1つなら上下左右一括、2つなら上下と左右、…というように指定できます。例を見てみましょう。

<div style="width:200px;height:100px;background-color:#aaffff;border-color:#ff0000 #0000ff;border-style:double dashed;border-width:6px 8px">div</div>
div

例えばこのように2つを指定したら、上下と左右で別々のボーダーになります。

border-top-color, border-right-color, border-bottom-color, border-left-color

意味

上下左右のボーダーの色。

デフォルト値

currentColor

border-color

意味

ボーダーの色を一括で指定する。

ボーダーの色を1つ~4つスペースで区切って指定する。

border-color系は、初期値がcurrentColorとなっていますね。これは、ボーダーの色が省略された場合は文字色と同じ色になることを示しています。

border-top-style, border-right-style, border-bottom-style, border-left-style

意味

上下左右のボーダーの線の種類。

前述の値の中から1つ。

デフォルト値

none

border-style

意味

線の種類を一括で指定する。

線の種類を1つ~4つスペースで区切って指定する。

border-style系の初期値はnoneです。これはボーダーが無いということです。特に何も書かないとボーダーが出ないのはこのためです。

border-top-width, border-right-width, border-bottom-width, border-left-width

意味

上下左右のボーダーの幅。

長さまたは、thin,medium,thickのいずれか。

デフォルト値

medium

border-width

意味

線の幅を一括で指定する。

線の幅を1つ~4つスペースで区切って指定する。

border-widthは上の例では全てpx指定でしたが、emとかの他の単位も当然全て使えます。また、border-width用に、thin,medium,thickというキーワードも用意されています。これはそれぞれ「細い」「普通」「太い」という意味で、具体的な幅にはこだわらないあいまいな指定です。

さて、ボーダー関係のプロパティはまだあります。例えば、ボックスの左だけボーダーを付けたいと思ったらどうしましょう。border-left-color,border-left-style,border-left-widthの3つのプロパティを使うのがひとつの手ですが、これは長くて面倒です。ということで、1方向に特化して三種類をまとめて指定できるプロパティがあります。それがborder-top,border-right,border-bottom,border-leftです。

これは、対応するborder-width,border-style,border-colorの値を3つ、スペースで区切って好きな順番で指定します。例えば、左だけ枠をつけたければ次のようにします。

<div style="width:200px;height:100px;background-color:#aaffff;border-left:6px solid blue">div</div>
div

border-top, border-right, border-bottom, border-left

意味

ボーダーの一括指定。

border-width, border-style, border-colorの値をスペースで区切って任意の順番で。

これはけっこうよく使います。

そして最後に、borderプロパティを紹介します。これはborder-topなどの4つと対応しているようにも見えますが、実は少し違います。このborderプロパティは、4方全部に同じ枠線を適用したいときに使います。border-topなどと同様に3つの値を並べてやると、4方向の枠が全部一気に指定出来ます。

<div style="width:200px;height:100px;background-color:#aaffff;border:6px solid blue">div</div>
div

borderプロパティでは、2組を指定して上下と左右を分けるとか、そういうことはできません。上下左右全部一括です。

border

意味

ボーダーの一括指定。

border-width, border-style, border-colorの値をスペースで区切って任意の順番で。

ボーダー・パディングとボックスの大きさ

同じ大きさでボーダー有りのボックスとボーダー無しのボックスを比べてみましょう。

<div style="width:200px;height:100px;background-color:#aaffff;margin:10px">ボーダーなし</div>
<div style="width:200px;height:100px;background-color:#aaffff;border:30px solid blue;margin:10px">ボーダーあり</div>
ボーダーなし
ボーダーあり

widthとheightが同じなのに、ボックス全体の大きさが違います。これは、widthやheightの指定がボーダー部分を含まず、内部のコンテンツが実際に表示される部分のみの大きさを指定することになっているからです。

この場合、実際の大きさは、横幅は200px+30px×2=260px, 縦は100px+30px×2=160pxになっています。前回もみたように、パディングがある場合それもwidthやheightの指定には含まれませんので、ボックスの大きさはさらに大きくなります。

しかしこの動作はときには、ボックスの実際の大きさが把握しにくくて不便だったりします。そこで、widthやheightの指定にパディングとボーダーも含めることが可能です。そのためにはbox-sizingプロパティを使います。

box-sizing

意味

widthプロパティ・heightプロパティの幅にどこまで含めるか。

content-box,padding-box,border-boxのいずれか。

デフォルト値

content-box

ベンダープレフィクス

2013年7月現在、Firefoxに必要。(ベンダープレフィクスについては後述)

それぞれの値の意味は以下の通りです。

content-box
従来通りの動作。width・heightは中身の大きさのみで、パディングやボーダーは含めない。
padding-box
パディングは大きさに含めるが、ボーダーは含めない。
border-box
パディングとボーダーを大きさに含める。

例えば上の例では、box-sizing:border-boxを追加してやると大きさが同じになります。試してみましょう。

<div style="width:200px;height:100px;background-color:#aaffff;margin:10px">ボーダーなし</div>
<div style="width:200px;height:100px;background-color:#aaffff;border:30px solid blue;margin:10px;box-sizing:border-box">ボーダーあり</div>
ボーダーなし
ボーダーあり

このように下の例ではwidth・heightがボーダーも含めた指定になり、その分中の領域が小さくされています。

では、さらにパディングも加えたボックスを用意して、3種類の値を並べてみましょう。

<div style="width:200px;height:100px;background-color:#ffffaa;padding:20px;border:20px solid #ff8000;margin:10px;box-sizing:content-box">content-box</div>
<div style="width:200px;height:100px;background-color:#ffffaa;padding:20px;border:20px solid #ff8000;margin:10px;box-sizing:padding-box">padding-box</div>
<div style="width:200px;height:100px;background-color:#ffffaa;padding:20px;border:20px solid #ff8000;margin:10px;box-sizing:border-box">border-box</div>
content-box
padding-box
border-box

どうでしょうか。2013年7月現在、どのブラウザもcontent-boxとpadding-boxが同じになっていますね。本来ならpadding-boxのほうはパディングの20px×2=40pxがwidth・heightに組み入れられてその分だけ小さくなるはずです。

このように、box-sizingではcontent-boxとborder-boxのみ対応が進んでおり、padding-boxは使えない状況になっています。そのため、将来的にpadding-boxは削除されるかもしれないことになっています。padding-boxは使わず、content-boxとborder-boxだけ使うのが無難です。といっても、デフォルトのcontent-boxを明示的に指定する場面は少なく、もっぱらbox-sizing:border-boxの形で使うことが多いでしょう。box-sizingは、ボックス全体の大きさをしっかりと制御できるようになるので便利です。

ボックスの角を丸くする

最後に紹介するのはボックスの角を丸くするためのプロパティです。

それはborder-radiusプロパティです。さっそく例を見てみましょう。

<div style="width:200px;height:100px;background-color:#ffaaff;border-radius:40px">角が丸いボックス</div>
角が丸いボックス

ボックスの形が丸くなっていることが、背景色から分かります。しかし表示領域自体は実は四角いままなので、文字がはみ出てますね。適当にパディングをつけることで中に入れましょう。

<div style="width:200px;height:100px;background-color:#ffaaff;border-radius:40px;padding:30px">角が丸いボックス</div>
角が丸いボックス

この丸い部分は円に沿った形になっています。その円の半径を定めるのがborder-radiusプロパティというわけです。

さて、角は4つありますから、案の定、4つ別々に指定できます。これはmarginやpadding,borderでお馴染みですね。ただし、今回は角ですから、上下左右というわけにはいきません。左上、右上、右下、左下です。それぞれborder-top-left-radius, border-top-right-radius, border-bottom-right-radius, border-bottom-left-radiusプロパティを使います。

例えば、右下だけ丸くするには次のようにします。

<div style="width:200px;height:100px;background-color:#ffaaff;border-bottom-right-radius:40px;padding:30px">角が丸いボックス</div>
角が丸いボックス

実は、今まで角は円でしたが、楕円にもできます。x方向の半径とy方向の半径をスペースで区切って別々に指定するのです。例えば次のようにします。

<div style="width:200px;height:100px;background-color:#ffaaff;border-bottom-right-radius:100px 40px;padding:30px">角が丸いボックス</div>
角が丸いボックス

何かカーブが横長になりましたね。これは横の半径が100px、縦の半径が40pxの楕円にそったカーブになっているのです。

さて、そうなると、最初に紹介したborder-radiusは、4つの角の個々のプロパティを一括で指定する役目をもったプロパティだったということになります。

border-radiusは、marginやpaddingと同様に、1つから4つ指定できて、それぞれの意味は次の通りです。

1つ
4つの角全部
2つ
(左上と右下) (右上と左下)
3つ
(左上) (右上と左下) (右下)
4つ
(左上) (右上) (右下) (左下)

試してみましょう。

<div style="width:200px;height:100px;background-color:#ffaaff;border-radius:40px 30px 20px 10px;padding:30px">角が丸いボックス</div>
角が丸いボックス

4つの角で大きさが違いますね。

ところで、これはどの角もx方向とy方向の半径が同じになっていますね。個別のプロパティでは順に指定することでx方向・y方向を別々に指定できましたが、border-radiusでは方法が違います。border-radiusでは、x方向 / y方向 というように、スラッシュで区切ります。それぞれに1つから4つを指定できます。例えばx方向に2つ、y方向に1つのように数が違っても構いません。これを使って、真円ではなく楕円にしてみましょう。

<div style="width:200px;height:100px;background-color:#ffaaff;border-radius:40px 30px 20px 10px / 20px 40px;padding:30px">角が丸いボックス</div>
角が丸いボックス

これは、左上が40px 20px、右上が30px 40px、右下が20px 20px、左下が10px 40pxというのと同じ意味です。

ちなみに、border-radiusというくらいですから、ボーダーがあるとちゃんと曲線になります。

<div style="width:200px;height:100px;background-color:#ffaaff;border-radius:40px 30px 20px 10px / 20px 40px;border:4px #666666 solid;padding:30px">角が丸いボックス</div>
角が丸いボックス

出典:CSS Backgrounds and Borders Module Level 3 W3C Candidate Recommendation 24 July 2012, CSS Basic User Interface Module Level 3 (CSS3 UI) W3C Working Draft 17 January 2012