2009年09月08日 (火)
WebサイトやECサイトにて、商品写真を横幅きっちりに並べたい場合があるかとおもいます。その時リスト系の要素をfloatを用いて横に並べて、商品間を左右marginで調節するなどで再現しますが横きっちりに並べる場合一番右端、あるいは左端のアイテムがしたにずれ込みカラム落ちする場合があります。
原因は親要素の横幅と、floatしている子要素の横幅+marginが親要素の横幅をこえるためです。

その問題が発生しないよう再現しているサイトの中には、一番右端に来る要素に対してclass属性でmarginを0にしたり調整したりする場合がありますが、これにはデメリットがあります。
それを踏まえて、もっとシンプルで別視点から見たアプローチを提示します。
HTML
<div id="main">
<ul>
<li>[中身]</li>
<li>[中身]</li>
<li>[中身]</li>
<li>[中身]</li>
<li>[中身]</li>
</ul>
</div>
CSS
div#main{
width: 830px; /*※1 */
overflow: hidden; /*※2 */
}
ul{
list-style: none;
width: 840px; /*※3 */
}
ul:after{
display: block;
clear: both;
content: "";
}
ul li{
float: left;
width: 200px; /*※4 */
margin-right: 10px; /*※4 */
}
対象ブラウザは Win IE5.5/6/7/8,Firefox 2.x〜,Opera 8.x〜,Safari 2.x〜。
フロートの親要素(ここでいうul要素)の左右marginや横幅を自由にいじれる場合はこの限りではないですけど、ul要素の横幅がその親要素の横幅を同じだったりする場合はこの方法が使えると思います。
何故今更こんな事を?...以前更新引き継ぎされたサイトが、一番右にくる要素にいちいちclass="endcolumn"みたいな属性が付いてて、順番の入れ替えや追加削除の度にレイアウトが崩れてウザくイライラしたから...それだけのことです。