3月
08
2010

テーブルのヘッダを固定してスクロールする jQuery プラグイン

Excel のウィンドウ枠の固定のように、テーブルのヘッダや左側を固定して、残りの部分をスクロールさせるための jQuery プラグインを書きました。
マークアップはシンプルで、普通にテーブルを書いたら、jQuery の作法でプラグインを呼び出すだけです。

jQuery のおれおれプラグインはいくつか書いた事がありましたが、こうやって公開するのは初めてです。ごてごての機能が欲しいんじゃなくて、単に既存のテーブルを固定スクロール化したいだけの時に、いいのが見つからなくて書いたので、けっこうニーズがあるんじゃないかと思ってます。

下記は簡単なサンプルです。詳細は専用ページを見てみて下さい。

HTML

<table id="tablefix">
    <thead>
    <tr>
        <th rowspan="2">ヘッダA</th>
        <th rowspan="2">ヘッダB</th>
        <th colspan="2">ヘッダC</th>
        <th rowspan="2">ヘッダD</th>
        <th rowspan="2">ヘッダE</th>
    </tr>
    <tr>
        <th>ヘッダ C-1</th>
        <th>ヘッダ C-2</th>
    </tr>
    </thead>
    <tbody>
    <tr>
        <td>データ</td>
        <td>データ</td>
        <td>データデータデータデータデータデータデータデータデータデータデータデータ</td>
        <td>データデータデータデータデータデータデータデータデータデータデータデータ</td>
        <td>データデータデータデータデータデータデータデータデータデータデータデータ</td>
        <td>データデータデータデータデータデータデータデータデータデータデータデータ</td>
    </tr>
    <tr>
        <td>データ</td>
        <td>データ</td>
        <td>データデータデータデータデータデータデータデータデータデータデータデータ</td>
        <td>データデータデータデータデータデータデータデータデータデータデータデータ</td>
        <td>データデータデータデータデータデータデータデータデータデータデータデータ</td>
        <td>データデータデータデータデータデータデータデータデータデータデータデータ</td>
    </tr>
    <tr>
        <td>データ</td>
        <td>データ</td>
        <td>データデータデータデータデータデータデータデータデータデータデータデータ</td>
        <td>データデータデータデータデータデータデータデータデータデータデータデータ</td>
        <td>データデータデータデータデータデータデータデータデータデータデータデータ</td>
        <td>データデータデータデータデータデータデータデータデータデータデータデータ</td>
    </tr>
    <tr>
        <td>データ</td>
        <td>データ</td>
        <td>データデータデータデータデータデータデータデータデータデータデータデータ</td>
        <td>データデータデータデータデータデータデータデータデータデータデータデータ</td>
        <td>データデータデータデータデータデータデータデータデータデータデータデータ</td>
        <td>データデータデータデータデータデータデータデータデータデータデータデータ</td>
    </tr>
    <tr>
        <td>データ</td>
        <td>データ</td>
        <td>データデータデータデータデータデータデータデータデータデータデータデータ</td>
        <td>データデータデータデータデータデータデータデータデータデータデータデータ</td>
        <td>データデータデータデータデータデータデータデータデータデータデータデータ</td>
        <td>データデータデータデータデータデータデータデータデータデータデータデータ</td>
    </tr>
    </tbody>
</table>

JavaScript

$(function() {
    $('#tablefix').tablefix({width: 500, height: 200, fixRows: 2, fixCols: 2});
});

実行結果

ヘッダA ヘッダB ヘッダC ヘッダD ヘッダE
ヘッダ C-1 ヘッダ C-2
データ データ データデータデータデータデータデータデータデータデータデータデータデータ データデータデータデータデータデータデータデータデータデータデータデータ データデータデータデータデータデータデータデータデータデータデータデータ データデータデータデータデータデータデータデータデータデータデータデータ
データ データ データデータデータデータデータデータデータデータデータデータデータデータ データデータデータデータデータデータデータデータデータデータデータデータ データデータデータデータデータデータデータデータデータデータデータデータ データデータデータデータデータデータデータデータデータデータデータデータ
データ データ データデータデータデータデータデータデータデータデータデータデータデータ データデータデータデータデータデータデータデータデータデータデータデータ データデータデータデータデータデータデータデータデータデータデータデータ データデータデータデータデータデータデータデータデータデータデータデータ
データ データ データデータデータデータデータデータデータデータデータデータデータデータ データデータデータデータデータデータデータデータデータデータデータデータ データデータデータデータデータデータデータデータデータデータデータデータ データデータデータデータデータデータデータデータデータデータデータデータ
データ データ データデータデータデータデータデータデータデータデータデータデータデータ データデータデータデータデータデータデータデータデータデータデータデータ データデータデータデータデータデータデータデータデータデータデータデータ データデータデータデータデータデータデータデータデータデータデータデータ


