株式会社コネクト開発雑記帳

【備忘録】Bootstrapのレスポンシブテーブルで見出し行を上部固定させる

作成者:チータ
カテゴリ:WEB開発
投稿日:2023/01/13
https://getbootstrap.jp/

 色々と使い勝手のいいフロントエンドフレームワークにBootstrapというものがあります。
 簡単に言えばホームページ画面の構築に必要なレイアウト用のCSSが予め定義されていて、ルールに沿ってHTMLを書いて要素に必要なClassを指定していけばグリッドデザインなど基本的な骨組みが効率的に開発できるというもの。
 画一的な表現に強いのでデータのアーカイブサイトやシステム画面設計などに用いられることが多いですが、デザイン性が求められるホームページだと融通が効かない時もあるので一概に“これを使えば生産性が上がる”とは言えないものの、ある程度業界標準として指針になるフレームワークがあると開発の参考になります。

Bootstrapで表組を作成する基本手順

 さて、このBootstrapで表を作ると下記のようなHTMLで基本レイアウトが適用できます。

<table class="table">
  <thead>
    <tr>
      <th scope="col">#</th>
      <th scope="col">head1</th>
      <th scope="col">head2</th>
      <th scope="col">head3</th>
	...
    </tr>
  </thead>
  <tbody>
    <tr>
      <th scope="row">1</th>
      <td>cell1</td>
      <td>cell2</td>
      <td>cell3</td>
	...
    </tr>

	...
  </tbody>
</table>
# head1 head2 head3
1 cell1 cell2 cell3
2 cell1 cell2 cell3
3 cell1 cell2 cell3

 この状態では特になにも設定していないので単純に表が作成されただけですが、今回の主題である「見出し行を固定表示する」という場合はcssでposition:sticky;を指定します。
 昔はもっといろいろな機能を組み合わせないと上部固定できなかったのがずいぶんと簡単になったものです。
 Bootstrapでもsticky-topというClassが用意されているので、それを入れれば適用されます。

# head1 head2 head3
1 cell1 cell2 cell3
2 cell1 cell2 cell3
3 cell1 cell2 cell3
4 cell1 cell2 cell3
5 cell1 cell2 cell3
6 cell1 cell2 cell3
7 cell1 cell2 cell3
8 cell1 cell2 cell3
9 cell1 cell2 cell3
10 cell1 cell2 cell3
11 cell1 cell2 cell3
12 cell1 cell2 cell3
13 cell1 cell2 cell3
14 cell1 cell2 cell3
15 cell1 cell2 cell3

見出し行上部固定の問題点

 ここまでの話で、埋め込んだサンプルを見ると何も問題ないように見えますが、今回気になったのはスマートフォン対応したときに上部固定が機能しなくなること。
 前述のサンプルはスマートフォン対応していないので行や列数が増えた時に画面の小さな端末で表示すると表が本文枠より外にはみ出て表示されます。
 これを避けるには表を<div class="table-responsive">で囲むことがBootstrapで示されているものの、そうすると今度はposition:stickeyでの見出し行固定が効かないんですよ。

 原因は単純で、position:stickeyを使用する場合は親要素のCSSでoverflowがvisibleになっていることが条件なのに、<div class="table-responsive">を指定するとスマートフォンで横スクロールさせるためにoverflow-x:scroolが適用されてしまうからなんですね。

 

