ここでは、ブログなどでよく利用されているフロートを用いた2カラムレイアウトを実際に作成しながら段組みレイアウトの基礎を学びたいと思います。
HTML5の記述
まずはHTMLのみでページを記述していきます。論文もそうですが、重要な文章は最初に記述するというルールに従い、メインコンテンツ » サブコンテンツの順に、HTMLの骨組みを設計してみます。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<title>ページタイトル</title>
<!--[if lt IE 9]>
<script src="html5shiv.js"></script>
<![endif]-->
<style type="text/css">
article, aside, canvas, details, figcaption, figure, footer, header, hgroup, menu, nav, section, summary {
display: block;
}
</style>
</head>
<body>
<div id="container">
<header>
ヘッダーの内容
</header>
<div id="main">
メインコンテンツの内容
</div><!-- #main -->
<div id="sub">
サブコンテンツの内容
</div><!-- #sub -->
<footer>
フッターの内容
</footer>
</div><!-- #container -->
</body>
</html>
サンプルでは、header要素やfooter要素などのHTML5の新要素を使用していますので、古いIEにHTML5の新要素を認識させるため、html5shivを読み込ませています。また、id属性を付与したdiv要素の終了タグの後ろにid名をコメントすることで、HTMLソースの可読性を高めています。
それでは、このHTMLをレイアウトしていきましょう。
幅固定2カラムレイアウト -左メインコンテンツ-
ページ全体のセンタリング
ブロック要素をセンタリングする為には幅(width)の指定と左右のmarginにautoを指定します。ここでは、#container の幅を960pxとし、上下にも margin を20px指定してみます。
#container {
width: 960px;
margin: 20px auto;
}
横幅の計算
ウェブサイト作成において、横幅の設定は非常に重要なポイントになります。ここでは、サイト全体の横幅を960pxとしていますので、横並びのボックスにしようとしているメインコンテンツとサブコンテンツが、960px幅に収まるようにレイアウトを設計する必要があります。
ここでは、メインコンテンツ(#main)の幅を620px、サブコンテンツ(#sub)の幅を320pxとし、メインコンテンツとサブコンテンツの間隔を20px空け、
#main(620px) + 間隔(20px) + #sub(320px) = 960px
となるようにレイアウトしてみます。
CSSの記述
最初に記述したメインコンテンツを左にレイアウトするには、左フロートを使用します。#main に float:left を、#sub に float:right を指定し、footer には clear:both を指定します。こうすると、メインカラムは左、サブカラムは右にレイアウトされ、960px – 620px – 320px = 20px メインコンテンツとサイドバーの間隔が空きます。また、古いIEのバグ対策のため、footer には width:100% を指定します。
- #container に width を指定する
header #main#sub - #main に width を指定し、float:left を指定する
header #main
#sub- #sub に width を指定し、float:right を指定する
header #main
#sub
–>- footer に clear:both を指定する
header #main
#sub
–>サンプルコードは以下の通りです。
#container { width: 960px; margin: 20px auto; } #main { width: 620px; float: left; } #sub { width: 320px; float: right; } footer { clear: both; width: 100%; /* for IE6,7*/ }
幅固定2カラムレイアウト -右メインコンテンツ-
CSSの記述
先ほどとは逆に、メインカラムに右フロートを使用します。#main に float:right を、#sub に float:left を指定し、footer には clear:both を指定します。
サンプルコードと表示サンプルは以下の通りです。
#container { width: 960px; margin: 20px auto; } #main { width: 620px; float: right; } #sub { width: 320px; float: left; } footer { clear: both; width: 100%; /* for IE6,7*/ }
メイン幅可変サブ幅固定レイアウト -左メインコンテンツ-
メインコンテンツをリキッドレイアウトにすることで、ブラウザのスペースを有効利用しつつ、サブコンテンツ幅を固定出来る優れたレイアウトです。サブカラム幅を320px、メインカラムとの間隔を20pxとし、ネガティブマージンを利用してレイアウトしていきます。
HTMLの追加
幅固定レイアウトで使用したHTMLの #main 内に、div要素などのブロックレベル要素を追加します。ここでは #inner とします。
<div id="container"> <header> ヘッダーの内容 </header> <div id="main"> <div id="inner"> メインコンテンツの内容 </div><!-- #inner --> </div><!-- #main --> <div id="sub"> サブコンテンツの内容 </div><!-- #sub --> <footer> フッターの内容 </footer> </div><!-- #container -->
CSSの記述
コンテナブロックの width を 96%(左右にマージンを持たせるため、100% にしていません) に指定し、#main の width:100%, #sub の width を指定したのち、#main, #sub に float:left を指定します。そうすると #sub がカラム落ちしますので、#main に #sub の width の分だけ、負の margin-right (ネガティブマージン) を与え、#sub のカラム落ちを修正します。
しかし、このままでは、#main はネガティブマージンを与えた領域の部分が #sub と重なってしまうので、#main 要素内に記述した #inner に、正の margin-right を与え、重なりを防ぎます。この時、負のマージンよりも多い値を指定すれば、メインカラムとサブカラムの間を空ける事が出来ます。
- #container に width (%指定) を指定する
header #main
色はにほへど 散りぬるを 我が世たれぞ 常ならむ 有為の奥山 今日越えて 浅き夢見じ 酔ひもせず#sub - #main に width:100%, #sub に width を指定し、#main, #sub に float:left を指定する。
header #main
#sub
- #main に、負の margin-right (ネガティブマージン) を指定する
header #main
#sub
- #inner に、正の margin-right を指定する
header #main
#sub
- footer に clear:both を指定する
header - #main に、負の margin-right (ネガティブマージン) を指定する
- #sub に width を指定し、float:right を指定する