tableのcellspacing="0"が必要なことはかなり多い。
しかし、これと同じことをしてくれるCSSのプロパティ、border-spacing:0 は、IE7以下では対応していない。そこで登場するのがborder-collapse:collapse なのだけれど、これにもまた問題がある。そんなこんなを解決するTips。やりたいのはcellspacing="0"を入れたくないってだけですが。
border-collapse:collapse
まずは、border-collapse:collapseにしたtableを見てみます。
<table>
<tr>
<td>border collapse</td>
<td>border collapse</td>
<td>border collapse</td>
</tr>
</table>
table{
width:100%;
border-collapse:collapse;
border-right:1px solid #333;
border-bottom:1px solid #333;
}
td{
border-top:1px solid #333;
border-left:1px solid #333;
padding:5px;
}

border-collapse:collapse を指定すると、隣り合うセルに指定されたborderはくっつく仕組みになります。こうすればcellspacing="0"とやらずともOKな気がしますが、よく見ると・・・

で、出ている!なぜ?(上のキャプチャはFirefox3.5)
これは、線を太くしてみるとよくわかります。

隣り合うborderがくっついて一つになるっていうことは、その線の中心はセルとセルのちょうど真ん中になってしまうんですよね。なので、1pxの線のtableであっても、ポコっと1px出ていて気になってしまうかもしれないです。これは、Firefoxだけそういうレンダリングをするっぽいです。他のブラウザはちゃんとtableを飛び出たりはしていませんでした。仕様の解釈の違いみたいなものがあるのかどうかは分からないですが、とにかく、Firefoxだと出ちゃうんです。
border-spacing:0
はて、最初にちらっと言った、border-spacing:0を試してみます。以下がサンプル。分かりやすくするため線は太いままです。
table{
width:100%;
border-spacing:0;
border-collapse:separate; /* 何も指定しなくてもseparateですが一応 */
border-right:8px solid #333;
border-bottom:8px solid #333;
}
td{
border-top:8px solid #333;
border-left:8px solid #333;
padding:5px;
}

上はFirefox3.5でのキャプチャ。これなら、セル同士の真ん中が中心になるわけではないので、意図したとおりになります。えーと、border-spacingに対応していないIE6,7以外を除いてはなんですけどね・・・下はIE7でのキャプチャ。

border-spacingには対応してないので無視されちゃいます。
なので、仕方ないから<table cellspacing="0">という風にするしかないか・・・ってことになってしまうんですね。
IE向けにはborder-collapse:collapse
初めのborder-collapse:collapseのところで、Firefoxだけ出てしまうと書きました。てことは、他のブラウザだったら、border-collapse:collapseにしても、tableの中に線が収まるわけで、tableを飛び越えたりはしないわけなんですよね。そして、border-spacing:0は、IE6,7がこれに対応していないだけで、他のブラウザでは問題なく利用できる。やりたいのは、tableにcellspacing="0"を付けたくないということ。これらをまとめて解決するために、こんな感じにしてみます。
table{
width:100%;
border-spacing:0;
border-collapse:separate;
*border-collapse:collapse; /* ie6,7 */
border-right:8px solid #333;
border-bottom:8px solid #333;
}
td{
border-top:8px solid #333;
border-left:8px solid #333;
padding:5px;
}
基本はborder-spacing:0、IE6,7にだけはCSSハックでborder-collapse:collaseを。これで、幅が100%でも線が飛び出ません。
「Firefoxでは、セルのborderはtableの幅を超えてしまう」 これは仕様的に正しいのか?というのは、私には正確なところは分かりません。新しいブラウザでブレてるってことは、解釈が微妙なところということなんじゃないでしょうか? それをどうこう頑張るのではなく、border-spacingに対応していない旧世代のブラウザであるIE6, 7に対して、同様の効果を得られる処理を行うことで、これを解決します。
なんかしら、ブラウザに起因するレンダリングの問題が発生しても、よーしじゃあSafari4のCSSハックは、Firefox3.5のハックはどうやってやるのかな!とか調べだすのではなく、古い方をどうにかする方向で考えた方がベターです。

>これは、Firefoxだけそういうレンダリングをするっぽいです。他のブラウザはちゃんとtableを飛び出たりはしていませんでした。仕様の解釈の違いみたいなものがあるのかどうかは分からないですが、とにかく、Firefoxだと出ちゃうんです。
おそらくですが、以下あたりの解釈が違うのかなーと思います。
http://www.swlab.it.okayama-u.ac.jp/man/rec-css2/tables.html#collapsing-borders
コメント by コバ — 2009年9月30日 #
@コバ
「外側のボーダーについては、半分だけが表の幅に含まれる」ってことは、外側の部分は表の幅として扱われないってことでこういう形になってるのかもしれないですねー
参考ページ、ありがとうございます!
コメント by Takazudo — 2009年10月1日 #
どもです!
いやー勉強させられました。
tableのborderに関しては、盲目的にcellspacing=”0″を使ってました・・。
使わない場合でも、大体の場合において、tableにもborderを指定してるので
深く考察したことなかったので・・。
でもこれで、今後こういったケースがあった場合は対応できそうです。
ということで、さっそくRSS登録させてもらいました!w
コメント by えど — 2009年10月2日 #
@えど
どーもーありがとございます!
IE7以下でうんぬんはIE8が出た今、色々できそうな感じがします。
よろしくでーす
コメント by Takazudo — 2009年10月4日 #
素朴な質問ですが、
tableのボーダーをtdとtableタグに分けて指定している理由は、
特にあるのでしょうか?
コメント by sasaki — 2010年1月16日 #
@sasaki
1pxの線を出したい時、tdに1pxの線を指定すると、
隣り合う線がくっついて2pxになってしまうからそんな感じにしていますー
http://dl.dropbox.com/u/268240/zudologFiles/bordercollapsetable/html/ex01.html
コメント by Takazudo — 2010年1月16日 #
[...] 関係で調べ物をしていたときに見かけた、Takazudo さんの zudolog » tableのcellspacing=”0″を消すためにという記事の中で tableのcellspacing=”0″が必要なことはかなり多い。 [...]
ピンバック by table に指定しておきたい CSS メモ | css | understandard.net — 2010年7月1日 #