パソコン教室・パソコンスクールISA渋谷STAFF BLOG

カラダとココロがアクティブになれる街★渋谷がもっと楽しくなれるBLOG

こんにちは。

いきなりですが、例えば下図のような左右のカラムが固定で、

中央のカラムが可変というような3カラムのレイアウトを作りたい場合、通常CSSではfloatを使います。

3カラムレイアウト

ただしカラムレイアウトはdisplay: table-cellでも表現できます。
display: table-cellとは、テーブルの構造を表現できるCSSプロパティで
IE8から対応しています。今回はこの2つの方法を比較してみたいと思います。

まず最初にfloatで3カラムレイアウトを表現する場合、下記のようなHTMLとCSSになります。

【HTML】
<div id=”warrper”>
 <div id=”l_navi”>ナビゲーション</div>
 <div id=”content”>
  <div id=”content_inner”>コンテンツ</div>
 </div> 
 <div id=”r_side”>右サイドバー</div>
</div>

【CSS】
#l_navi {
 float: left;
 width: 200px;
 margin-right: -200px;
 background-color: #ff0000;
}

#content {
 float: left;
 width: 100%;
}

#content_inner {
 margin: 0 200px;
 background-color: #ffffff;
}

#r_side{
 float: left;
 width: 200px;
 margin-left: -200px;
 background-color: #009900;
}

上記のようにマイナスマージンを使ったり、真ん中のカラムをdiv要素で余分に囲ったりなど、
結構複雑な記述になります。floatを使っているので、clearも必要になります。
一方、display: table-cellで3カラムレイアウトを表現する場合、下記のようなHTMLとCSSになります。

【HTML】
<div id=”warrper”>
 <div id=”l_navi”>ナビゲーション</div>
 <div id=”content”>コンテンツ</div>
 <div id=”sidebar”>右サイドバー</div>
</div>

【CSS】
#warrper {
 width: 100%;
 display: table;
}

#l_navi, #content, #sidebar {
 display: table-cell;
}

#l_navi {
 width: 200px;
 background-color: #ff0000;
}

#content {
 background-color: #ffffff;
}

#r_side {
 width: 200px;
 background-color: #009900;
}

CSSソースの長さ自体は大して変わりませんが、非常にシンプルな記述になります。
floatを使っている場合に必要だったclearも不要です。

いままではfloatを使って行っていたカラムレイアウトが、このdisplay: table-cellを
使うことによって、よりシンプルに表現できます。
その他、display: table-cellは文字通りtableですので、
カラム内での縦方向の位置vertical-alignも思った通りに作用してくれます。

しかし、残念なのはこのdisplay:table-cell、IE8からしか対応していません。
FirefoxやSafariなど、IE以外の主要なブラウザはこのdisplay: table-cellに
ちゃんと対応しているのですが、現在でもIE6を使っているユーザーが大半なので・・・惜しいですね。

パソコンスクールISA渋谷校/INOUE

この投稿にコメントする

Subscribes to this post comment rss or トラックバック url
mygif_alt
こいわい said, 11月 29th, 2009 at 14:01:32

このレイアウト方法に興味がありまして投稿させていただきました。
floatを使ったCSS表記の意味についてご質問があります。
#l_naviでmargin-right: -200px;にしていること、
#content_innerでmargin: 0 200px;にしていること、
#r_sideでmargin-left: -200px;にいしていること、
以上3つの意味がどうしても分からないんです。なぜこれで中央が可変に出来るのか・・・。
もし時間がありましたら教えていただいてよろしいでしょうか?

mygif
oikawa said, 12月 1st, 2009 at 17:37:01

こいわいさん
コメントありがとうございます。

まず、width:100%;の設定をしているとただfloatしても、
横並びにはなりません。
簡単に説明をすると、
マイナスの設定(-200px)でwidthとマージンの差をゼロにすることで
width:100%;の設定でもfloatすることができます。

また、マージンで赤と緑のコンテンツを-200px設定しているため、
白のコンテンツが重ならないようにしなければなりません。
そこで、白のコンテンツの左右に200pxのマージンを設定しています。

少し難しいですが、
細かく説明をすると、
floatというのは、一つ目のボックス右端の辺と
次のボックスの左端の辺がくっついて続けて表示されるものです。
ただ、この右端の辺の位置はネガティブマージン(マイナス設定のマージン)で変更することができます。

今回は、
#l_naviでmargin-right: -200px;にしていることにより、
実際のボックス#l_naviの右側の辺を左側の辺と同じ位置に移動しています。
これにより、#l_naviと#content_innerが重なっている状態になります。
そのため、コンテンツがかぶってしまうので#l_naviの横幅分、#content_innerをずらします。
それが、
#content_innerでmargin: 0 200px;
になります。

#r_sideも同じです。
#r_sideでmargin-left: -200px;を設定することにより
floatで並べます。
ただ、重なってしまうので
#content_innerでmargin: 0 200px;がされています。
#content_innerが左右にmarginの設定をしている理由です。

少し難しくなってしまいましたね。
スクールでは、このようなマージンやfloatの設定について学習できる講座もご用意しています。
詳しくはこちらをご覧ください。
http://www.isa-school.net/web_dtp/index.html

mygif_alt
こいわい said, 12月 6th, 2009 at 11:42:20

なるほど width:100%;でfloat出来ない為のネガティブマージン設定とレイアウトが重なってしまう為のmargin: 0 200px;設定という事なんですね。
とても参考になりました。ご丁寧に回答いただきましてありがとうございました。

mygif
通行人 said, 2月 12th, 2010 at 19:17:57

旧来のtableレイアウトの方が簡単で早くて、かつブラウザを選ばず、更にトータルのデータ量も少ないと感じました(^_^;)

コメント

Please Note: The comment moderation maybe active so there is no need to resubmit your comment