IEでtableのborderが表示されないバグ
IEでtableのborderが表示されないバグ
「表示されない」と書いたが、厳密には、「border-collapse:collapseを指定したtableの中に、borderとpositon:relativeを指定した子要素(th, td) に背景色をつけると、boderの一部が背景色で上書きされる」というバグと、推測される。
「IEでtableのborderが表示されない!」という場合、このバグかもしれない。
他の方の報告もある:
以下に試行錯誤の結果をまとめる。
バグの確認
以下のcodepenをIEで開くと確認できる。
See the Pen ie11border_bug by Cartman (@Cartman0) on CodePen.
border-collapse:collapse を指定したtable中の borderを指定した子要素(th, td)にpositon:relativeを指定すると背景色background-colorで塗りつぶされてしまう。
borderが表示されない(上書きされる)バグ
再現code:
<table class="table-border collapse"> <caption>borderが表示されないバグ</caption> <tbody> <tr> <th>1</th> <td>a</td> </tr> <tr> <th>2</th> <td class="relative">b:上下右のborderが消える</td> </tr> <tr> <th>3</th> <td>c</td> </tr> <tr> <th>4</th> <td>d</td> </tr> </tbody> </table>
<200b>body { font-family: sans-serif; } .table-border { width: 300px; border: solid 1px #333; } .collapse{ border-collapse: collapse; } .table-border > tbody > tr > th { border: 1px solid #333; width: 60px; } .table-border > tbody > tr > td { border: 1px solid #333; background-color: #f9f9f9; } .relative { position: relative; }
テスト
テスト1:display:block要素では通常にborderが表示される
当たり前だが、通常の要素(display:block)にposition: relativeを指定してもborderはbackgroud-colorで上書きされない。
display:blockではboderは表示される
<div class="box border relative"> <p>tableでなければborderは消えない</p> </div>
body { font-family: sans-serif; } .box { width: 100px; height: 100px; background-color: #f0f0f0; } .border{ border: 1px solid #333; } .relative { position: relative; }
テスト2: position: relativeを消すと、borderは表示される。
position: relativeを消すと、borderは表示される
<table class="table-border collapse"> <caption>relativeを外すと表示される</caption> <tbody> <tr> <th>1</th> <td>a</td> </tr> <tr> <th>2</th> <td>b:borderが表示される</td> </tr> <tr> <th>3</th> <td>c</td> </tr> <tr> <th>4</th> <td>d</td> </tr> </tbody> </table>
body { font-family: sans-serif; } .table-border { width: 300px; border: solid 1px #333; } .collapse{ border-collapse: collapse; } .table-border > tbody > tr > th { border: 1px solid #333; width: 60px; } .table-border > tbody > tr > td { border: 1px solid #333; background-color: #f9f9f9; }
テスト3: border-collapse:separateでは表示される
border-collapse:separateでは問題なく2重線でboderが表示されるので、border-collapse:collapseにバグがあると推測される。
border-collapse:separate だと表示される
<table class="table-border separate"> <caption>border-collapse:separateだと表示される</caption> <tbody> <tr> <th>1</th> <td>a</td> </tr> <tr> <th>2</th> <td>b:borderが表示される</td> </tr> <tr> <th>3</th> <td>c</td> </tr> <tr> <th>4</th> <td>d</td> </tr> </tbody> </table>
body { font-family: sans-serif; } .table-border { width: 300px; border: solid 1px #333; } .separate{ border-collapse: separate; } .table-border > tbody > tr > th { border: 1px solid #333; width: 60px; } .table-border > tbody > tr > td { border: 1px solid #333; background-color: #f9f9f9; }
テスト4: background-colorを指定しなければ表示される
background-colorを指定しなければ、borderは通常通り表示される。
background-colorを指定すると上書きされてしまう。
background-colorを指定しなければ表示される
<table class="table-border collapse backgroundNone"> <caption>background-color を指定しなければ表示される</caption> <tbody> <tr> <th>1</th> <td>a</td> </tr> <tr> <th>2</th> <td class="relative">b:borderが表示される</td> </tr> <tr> <th>3</th> <td>c</td> </tr> <tr> <th>4</th> <td>d</td> </tr> </tbody> </table>
body { font-family: sans-serif; } .table-border { width: 300px; border: solid 1px #333; } .collapse{ border-collapse: collapse; } .table-border > tbody > tr > th { border: 1px solid #333; width: 60px; } .table-border > tbody > tr > td { border: 1px solid #333; background-color: #f9f9f9; } .table-border.backgroundNone > tbody > tr > td { background: none; } .relative { position: relative; }
以上のテストから、「border-collapse:collapseを指定したtableの中に、borderとpositon:relativeを指定した子要素(th, td) に背景色をつけると、boderの一部が背景色で上書きされるというバグ」と推測される(まだ隠れ条件はありそうですが)。
発生しやすい状況
「border-collapse:collapseを指定したtable中のtable子要素(th, td)にborder・背景色がある状態でpositon:relativeを指定する」と発生するので、
「テーブルを使ったフォーム入力画面」で発生しやすいと思われる。
解決策
解決策は上記に書いたようにいくつかあり
position: relativeを指定せずに他の方法で配置background-colorを指定しない
で解決できるが、IE対応を考えるとposition: relativeを使わざるを得ない場合もあるのでその場合、relative用のwrapper要素を用意してやれば解決できる。
<table class="table-border collapse"> <caption>relative用のwrapper要素を用意すれば回避できる</caption> <tbody> <tr> <th>1</th> <td>a</td> </tr> <tr> <th>2</th> <td><div class="relative">b:wrapper要素を用意すれば、borderが表示される</div></td> </tr> <tr> <th>3</th> <td>c</td> </tr> <tr> <th>4</th> <td>d</td> </tr> </tbody> </table>