# head1 head2 head3 head4 head5 head6 head7 head8 head9 head10
1 cell1 cell2 cell3 cell4 cell5 cell6 cell7 cell8 cell9 cell10
2 cell1 cell2 cell3 cell4 cell5 cell6 cell7 cell8 cell9 cell10
3 cell1 cell2 cell3 cell4 cell5 cell6 cell7 cell8 cell9 cell10
4 cell1 cell2 cell3 cell4 cell5 cell6 cell7 cell8 cell9 cell10
5 cell1 cell2 cell3 cell4 cell5 cell6 cell7 cell8 cell9 cell10
6 cell1 cell2 cell3 cell4 cell5 cell6 cell7 cell8 cell9 cell10
7 cell1 cell2 cell3 cell4 cell5 cell6 cell7 cell8 cell9 cell10
8 cell1 cell2 cell3 cell4 cell5 cell6 cell7 cell8 cell9 cell10
9 cell1 cell2 cell3 cell4 cell5 cell6 cell7 cell8 cell9 cell10
10 cell1 cell2 cell3 cell4 cell5 cell6 cell7 cell8 cell9 cell10
11 cell1 cell2 cell3 cell4 cell5 cell6 cell7 cell8 cell9 cell10
12 cell1 cell2 cell3 cell4 cell5 cell6 cell7 cell8 cell9 cell10
13 cell1 cell2 cell3 cell4 cell5 cell6 cell7 cell8 cell9 cell10
14 cell1 cell2 cell3 cell4 cell5 cell6 cell7 cell8 cell9 cell10
15 cell1 cell2 cell3 cell4 cell5 cell6 cell7 cell8 cell9 cell10

 この問題をどのように回避すべきか検討していましたが、関連する開発者フォーラムなどでやりとりされている内容を見ても思ったより情報が少なく、日本語で議論されているサイトはほぼ皆無という状況だったので備忘録代わりにこの記事を書いた次第です。

 結論から言えば、Bootstrapではレスポンシブテーブルで見出し行固定をする使用方法は想定されていないためそれ単体での解決は現状不可能っぽいですね。
 対応としては、<div class="table-responsive">をやめて独自にCSSやJavascriptで動作させるか、同じ表組に関する不満を持った有志が作ったBootstrap Tableというライブラリを使うかのいずれかになりそうです。テーブルの親要素にheightを指定してテーブルを表示する高さを小さくして中でスクロールするようにすれば動作しますが、せっかく表組にしたのに一覧性がなくなるのであまりやりたくない。

 試しにBootstrap Tableを使ってみましたが、そのまま適用すると見出し行固定は機能するもののBootstrapで調整した表組デザインに上書きする形で Bootstrap tableのCSSレイアウトが適用されてくるのでデザイン調整が面倒になるのと、画面の表示処理で一度テーブルのHTMLが再構築される関係から表の中にボタンを配置してJavascriptで何らかの動作をさせている場合は処理タイミングがバッティングするとボタンが機能しなくなるみたいでUI設計でも調整が必要になりそうなことから一長一短といったところですね。

 少し長くなってしまったのでBootstrap Table の使い方などは省きますが、Bootstrapの次期バージョンで標準対応してくれないかなと思いつつ、そもそも近年のWebデザインではテーブルを積極的には利用しなくなってきている面もあるため期待薄かとも感じています。無理にテーブルにこだわるよりは今後はflexやgridなど新しいCSSプロパティを使っていくべきですかねぇ。

ホームページやWEBアプリケーションのご相談はこちら

 ホームページやWEBアプリケーションでお困りごとがございましたら株式会社コネクトHPのお問い合わせからお気軽にご連絡ください。新規開発やリニューアルはもちろん昔作ったけれど手つかずになってしまっているプログラムの修正まで、ちょっとしたご相談にも丁寧に対応します。

コネクトの事業内容はこちらお問い合わせはこちら

ツール一覧

通信チェックアイコン

通信チェック

QRコード生成アイコン

QRコード生成

パスワード生成アイコン

パスワード生成

.htpasswd生成アイコン

.htpasswd生成

JS/CSS最適化アイコン

JS/CSS最適化

JPEG/PNG→Webp変換アイコン

Webp変換

ビンゴツールアイコン

ビンゴツール

2023年開運おみくじアイコン

2023年開運おみくじ

最近の記事

更新担当者

  • チータ
    WEBサービス・システム開発担当
  • タク
    写真撮影・動画制作担当
  • コーイチ
    AI研究者

Copyright © 2022-2024 Connect All Rights Reserved.