08 January 2009

inline要素内での改行と空白

インライン要素のなかでは、改行が半角スペースくらいの空白に変換されます。

たとえば、

<p>
aaa
bbb
ccc
p>

というhtmlは、ブラウザでは次のように表示されます。

aaa bbb ccc

このように、ソース内の改行は、半角スペースのような空白(正確には空白類文字というそうです) に変換されます。

画像やリストの間に空白

この仕様のせいで、意図したようにうまく表示されない場合があります。

たとえば、画像を隙間なく並べたい場合。

<img src="images/foo.gif" />
<img src="images/bar.gif" />
<img src="images/baz.gif" />
<img src="images/foo.gif" />
<img src="images/bar.gif" />
<img src="images/baz.gif" />

この場合は、画像と画像の間にスペースが入ってしまいます。


あるいは、リストをインラインで並べたい場合。

<ul>
<li><a href="top.html">Topa>li>
<li><a href="diary.html">Diarya>li>
<li><a href="contact.html">Contacta>li>
ul>
ul li {
display: inline;
}

こちらも、リストの要素と要素の間にスペースが入ってしまいます。

対策

margin, paddingで対処

マイナスマージンを指定するなどし、空白の分だけ要素の位置を調整します。

img {
margin-right: -5px;
}
display: block にして、floatなどさせる

ブロック要素ならば改行されないため、要素に「display:block」を指定します。そのままでは全て縦に並んでしまうので、floatプロパティなどをつかって位置を調整します。

ul li {
display: block;
float: left;
}
ソースで改行しない

そもそもソースで改行しなければ、空白は出てきません。ただ、とても見づらいソースになってしまいます。

<img src="images/foo.gif" /><img src="images/bar.gif" /><img src="images/baz.gif" /><img src="images/foo.gif" /><img src="images/bar.gif" /><img src="images/baz.gif" />
ソースで改行を工夫する

こんな風に改行すると、空白をキャンセルできます。

<img src="images/foo.gif" /
><img src="images/bar.gif" /
><img src="images/baz.gif" /
><img src="images/foo.gif" /
><img src="images/bar.gif" /
><img src="images/baz.gif" />

ただ、時間をおいてソースを見たときに、なぜこうしたか思い出すのに時間がかかったり、多人数での作業に支障がでるかもしれません。


li要素などを改行すると、要素と要素の間に半角スペース分の余白が現れる件について調べてみた。 | Blog hamashun.com