CSS「display: table」と「display: table-cell」で出来ること
IE8は「display: table-cell」に対応
「display: table-cell」とは、テーブルの構造を表現することができるCSSプロパティです。先日公開されたベータ版(IE8 Beta1)で確認しましたが、IE8からは「display: table-cell」に対応しているようです。
そこで、今回はこの「display: table-cell」を使うことで、どんなことが出来るのかを見ていきたいと思います。
「float」と「display: table-cell」でのカラムレイアウトを比較
左右のカラムが固定で、中央のカラムが可変というような3カラムのレイアウトを表現したい場合、CSSでは通常「float」を使います。カラムレイアウトは「display: table-cell」でも表現できますので、この2つの方法を比較してみたいと思います。
「float」を使った従来の3カラムレイアウト
「float」で3カラムレイアウトを表現する場合、下記のようなHTMLとCSSになります。
HTML
<div id="body">
<div id="navigation">navigation</div>
<div id="content">
<div id="content-inner">content</div>
</div>
<div id="sidebar">sidebar</div>
</div>
CSS
#navigation {
float: left;
width: 200px;
margin-right: -200px;
background-color: #FFCC66;
}
#content {
float: left;
width: 100%;
}
#content-inner {
margin: 0 200px;
background-color: #CC6633;
}
#sidebar{
float: left;
width: 200px;
margin-left: -200px;
background-color: #FF9966;
}
ネガティブマージン(マイナスマージン)を使ったり、真ん中のカラムをdiv要素で余分に囲ってやらなければと、結構複雑な記述になります。floatを使っているので、clearもしないといけません。
「display: table-cell」を使ったシンプルな3カラムレイアウト
「display: table-cell」で3カラムレイアウトを表現する場合、下記のようなHTMLとCSSになります。
HTML
<div id="body">
<div id="navigation">navigation</div>
<div id="content">content</div>
<div id="sidebar">sidebar</div>
</div>
CSS
#body {
width: 100%;
display: table;
}
#navigation, #content, #sidebar {
display: table-cell;
}
#navigation {
width: 200px;
background-color: #FFCC66;
}
#content {
background-color: #CC6633;
}
#sidebar {
width: 200px;
background-color: #FF9966;
}
- サンプル:「display: table-cell」を使った3カラムレイアウト
※IE8 Beta、Firefox2、Safari2、Opera9などで見てください
CSSソースの長さ自体は大して変わりませんが、パッと見でなにをしているかわかるぐらい非常にシンプルな記述になります。floatを使っている場合に必要だったclearもいりません。
いままではfloatを使って行っていたカラムレイアウトが、この「display: table-cell」を使うことによって、よりスマートに表現できるのです。
「display: table-cell」で縦方向に対する高さを揃える
「display: table-cell」には、もうひとつ利点があります。「display: table-cell」は、文字通り「table」ですので、CSSでは再現しにくい、縦方向に対する高さを揃えることが出来ます。そして「table」ですので、カラム内での縦方向の位置「vertical-align」も思った通りに作用してくれます。
- サンプル:「display: table-cell」で縦方向に対する高さを揃える
※IE8 Beta、Firefox2、Safari2、Opera9などで見てください
3カラムの高さがバラバラに設定してありますが、最大の100pxに揃っています。そして、カラム内での縦方向の位置も表現できています。
「display: table-cell」が使えるのは数年後?
「display: table-cell」を使うことで、CSSで出来る表現が広がります。table要素で記述した方が良い部分まで「display: table-cell」で記述する必要はありませんが、カラムレイアウトの表現に活躍してくれそうです。
しかし、惜しむらくはIE8からしか対応していないということです。2008年4月現在でさえIE6を使っている方が大勢いることを考えると、この「display: table-cell」が活躍するのはだいぶ先の話になりそうです。
Firefox2やSafari2など、IE以外の主要なブラウザがこの「display: table-cell」にちゃんと対応していることを考えると、ホント「Fuck IE!」と叫びたくなります。
余談:「display: table-cell」でこんな事も出来ました
「display: table-cell」を色々いじっていたら、こんな事も出来ました。なんか不思議な感じですが「display: table-cell」以外でも表現できるのでしょうか。
- サンプル:「display: table-cell」でこんな事も出来ました
(※IE8 Beta、Firefox2、Safari2、Opera9等で見てください)
-
Anonymous
2009年5月 8日 16:26 table-cellで検索かけたら見つけたのですが、参考になりました!
余談のところですが、66%と33%で、残りの1%はどこへ行ってしまったのでしょう・・・?-
小川貴史
2009年5月 8日 16:27 こんにちは。
>余談のところですが、66%と33%で、残りの1%はどこへ行ってしまったのでしょう・・・?
美しい蝶になってどこかへ飛んでいってしまいました。…ええと、2:1にしたいために割りきれる数にしました。
100%になっていないので、画面を横にすごくすごーく広げると途中で切れてしまいます。
しかしそこまで画面を広げる事はないだろうと、このようにしました。-
Dhykatti
2009年5月 8日 16:28 ちょうど今ブログデザインを変更中で、table-cellを使用しています。
IE7以前に対応させるのも面倒だったので、8から対応という知らせはうれしいです。―でなければ、Firefox / Opera限定のブログになるところでした^^;
参考にさせていただきます!-
小川貴史
2009年5月 8日 16:29 こんにちは。
table-cellは便利ですねー。ただ、IE8は次期Windowsと同時リリースの予定らしいので、あと1年ほど待たないと行けませんけどね。-
uupaa
2009年7月 6日 23:23 はじめまして。
display: table-cell の実装で悩んでいたときに、大変参考になりました。とてもわかりやすいエントリーですね。-
小川貴史
2009年7月 7日 10:38 こんにちは。Twitterでも流されていた方ですね。
参考にしていただいたようで何よりです。
「uuAltCSS.js」いいですねー。-
kl
2012年1月24日 18:35 「Fuck IE!」じゃなくて「Fuck IE6-7使っている人!」ですね?
-
天
2012年4月 3日 21:35 display: table-cell;
は、div以外には適用できないのでしょうか?-
小川貴史
2012年4月 4日 10:32 p要素でもspan要素でも、他のプロパティと同じくできると思いますよ。サンプルを変更して、実際に試してみてください。
- このエントリーのトラックバックURL
- http://www.ibnet.ne.jp/mt/mt-tb.cgi/977