Tableのヘッダーを固定する方法(border-collapse: collapse)
はじめに
今回は、Tableタグでヘッダーを固定する方法についてお伝えします。
ただし、border-collapse: collapse
というCSSスタイルが適用されているテーブルについて記載します。
なぜなら、border-collapse: collapse
が適用されている場合、ボーダー部分が固定できずに、テーブルをスクロールすると下の要素がチラチラと見えてしまうという現象が発生し、対処に苦労したためです。
備忘録も兼ねて記事にします。
準備
まず、テーブルを作成します。
HTML<table class="table table-bordered table-collapse"> <thead> <tr> <th>ヘッダー1</th> <th>ヘッダー2</th> </tr> </thead> <tbody> <tr> <td>ボディ1</td> <td>ボディ2</td> </tr> ... </tbody> </table>
CSS.table-collapse { border-collapse: collapse; }
(実装の手間を省くため、Bootstrapを使用しています)
以下のような表示になります。
この時点ではテーブルのヘッダーは固定されていません。
テーブルのヘッダーを固定
では、テーブルのヘッダーを固定します。
以下のようなコードです。
HTML<div class="table-div"> <table class="table table-bordered table-collapse sticky-table"> <thead class="sticky-table-thead bg-white"> <tr> <th>ヘッダー1</th> <th>ヘッダー2</th> </tr> </thead> <tbody> <tr> <td>ボディ1</td> <td>ボディ2</td> </tr> ... </tbody> </table> </div>
CSS.table-collapse { border-collapse:collapse; } .table-div { overflow: auto; max-height: 150px; } .sticky-table { border-collapse: separate; border-spacing: 0; } .sticky-table th::before { content: ""; position: absolute; width: 100%; height: 100%; top: 0; left: 0; border-bottom: 0.5px solid #dee2e6; border-top: 0.5px solid #dee2e6; } .sticky-table-thead { position: relative; top: 0; z-index: 1; } .sticky-table-thead tr th { position: sticky; top: 0; background-color: #fff; z-index: 1; }
変更点は以下の通りです。
- テーブル全体を
div
要素でラップ - 1.にスタイルを適用。高さを固定。
- テーブルに
border-collapse: separate;
を適用 .sticky-table th::before
にスタイルを適用thead
要素にスタイルを適用
ポイントは、sticky-table
クラスのborder-collapse: separate;
です。
この指定があることでボーダーがスクロールするのを制御できます!
実際の動作は以下のようになります。
デモは以下のリンクからどうぞ。
これでTableのヘッダーを固定することができました。