tableタグのテーブル(表)を角丸にしようとすると上手くいかないことがあります。
自分も何度かその状態になって、その度そうだったと思いだしては対応していました。そろそろ自分のためにもやり方を残しておこうと思います。
スポンサーリンクtableタグ(表・テーブル)を角丸にする方法
まず、普通に設定した状態から対応してみましょう。
下記のようなhtmlを例に角丸にしていきますね。
<table class="radius"> <thead> <tr> <th>氏名</th> <th>身長(cm)</th> <th>体重(kg)</th> </tr> </thead> <tbody> <tr> <td>太郎</td> <td>160</td> <td>50</td> </tr> <tr> <td>次郎</td> <td>170</td> <td>55</td> </tr> </tbody> </table>
氏名 | 身長(cm) | 体重(kg) |
---|---|---|
太郎 | 160 | 50 |
次郎 | 170 | 55 |
tableにborder-radiusを設定
.radius { border-radius: 20px; }
上記cssを適応した結果が下記になりますが、角丸になっていません。
氏名 | 身長(cm) | 体重(kg) |
---|---|---|
太郎 | 160 | 50 |
次郎 | 170 | 55 |
では、まず第一の問題点です。それは、border-collapseがcollapseになっていることです。
同じような設定で角丸になった方は既にborder-collapseがseparateとなっている可能性が高いですので、次に進んでください。
tableのborder-collapseに「separate」を設定
.radius { border-collapse: separate; border-spacing: 0; border-radius: 20px; }
border-collapse: separate;を加えたものが下記になります。
※「separate」を設定するとセル間にスペースができるので「border-spacing: 0;」で0にする必要があります
氏名 | 身長(cm) | 体重(kg) |
---|---|---|
太郎 | 160 | 50 |
次郎 | 170 | 55 |
tableタグ(テーブル)自体は角丸になりましたが、中のセル(thやtd)の背景が角丸になっておらずはみ出ている状態です。これではまだ正常な角丸とは言えませんので、もう一つ手を加えます。
これは正直力技なのですが…、四隅つまり左上、右上、左下、右下のセルに対してそれぞれ角丸を設定します。
四隅(左上、右上、左下、右下)のセルに角丸を設定
左上は左上が角丸になるように、右上は右上が、左下は左下が、右下は右下が角丸になるよう設定します。
少し説明すると、まず左上、右上については下記のようなセレクタで対応できます。
- まず、1行目はtheadタグなので「thead 」が必要
- 左上は1番目のセル(th)なので、「thead th:first-child」
- 右上に最後のセル(th)なので、「thead th:last-child」
次に左下、右下については下記のようなセレクタで対応できます。
- まず、2行目以降はtbodyタグなので「tbody 」が必要
- 左下、右下は最終行なので、「tbody tr:last-child」が必要
- 左下は1番目のセル(td)なので、「tbody tr:last-child td:first-child」
- 右下に最後のセル(td)なので、「tbody tr:last-child td:last-child」
実際に設定した値が下記CSSになります。
.radius { border-collapse: separate; border-spacing: 0; border-radius: 20px; } /* 左上 */ .radius thead th:first-child { border-radius: 20px 0 0 0; } /* 右上 */ .radius thead th:last-child { border-radius: 0 20px 0 0; } /* 左下 */ .radius tbody tr:last-child td:first-child { border-radius: 0 0 0 20px; } /* 右下 */ .radius tbody tr:last-child td:last-child { border-radius: 0 0 20px 0; }
ようやくtableタグを角丸にすることができました。
氏名 | 身長(cm) | 体重(kg) |
---|---|---|
太郎 | 160 | 50 |
次郎 | 170 | 55 |
border-collapse: separate;によって、内部のborderが太くなっている
実は「border-collapse: separate;」を設定したため、borderが重ならず2本分になってしまっています。よって、きれいにするためには、上もしくは下、左もしくは右の一方のborderが不要になります。
よって、下記を追記すれば、borderの幅は同じになります。
/* 内部の上のborderを取りやめ。設定しているborderを削除でもOK */ .radius tbody td { border-top-width: 0; } /* 左のborderを取りやめ。設定しているborderを削除でもOK */ .radius th, .radius td { border-left-width: 0; } /* ただし、一番左は必要 */ .radius th:first-child, .radius td:first-child { border-left-width: 1px; }
氏名 | 身長(cm) | 体重(kg) |
---|---|---|
太郎 | 160 | 50 |
次郎 | 170 | 55 |
参考:すべてがtbodyに属している場合
<table class="radius"> <tbody> <tr> <td>太郎</td> <td>160</td> <td>50</td> </tr> <tr> <td>次郎</td> <td>170</td> <td>55</td> </tr> <tr> <td>三郎</td> <td>155</td> <td>55</td> </tr> </tbody> </table>
上記のhtmlのようにすべてtbodyに属している場合は下記のようなcssで対応できます。
.radius { border-collapse: separate; border-spacing: 0; border-radius: 20px; } /* 左上 */ .radius tr:first-child td:first-child { border-radius: 20px 0 0 0; } /* 右上 */ .radius tr:first-child td:last-child { border-radius: 0 20px 0 0; } /* 左下 */ .radius tr:last-child td:first-child { border-radius: 0 0 0 20px; } /* 右下 */ .radius tr:last-child td:last-child { border-radius: 0 0 20px 0; } /* 上のborderを取りやめ。設定しているborderを削除でもOK */ .radius td { border-top-width: 0; } /* ただし、一番上は必要 */ .radius tr:first-child td { border-top-width: 1px; } /* 左のborderを取りやめ。設定しているborderを削除でもOK */ .radius td { border-left-width: 0; } /* ただし、一番左は必要 */ .radius td:first-child { border-left-width: 1px; }
こちらも正常に角丸になりました。
太郎 | 160 | 50 |
次郎 | 170 | 55 |
三郎 | 155 | 55 |
まとめ
- tableタグにborder-radiusを設定する
- tableタグはborder-collapse: separate;の必要がある
- tableタグはborder-spacing: 0;が必要
- 左上、右上、左下、右下のセルもそれぞれ左上、右上、左下、右下を角丸にする必要がある
設定の仕方はtableの組み方によって異なります。CSSセレクタでうまく設定しましょう - テーブルの外枠ではなく内枠は「separate」によって、線が重複してしまうので、不要なborderを削除する必要がある
設定の仕方はtableの組み方によって異なります。CSSセレクタでうまく設定しましょう
スポンサーリンク