経緯
display: inline-block;
を指定するとあたかもinline
での表示のように振る舞いながら、heightや上下のpaddingを指定することができてすごく便利です。
4列のデータ一覧を作りたいとき、これを使うとレイアウトが崩れてしまったので、そのメモ書き。
原因
HTML/CSSは以下のようなもの。
<ul class="column-list"> <li><img src="hoge.png" alt="hoge" /></li> <li><img src="hoge.png" alt="hoge" /></li> <li><img src="hoge.png" alt="hoge" /></li> <li><img src="hoge.png" alt="hoge" /></li> <li><img src="hoge.png" alt="hoge" /></li> <li><img src="hoge.png" alt="hoge" /></li> <li><img src="hoge.png" alt="hoge" /></li> </ul>
.column-list>li{ width: 25%; /* 100% / 4 */ padding: 10px; display: inline-block; } .column-list>li{ width: 100%; }
こうのようなHTML/CSSのとき、上手く4列になりません。
デベロッパーツールで確認すると、li
同士の間に妙な隙間があるのがわかると思います。
これは実は、半角スペースが間に入ってしまっていることが原因です。
HTMLでは改行や連続する半角スペースは1つの半角スペースとして解釈されることになっています。
そのため、
<ul class="column-list"><li><img src="hoge.png" alt="hoge" /></li><li><img src="hoge.png" alt="hoge" /></li><li><img src="hoge.png" alt="hoge" /></li><li><img src="hoge.png" alt="hoge" /></li><li><img src="hoge.png" alt="hoge" /></li><li><img src="hoge.png" alt="hoge" /></li><li><img src="hoge.png" alt="hoge" /></li> </ul>
のように改行なしで書いてしまえば、正しく表示されます。
一方で、こんな書き方では、いくらなんでも可読性が低すぎます。
解決策
ちゃんとdisplay: block;
を使ってやりましょう。
.column-list>li{ width: 25%; /* 100% / 4 */ padding: 10px; float: left; /* ここを修正 */ display: block; /* ここを修正 */ } .column-list>li{ width: 100%; }
まとめ
便利なものには罠がある。
コメントを残す