LoginSignup
38
42

More than 5 years have passed since last update.

テーブルのヘッダー(上部と左部)を固定してスクロールさせる方法

Last updated at Posted at 2016-03-07

はじめに

管理画面などでデータの表示にテーブルタグを使うことはよくありますよね。
その際表示したい項目数が多いと当然スクロールさせることになりますが、スクロールさせるとヘッダー部が見えなくなるのでどのデータが何を表しているのか大変分かりづらくなります。

すると、ヘッダーを固定させたくなります。
なのでこの記事ではヘッダーを固定させてスクロールさせる方法を調査して実装してみたのでご紹介していきます。
固定するにしても上部と左部の両方を固定させる方法を調べました。

実現方法

まずはどうしたら実現できるかですが、方法はざっくり2つに別れます。

  • CSSとjQuery(JavaScript)で自前で実装する
  • jQuery(JavaScript)のプラグインを利用する

自前で実装するメリットとしてはおかしい挙動があった際に自分で書いたコードだからデバッグしやすい。そのかわり実装に時間がかかってしまう。
プラグインを使えば実装はしやすいがデバッグがしづらくなってしまいます。

今回はさっと時間をかけずに実現したいのでプラグインを利用することにします。

プラグイン

どのようなプラグインがあるのか調べたところたくさん出てきました。

しかしどうやら上部のみ固定のものが多いようです。
またもっと探せばまだまだたくさん見つかる気もします。

上記の中でも上と横の両方を固定できそうだったのが
jquery.fixedTblHdrLftColfixedMidashijquery.tablefix.jsGrid
になります。

Gridは固定するだけでなく自由にテーブルの表示サイズを変えれることもでき多機能でした。
それ以外は導入のしやすさ、使えるオプションもあまり変わらないようでした。
なのであまり深い意味はなくfixedMidashi を使うことにしました。

ちなみに縦のみのスクロールだと jquery.floatThead が良さそうです。

テーブル表示

導入したところ実際の表示は以下のようになりました。
縦と横の両方のスクロールができるようになります。

FixTableHeaderSample.png

導入方法

導入の際に以下の技術を利用しています。
言語: Ruby
フレームワーク: Ruby on Rails
ビュー: haml
JavaScript: CoffeeScript

プラグインのダウンロード

まず下記ページからダウンロードをして vendor/assets/javascripts 配下にプラグインファイルを置きます。
http://www.vector.co.jp/soft/other/java/se498696.html

Vectorのサイトからダウンロードというのが少し気になりますね。

application.js.coffee

下記の1文を追加して利用できるようにします。
プラグイン自体はjQueryは使用していません。

#= require fixed_midashi_src

ビュー

次にビューは以下の通りです。

.scroll_div{ style: 'overflow: auto;width: 500px'}
  %table{ _fixedhead: 'rows:1; cols:1', style: 'width: 700px' }
    %thead
      %tr
        %th
        %th ヘッダー1
        %th ヘッダー2
        %th ヘッダー3
        %th ヘッダー4
        %th ヘッダー5
    %tbody
      %tr
        %td ヘッダーA
        %td あああ
        %td いいい
        %td ううう
        %td えええ
        %td おおお
      %tr
        %td ヘッダーB
        %td あああ
        %td いいい
        %td ううう
        %td えええ
        %td おおお
      ...

ポイントは、先頭の2行になります。

.scroll_div{ style: 'overflow: auto;width: 500px'}
  %table{ _fixedhead: 'rows:1; cols:1', style: 'width: 700px' }

.scroll_div クラスで table タグを囲んで _fixedhead 属性に
固定したい行数や列数を指定することができます。

table タグを div タグで囲むことで対象 table の親 div のスクロールに対して固定見出しを制御するようになります。
他には body のスクロールに対して固定見出しを制御することもできます。

詳しくは下記ページを参照下さい。
FixedMidashi トップページ

またCSSを直接ビューに書いていますが、クラスを指定して別ファイルにCSSは定義するようにしましょう。

CoffeeScript

JS側は以下の1行を追加するだけになります。

FixedMidashi.create()

以上でヘッダー部を固定したテーブルを表示することができます。

動作確認したブラウザ

そして開発者としては気になるのはどのブラウザで動くのかということですよね。
JavaScriptで色々ゴニョゴニョさせると特定のブラウザだけ動きがおかしい!
とかよくはまりますよね。。特にIEとか。

なので下記の主要なブラウザで動作を確認することができました。

Mac

Chrome 48.0
Safari 9.0.3
Firefox 44.0.2

Windows

Chrome 48.0
IE 11.0
(すみませんIE11より下は試していません。。IETesterにてIE6-9では動きました。)

iPhone

Safari 601.1
Chrome 48.0

問題なさそうでした。

まとめ

以上のようにテーブルのヘッダー部を固定してスクロールさせることはやはりプラグインを使えば簡単に実装できることがわかりました。自前で実装するよりは全然楽です。
またプラグインの数も豊富で、頻繁にはコードは更新していないようですが数年前から更新されていない。ということもないようでした。

自前で実装した場合にどのようなコードになるのか考えてみる。
あるいはプラグインがどのようなロジックで実現しているのかを見てみるのかしてみるのも面白そうだなと思いました。

38
42
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
38
42