バグ解消法、お役立ち情報など

Tableのヘッダーを固定する方法(border-collapse: collapse)

logo

はじめに

今回は、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を使用しています)

以下のような表示になります。

image

この時点ではテーブルのヘッダーは固定されていません。

テーブルのヘッダーを固定

では、テーブルのヘッダーを固定します。

以下のようなコードです。

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; }

変更点は以下の通りです。

  1. テーブル全体をdiv要素でラップ
  2. 1.にスタイルを適用。高さを固定。
  3. テーブルにborder-collapse: separate;を適用
  4. .sticky-table th::beforeにスタイルを適用
  5. thead要素にスタイルを適用

ポイントは、sticky-tableクラスのborder-collapse: separate;です。

この指定があることでボーダーがスクロールするのを制御できます!

実際の動作は以下のようになります。

image

デモは以下のリンクからどうぞ。

デモ - Fixed table header

これでTableのヘッダーを固定することができました。

バグ解消法、お役立ち情報など