スクロールしてもテーブルヘッダーが追尾するテーブルの作り方

テーブル内がスクロールするときに、theadを追尾させたいときがあります。
JavaScriptを使って実装する方法もあると思いますが、今回はCSSのみを使って、追尾するテーブルの作り方をまとめておきます。
追尾テーブルの作り方
追尾テーブルを作る方法は下記の2パターンあります。
<thead>と<tbody>にdisplay: block;を指定して、テーブルではなくす方法<thead>内の<th><td>にposition: sticky;を指定する方法
それぞれメリット・デメリットがあり、ネット上を見ていると1の方法を紹介しているサイトが多いのですが、IE11の対応を無視してもいいか、Polyfillを入れていいのであれば、2の方がラクです。
display: blockを使用する方法
- メリット
- テーブルではなくなるので、通常のblockと同じような扱いができる
- デメリット
<tbody>に対してoverflow-xを指定して横スクロールしても、<thead>はそれに追尾してくれない<thead>と<tbody>で横幅を揃えておかないとズレる
本来<tbody>に対して高さやoverflowは指定できないのですが、display: block;にすることで無理矢理指定できるようにしています。
thead{
display: block;
}
tbody{
display: block;
overflow-y: auto;
max-height: 360px;
}See the Pen テーブルヘッダー固定(display: block;) by Masakazu Saito (@31mskz10) on CodePen.
ただ、ここまでやってしまうと<table>を使う意味・必要がなくなってしまいます。
また、theadとtbodyの横幅をwidthでちゃんと指定してあげないとズレてしまったりするので、扱いが大変です。
position: stickyを使用する方法
- メリット
- テーブルのまま、追尾を実現できる
- デメリット
- 追尾時に上下の
borderが見えなくなってしまう position: sticky;がIE11に対応していないので、Polyfillの使用が必要
- 追尾時に上下の
position: sticky;を使うと、要素がスクロール途中から追尾するような動きを簡単に実現できます。
それを<thead>内の<th><td>に指定することで追尾するようにしています。
ちなみに<table>の1階層上に、最大高さを指定するための<div>を用意してあげる必要があります。
.table_wrap{
max-height: 360px;
overflow: auto;
}
thead th, thead td{
position: sticky;
top: 0;
}See the Pen テーブルヘッダー固定(position: sticky;) by Masakazu Saito (@31mskz10) on CodePen.
注意点として、最大高さを指定するための<div>には、<thead>も含めた値を入力する必要があります。

Visual Studio Codeで簡易的なローカルサーバーを起動して、コード保存時に自動でブラウザをリロードする拡張機能「Live Server」
HTMLタグの入力をラクにするスニペット集
gulpでPostCSSを使う方法
Gitで最初に設定しておくユーザー名とメールアドレスのグローバル設定
goenvを使って、MacにGo言語をインストールする
HTMLのpattern属性を使ってフォームのバリデーションチェックを行う方法
WordPressでショートコードを作成する方法
WordPressで「予約投稿の失敗」となってしまう場合の対処方法
Android実機で表示しているサイトを、Chrome開発者ツールで開いて検証する方法
Visual Studio CodeでCSVの編集を見やすく行う拡張機能「Edit csv」
iTerm2で「Use System Window Restoration Setting」を設定しているとアラートが表示されて機能しない
Google Chromeのサイト内検索(カスタム検索)機能を別のプロファイルに移行する方法
iPadで入力モードを切り替えずに数字や記号をすばやく入力する方法
iPhoneやiPadでYouTubeの再生速度を3倍速や4倍速にする方法
Keynoteで有効にしているはずのフォントが表示されない現象
MacのKeynoteにハイライトされた状態でコードを貼り付ける方法
AirPodsで片耳を外しても再生が止まらないようにする方法
iTerm2でマウスやトラックパッドの操作を設定できる環境設定の「Pointer」タブ
DeepLで「インターネット接続に問題があります」と表示されて翻訳できないときに確認すること
Ulyssesの「第2のエディタ」表示を使って2つのシートを横並びに表示する
テキストエディタ・ノートアプリ関連のショートカットキーをKeyboard Maestroで統一する
Path Finderを使ってキーボードだけでファイル操作する方法(応用編)
macOSのコマンドパレット比較!SpotlightとAlfred、Raycastどれを使えばいい?
1つのノートアプリにすべて集約するのをやめた理由|2025年時点のノートアプリの使い分け
Notionログイン時の「マジックリンク」「ログインコード」をやめて普通のパスワードを使う
AlfredでNotion内の検索ができるようになるワークフロー「Notion Search」
Gitで1行しか変更していないはずのに全行変更した判定になってしまう
Macでアプリごとに音量を調節できるアプリ「Background Music」
Macのターミナルでパスワード付きのZIPファイルを作成する方法