2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

html table のヘッダーをスクロール固定する

Posted at

要件

htmlページで大きなテーブルをスクロールバー付きの小さいボックスに収める。
ヘッダー見出し行および列はスクロールしても動かないようにする。というもの。

実装

codepen 埋め込みが小さいのでHTMLタブをオフって下さいorz

See the Pen Untitled by cfd-ack (@cfd-ack) on CodePen.

確認済み
Chrome: 103.0.5060.114
FireFox: 102.0.1

※これでもまだ業務レベルで使えないので、さらに改良を入れる予定。(要javascript)

ポイント(多い・・・

  • table {border-collapse: separate;} // collapse では色々問題がある模様
  • table {border-spacing: 0;} // デフォルトで空いているのが意味不(個人的な感想です)
  • table {table-layout: fixed;} // 列幅を固定するのに必須
     列幅を動的にすると行ヘッダの2列目以降の sticky left にjavascript必須
  • table {box-sizing: border-box;} // 列幅の指定を罫線とpadding込みでの指定にする
     ブラウザのデフォルトで指定されている模様・・・
  • thead {position: sticky; top:0;} // ヘッダ行(複数)をスクロール固定
  • table の幅は各列の幅の合計と同じにする(めんどいけど複数列の行ヘッダでは必要)
  • 列幅は colgroup/col で指定、nth-child(i) を使えばクラス名を生やさなくてもいける。
  • 行ヘッダ横スクロール固定も nth-child(i) を使用して sticky とし、left はそれまでの累積。
     セルの結合 colspan/rowspan による「被結合セル」は display:none にしている。
     このため nth-child がズレることはない。
     (結合に関わらず行列の数に合わせたセル td/th を生やし、display:none を適用。
      動的に結合を変更するのも楽。rows/cellsコレクションのインデックスも単純明快に。
      これはIEや旧Edgeでも有効なTipsなんだけどヨソで見たことない・・・)

感想

浦島だったhtml5および最新のスタイルシートでは割と楽に実現できるようになっていた。
ただ、業務レベルで使用するきっちりした見栄えの表を目指したら結構大変だった。

※ググって調べた各種サイトのものでは不満足だったので、試行錯誤した。
(技術系の調査だと昔に比べてGoogle先生が腐っている場合が多いような・・・

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?