HTML をシンプルに保ったままブロック要素を段組みする方法です。

↑のように写真を横並びで表示したい、というケースはよくあると思います。
まず、上記の HTML ソースがこちら。
<div id="photo">
<ul>
<li><img src="hoge1.jpg" alt="サンプル1" width="160" height="120" /></li>
<li><img src="hoge2.jpg" alt="サンプル2" width="160" height="120" /></li>
<li><img src="hoge3.jpg" alt="サンプル3" width="160" height="120" /></li>
</ul>
</div><!-- /#photo -->
今回のサンプルでは、ボックスと余白が以下になっています。

全体の横幅(500px)が決まっていて、左右を全体の幅に揃えたい場合、次のように CSS を記述すれば HTML をシンプルに保ったまま(個別に id や class を適用することなく)段組み表示を実現することができます。
* { /* デフォルトCSSのリセット */
margin: 0;
padding: 0;
}
div#photo {
position: relative; /* 相対配置指定 */
width: 500px; /* 全体の横幅 */
height: 120px;
}
div#photo ul {
position: absolute; /* 絶対配置指定 */
top: 0;
left: 0;
width: 510px;
height: 120px;
list-style-type: none;
}
div#photo li {
float: left; /* floatで段組み */
width: 160px;
height: 120px;
margin-right: 10px; /* 余白 */
}
position と float の合わせ技によるテクニックです。普段 float だけ使用していると結構苦労するレイアウトでも、position を活用することで簡単に段組みを実現することができます。
ブロック要素の段組みでは欠かせないオススメのテクニックです。
















コメント
div#photoにposition: relative;
div#photo ulにposition: absolute;
をそれぞれ指定する理由がわからないのですが?
とおりすがり | 2008年03月18日 20:35
段組みの下にコンテンツがある場合、div#photo にもheightを指定しないとコンテンツが食い込んでしまいますね。
com2 | 2008年03月18日 21:18
>とおりすがりさん
コメントありがとうございます。
div#photo に position:relative を指定することで、ul の position:absolute の基準位置を div#photo の左上にしています。
div#photo に position を指定しない(デフォルト値 position:static のまま)ですと、ウィンドウ全体の左上が基準位置になってしまいます。
>com2 さん
コメントありがとうございます。
ご指摘のとおり、段組の下にコンテンツを配置する場合は div#photo にも height:120px を指定しないといけませんでしたね。検証不足でお恥ずかしい限りです…。
本文のサンプルコードを修正いたしました。ありがとうございました。
sakai | 2008年03月18日 23:21
検証せずにコメントして恐縮なのですが、、
div#photo li の右マージン、そのままだとIE6では倍の長さになってしまわないでしょうか。
フロートした要素の横マージンは、IE6ではバグのため倍になってしまうと記憶しています。なので私はよく、
display:inline;
をフロートした要素に記述しています。
倍になっていなければ・・・ごめんなさい。
kaz | 2008年04月09日 11:45
>kaz さん
コメントありがとうございます。
IE6 の有名なバグですね。float と同じ方向(サンプルの場合 left)に margin を指定すると、ご指摘の通りのバグが発現します。サンプルでは margin を右方向(right)に指定していますので、IE6 でも他のモダンブラウザ同様の正常な表示がされます。
とはいえ、うっかりバグを発現させないためにも float する要素にはなるべく padding で余白を指定したほうが良いかもしれませんね。
ご指摘ありがとうございました。
sakai | 2008年04月09日 12:09