not in use blog

エンジニアの日々の学びと思考の記録。

テーブルのヘッダー部分を固定する方法

f:id:maserati004:20200913232540p:plain

はじめに

データが大量にあるテーブル内でスクロールした際に、表のヘッダー部分まで一緒にスクロールされてしまうと何のデータなのかわからなくなる時があります。

今回はそれを改善するために、テーブルのヘッダー部分を固定する方法について調べたのでまとめてみました。

どうやるか

・cssの「position: sticky」を使用し要素を固定する

・その際「z-index」を使用し、z軸の表示順位を指定する

・固定する部分は背景色をつけ、通過する要素が透けて見えないようにする

コード例

<table>
  <tr>
    <th class="fixed01">見出しmmm</th>
    <th class="fixed02">見出し</th>
    <th class="fixed02">見出し</th>
    <th class="fixed02">見出し</th>
    <th class="fixed02">見出し</th>
    <th class="fixed02">見出し</th>
    <th class="fixed02">見出し</th>
    <th class="fixed02">見出し</th>
    <th class="fixed02">見出し</th>
    <th class="fixed02">見出し</th>
    <th class="fixed02">見出し</th>
  </tr>
  <tr>
    <th class="fixed02">見出し</th>
    <td>テキスト</td>
    <td>テキスト</td>
    <td>テキスト</td>
    <td>テキスト</td>
    <td>テキスト</td>
    <td>テキスト</td>
    <td>テキスト</td>
    <td>テキスト</td>
    <td>テキスト</td>
    <td>テキスト</td>
  </tr>
  <tr>
    <th class="fixed02">見出し</th>
    <td>テキスト</td>
    <td>テキスト</td>
    <td>テキスト</td>
    <td>テキスト</td>
    <td>テキスト</td>
    <td>テキスト</td>
    <td>テキスト</td>
    <td>テキスト</td>
    <td>テキスト</td>
    <td>テキスト</td>
  </tr>
  <tr>
    <th class="fixed02">見出し</th>
    <td>テキスト</td>
    <td>テキスト</td>
    <td>テキスト</td>
    <td>テキスト</td>
    <td>テキスト</td>
    <td>テキスト</td>
    <td>テキスト</td>
    <td>テキスト</td>
    <td>テキスト</td>
    <td>テキスト</td>
  </tr>
</table>
table{
  width: 1800px;
}
th,td{
  width: 300px;
  height: 100px;
  vertical-align: middle;
  padding: 0 15px;
  border: 1px solid #ccc;
}
.fixed01,
.fixed02{
  position: sticky;
  top: 0;
  left: 0;
  color: #fff;
  background: #333;
  &:before{
    content: "";
    position: absolute;
    top: -1px;
    left: -1px;
    width: 100%;
    height: 100%;
    border: 1px solid #ccc;
  }
}
.fixed01{
  z-index: 2;
}
.fixed02{
  z-index: 1;
}

参考記事

CSSでテーブル表の一部を固定してスクロールする方法 | 福岡のホームページ制作会社 シンス株式会社

z-indexの使い方:CSSで重なり順を指定する

ヘッダーとフッターのHTML固定方法とデザインまとめ|SEOラボ

CSSのposition: stickyでテーブルのヘッダー行・列を固定する - Qiita

CSSだけでヘッダー固定。