コード
アーカイブなどでよくあるレイアウトの1つ「写真+テキスト」の各ブロックが横並びになるレイアウトは、float
を使う方法と、display: table;
を使う方法の2パターンがある。どちらを使っても同じレイアウトを実現できるが、例えば、写真は右、テキストは左に並ぶリストであれば、display: table;
を使ったほうが、回り込みの解除とかの必要もなくコードはすっきりする。
ただ、奇数行は写真が左、偶数行は写真が右、などのように配置が異なる場合は、その行ごとに「奇数行は写真ブロックのコードを先に書いて、次にテキストブロックのコードを書いて。偶数行はテキストブロックのコードを先に書いて…」といったように、行ごとに書き分ける必要が出てくる。この場合、あとから新しいリストが追加になったり、順番が変わった場合に修正が面倒だ。
この手間を排除したい場合は、float
を使うのがいい。:nth-child
を使えば、偶数行(even)と奇数行(odd)でスタイルを指定することができる。本記事では、それぞれのコードを紹介する。
サンプル (写真とテキストの並び順が一定の場合)
See the Pen 「写真+文章」を横並びに配置したリスト(table ver.) by Tora (@webtoranomaki) on CodePen.
HTML
<div class="flex-box">
<div class="flex-box-img"><img class="img" src="image.jpg"></div>
<div class="flex-box-body">ここにテキストが入ります。</div>
</div>
<div class="flex-box">
<div class="flex-box-img"><img class="img" src="image.jpg"></div>
<div class="flex-box-body">ここにテキストが入ります。</div>
</div>
CSS
.flex-box {
display: table;
width: 100%;
margin-bottom: 20px;
}
.flex-box-img {
display: table-cell;
width: 120px;
}
.flex-box-img .img {
display: block;
width: 100%;
height: auto;
}
.flex-box-body {
display: table-cell;
vertical-align: top;
padding-left: 10px; /* 画像⇔文字間 */
}
サンプル (偶数行と奇数行で写真とテキストの並び順が異なる場合)
See the Pen 「写真+文章」を横並びに配置したリスト(float ver.) by Tora (@webtoranomaki) on CodePen.
HTML
※HTMLは上記のfloatのものと同一
<div class="flex-box">
<div class="flex-box-img"><img class="img" src="image.jpg"></div>
<div class="flex-box-body">ここにテキストが入ります。</div>
</div>
<div class="flex-box">
<div class="flex-box-img"><img class="img" src="image.jpg"></div>
<div class="flex-box-body">ここにテキストが入ります。</div>
</div>
CSS
.flex-box {
margin-bottom: 20px;
overflow: hidden;
}
.flex-box-img {
width: 120px;
}
.flex-box:nth-child(odd) .flex-box-img {
float: left;
margin-right: 10px; /* 画像⇔文字間 */
}
.flex-box:nth-child(even) .flex-box-img {
float: right;
margin-left: 10px; /* 画像⇔文字間 */
}
.flex-box-img .img {
display: block;
width: 100%;
height: auto;
}
.flex-box-body {
overflow: hidden;
}