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

テーブル内がスクロールするときに、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で開始タグを修正すると自動で閉じタグも修正してくれる拡張機能「Auto Rename Tag」
Dart Sassでファイルを分割して管理する方法|Dart Sass入門
「EWWW Image Optimizer」を使ってWordPressをWebPに対応する方法
ウェブサイト上で簡単にWYSIWYGエディタを実装する「TinyMCE」
SourceTreeで環境設定の「カスタムアクション」「アップデート」「高度な設定」が選択できない
WordPressの自動バックグラウンド更新を無効にする方法とその注意点
Visual Studio Codeの「Debugger for Chrome」でJavaScriptのデバッグを行う
「epel-release」インストール後にyum installで「Cannot retrieve metalink for repository」と表示される場合の対処法
超軽量なコードエディタ 「Zed」をサブエディタとして活用する
gulpでPostCSSを使う方法
iTerm2で「Use System Window Restoration Setting」を設定しているとアラートが表示されて機能しない
Google Chromeのサイト内検索(カスタム検索)機能を別のプロファイルに移行する方法
iPadで入力モードを切り替えずに数字や記号をすばやく入力する方法
iPhoneやiPadでYouTubeの再生速度を3倍速や4倍速にする方法
Keynoteで有効にしているはずのフォントが表示されない現象
MacのKeynoteにハイライトされた状態でコードを貼り付ける方法
AirPodsで片耳を外しても再生が止まらないようにする方法
iTerm2でマウスやトラックパッドの操作を設定できる環境設定の「Pointer」タブ
DeepLで「インターネット接続に問題があります」と表示されて翻訳できないときに確認すること
Ulyssesの「第2のエディタ」表示を使って2つのシートを横並びに表示する
Figma × Keyboard Maestroでどこまで効率化できる?
マウス操作の完成度が高いウインドウリサイズアプリ「Magnet」
Macで複数ディスプレイを使っている場合に便利な設定集
AppCleanerでMacアプリを関連ファイルごと完全に削除する
操作に没頭できる!Firefox版 Arcのようなブラウザ「Zen Browser」
chezmoi(シェモア)で始めるdotfiles管理
GitHubの通知を見逃さない!通知に特化したアプリ「Gitify」
Keyboard Maestroの変数基礎
Neovimを使い始める最初の一歩として便利な「LazyVim」
ウェブサイトをmacOSアプリとしてラッピングする「Unite Pro」