Written by Otchy in: Development | タグ: , , ,

12件のコメント »

  • Yunn より:

    通りすがりに、いただいて帰ります。

    帯に短し、たすきに長し・・・なモノが多くて
    私もよくスクロールしたいだけやねんて!って思ってました。
    が、自力でなんとかする力量もなく。。。

    ちなみに、データはasp.netから吐き出して
    jQueryで縞にしたり選択行色付けしたり
    クリック時に横にチャート出して・・・とかやってたもんで
    先にスクロールにしてから、他のことはIDじゃなくてclassで・・・
    とか、やりましたが、それもこちら側のスクリプトいじるだけで
    思い通りになったので、ほんま助かりました。

    ありがとーございました!

  • Otchy より:

    まさにそう、既存のプラグインは「帯に短したすきに長し」だったので、作ったプラグインになります。
    お役に立てて良かったです!

  • tetsu より:

    非常に簡単で助かりました。
    しかしこれに行追加&削除&コピー、列追加&削除
    をしたいのですが、どうすればよろしいですか?
    現在tablefixを解析中です

  • Otchy より:

    プラグインのページ ( http://www.otchy.net/javascript/tablefix/ ) に、簡単な説明を書いていますが、表示上は 1 つのテーブルであっても、実際は 4 つにコピーされたテーブルを使用して、この動作を実現しています。
    プラグイン実行後の DOM を確認してもらうと、div に囲まれた 4 つのテーブルがあることが確認できるかと思います。

    ですので、行や列の追加削除に関しては、それら 4 つのテーブルに同時に行うことによって可能になります。
    ただ、スクロールの有無について、初期状態でのテーブルの大きさを元に判定している部分があるので、後から行を追加しても意図したとおりにスクロールが発生するとは限りません。
    この点は、静的なテーブルをベースとして考えているこのプラグインの限界でもあります。

    プラグインの内部動作を理解していただければ、行を追加した後、プラグインの効果をいったんキャンセルしてから、再実行するような実装の方が簡単かも知れないですね。

  • tetsu より:

    ご回答ありがとうございます。
    プラグインのキャンセルとはどのようにすればよいのですか?
    初歩的な質問で申し訳ありません。
    納期が迫っており困っております。
    簡単なサンプルとかあれば助かります。

    私の方でも色々調べてやれるだけやってみます。

  • Otchy より:

    具体的に言うと、プラグインの内部動作を理解した上で、その逆の操作をする、という事になります。
    プラグインの動作が理解できれば、プラグインを使用しなくてもテーブルの固定スクロールを実現する方法が分かるかと思うので、プラグインを使わずに実装するというのも、別の方法として考えられますね。プラグインを使わなければ、全てが手の内になるので様々な動作を実現可能かと思います。

    心中お察ししますが、残念ながら私は教師でも上司でもないので、これ以上のサポートは致しかねます。
    社内で技術力のある方に尋ねるか、もっと人数の多いコミュニティに頼るなどした方が良いでしょう。

  • tetsu より:

    ご丁寧に教えていただきありがとうございます。
    列&行の追加削除
    スクロールバーの動的移動
    およびハイライト表示することができました。
    必要以上のサポートを依頼してしまい
    申し訳ありませんでした。

  • とーる より:

    ありがとうございます。

    framesetでやりかけたのですが、諦めて困って探してました。

    どんぴしゃりです。

  • Otchy より:

    お役に立ててよかったです。

  • [...] http://www.otchy.net/20100308/jquery-tablefix-js-had-released/ カテゴリー: 疑似フレーム   パーマリンク ← GIT: 特定のコッミット時といまとの差分を表示 [...]

  • sammy より:

    jQueryのみでここまで出来てとても素晴らしいと思います。
    ただ、一点気になる点があるのですが、横に伸びるスライドバーを右はじまでスライドすると固定しているヘッダのセルとボディのセルとで縦のスライドバー分のズレが生じています。

  • Otchy より:

    報告ありがとうございました。
    さほど大きな問題ではなく、私自身の実用上で困っている部分はないので、すぐに対応する予定はありませんが、将来的なバージョンアップでは修正を検討していこうと思います。

RSS feed for comments on this post. TrackBack URL


Leave a Reply

Powered by WordPress | Aeros Theme | TheBuckmaker.com