段組みレイアウトのCSS解説
解説第四弾です。
本コンテンツは、以下のページのHTML/CSSソースを解説しています。
- CSS段組レイアウト雛型(レイアウトテンプレート)
http://d.hatena.ne.jp/chaichanPaPa/20090214/1234611010 - サンプルページ
http://chaichan.lolipop.jp/src/sright.htm
今回は、段組みレイアウトのCSS解説です。
段組みレイアウトは、floatプロパティやpositionプロパティを使う方法がありますが、今回はfloatプロパティを使います。
また、本ソースは「Summary layout」と「detail layout」分けてあり、今回は 「Summary layout」の所を解説します。
尚、本コンテンツを読みこなすには、スタイルシートの基本的な知識が必要です。
また、スタイルシートのリファレンスで調べないとならないかもしれません。
以下は、そんな人のための『スタイルシート概説リファレンス』です。
今回解説のソース引用
<style type="text/css"> /*--- Summary layout ---*/ * { margin:0; padding:0; border-width:0; } body { text-align:center; } #main_container { width:96%; margin-left:auto; margin-right:auto; margin-top:1em; text-align:left; } #header_container { background-color:#ffffcc; } #menubar_container { background-color:#eeffff; } #contents_container { background-color:#ccccff; width:100%; clear:left; margin-right:-200px; /* margin-left:-200px; */ float:left; /* float:right; */ } #for_ie_wrapper { margin-right:200px; /* margin-left:200px; */ } #sidebar_container { background-color:#ffcccc; width:200px; float:left; } #footer_container { background-color:#ccffcc; width:100%; clear:both; }http://d.hatena.ne.jp/chaichanPaPa/20090214/1234611010
まず、はじめにすべての要素のマージンとパディングとボーダー(margin:0; padding:0; border-width:0;)をなし(ゼロ)にします。
これは、スタンダードモードとクワークスモードで同じように表示(レイアウト)させるためのもので、クワークスモードでは、本来のwidthとheightの長さに対して、パディングとボーダーの長さが余分に加算されるので、値をゼロにするわけです。
あと、マージンまでゼロにするのは、マージンがあるとレイアウトの計算に誤差が発生し、予想不可能な事態になったり、まぁ、ゼロにしとくとなにかとレイアウトがし易いのです。
* { margin:0; padding:0; border-width:0; }
つぎに、body要素に対して「text-align:center;」をします。
これは、IE対策で、これをしないとIEでは、子要素のブロックレベル要素をセンタリングしません・・・。
body { text-align:center; }
「#main_container」では、横幅(width)を96%にして、左右マージンを自動(auto)にし、本要素をセンタリングします。
「text-align:left;」をしているのは、IE対策で、body要素に対して「text-align:center;」をしているのを元にもどしています。
#main_container { width:96%; margin-left:auto; margin-right:auto; margin-top:1em; text-align:left; }
これは、body要素に対して「text-align:center;」をしたことにより、ブロックレベル要素はセンタリングが必要ですが、インライン要素(テキスト等)はセンタリングが不要なためです。
「#header_container」と「#menubar_container」は、レイアウトを見やすくするために、とりあえず要素に色をつけています。
#header_container { background-color:#ffffcc; } #menubar_container { background-color:#eeffff; }
「#contents_container」は、自身を左側にフロートさせ、サイドバーを表示するためのスペースを確保するために、右ネガティブマージン(マイナスマージン -200px)しています。
普通、マージンは内容領域の外側にとるものですが、ネガティブマージンは内容領域の内側にとり、ある意味、内容領域を少なくすることなのです。
尚、「clear:left」しているのは、メニューバーコンテナーのli要素で「float:left;」しているのを解除しています。
#contents_container { background-color:#ccccff; width:100%; clear:left; margin-right:-200px; /* margin-left:-200px; */ float:left; /* float:right; */ }
「#for_ie_wrapper」は、親要素のcontents_containerで右ネガティブマージンした分、右マージンして相殺しています。
本当は子要素セレクタ「#contents_container>*」をしたいのですが、IEでは無視されます(Firefoxは大丈夫)。ですので、しかたがなく、こうしています。
#for_ie_wrapper { margin-right:200px; /* margin-left:200px; */ }
「#sidebar_container」は、自身を左側にフロートさせ、横幅を固定の200pxにしています。
しかし、前の要素も左側フロートなので、結果的に右側に回りこみ、段組レイアウトになるわけです。
#sidebar_container { background-color:#ffcccc; width:200px; float:left; }
なぜ、左側フロートさせているのに右側にレイアウトするかというと・・・。
「float:left」は、ブロックレベル要素を左側に寄せ、後に続く要素を右側に回り込ませるもなのです。
「#footer_container」は、フロートを解除させています。
本当は、今回は「clear:left」なのですが、rightの時を考慮してbothとしときます。
#footer_container { background-color:#ccffcc; width:100%; clear:both; }
尚、float指定した要素には、仕様的に必ずwidthを指定します。
関連ページ:
- 解説第一弾:ドキュメントタイプと表示モード
http://d.hatena.ne.jp/chaichanPaPa/20090303/1236082845 - 解説第二弾:SEOとメタ要素とタイトル要素
http://d.hatena.ne.jp/chaichanPaPa/20090304/1236169917 - 解説第三弾:HTMLマーキングで文章構造化
http://d.hatena.ne.jp/chaichanPaPa/20090306/1236343007 - 解説第五弾:CSS詳細部の解説1
http://d.hatena.ne.jp/chaichanPaPa/20090311/1236774374 - 解説第六弾:CSS詳細部の解説2
http://d.hatena.ne.jp/chaichanPaPa/20090312/1236860887