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

テーブル内がスクロールするときに、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でファイル差分の比較を行う方法
gzip圧縮をしてウェブサイトの表示スピードを上げる方法
Nuxt.jsでページを作成・追加する方法|Nuxt.jsの基本
PS Auto Sitemapを使って自分のブログのサイトマップを作成する
Visual Studio Codeで英単語のスペルチェックをしてくれる拡張機能「Code Spell Checker」
iOS Safariで指定したフォントサイズにならない場合の対処法
CSS疑似要素(::beforeや::after)のcontent内で改行したり半角スペースを複数入力する方法
Vue.jsでtemplateタグ内にscriptやstyleタグを生成する方法|Tags with side effect are ignored
様々な作業を自動化するgulpの基礎と導入方法
Visual Studio Codeとスニペット・ドキュメント検索アプリの「Dash」連携を行うプラグイン
iTerm2で「Use System Window Restoration Setting」を設定しているとアラートが表示されて機能しない
Google Chromeのサイト内検索(カスタム検索)機能を別のプロファイルに移行する方法
iPadで入力モードを切り替えずに数字や記号をすばやく入力する方法
iPhoneやiPadでYouTubeの再生速度を3倍速や4倍速にする方法
Keynoteで有効にしているはずのフォントが表示されない現象
MacのKeynoteにハイライトされた状態でコードを貼り付ける方法
AirPodsで片耳を外しても再生が止まらないようにする方法
iTerm2でマウスやトラックパッドの操作を設定できる環境設定の「Pointer」タブ
DeepLで「インターネット接続に問題があります」と表示されて翻訳できないときに確認すること
Ulyssesの「第2のエディタ」表示を使って2つのシートを横並びに表示する
GitHubの通知を見逃さない!通知に特化したアプリ「Gitify」
Keyboard Maestroの変数基礎
Neovimを使い始める最初の一歩として便利な「LazyVim」
ウェブサイトをmacOSアプリとしてラッピングする「Unite Pro」
Keyboard Maestroの「Macro Debugger」で複雑なマクロのデバッグを行う方法
無料版でも高機能なランチャーアプリ「Raycast」の基本機能と環境設定
OnyXでターミナルを使わずにmacOSの詳細設定を行う
軽量で高速なターミナルエミュレーター「Ghostty」の設定方法
Eagleで実現するクリエイティブ素材の簡単管理
かゆいところに手が届く「Supercharge」でMac環境を便利にカスタマイズする