jquery.tablefix.js2010-03-08
jquery.tablefix.js は、Excel のウィンドウ枠固定のように、テーブルのヘッダや左側を固定して、残りの部分をスクロールさせるための、jQuery プラグインです。
JavaScript 無効時はただのテーブルとして普通にそのまま表示される点と、他の類似品と違ってソート変更などの高度な機能がない代わりに、すでにデザイン済みの任意のテーブルにそのまま適用出来る点が特徴です。
読み込むのはプラグインだけで、追加の css や画像ファイルは必要ありません。
使い方
- 普通にテーブルをデザインする
- jQuery とプラグインを読み込む
- jQuery のセレクタでテーブルを選択して、プラグインを呼び出す
これだけで、あとはプラグインがよかれにやってくれます。
プラグインの呼び出し方
$('tableSelector').tablefix({width: 600, height: 400, fixRows: 1, fixCols: 2});
指定可能なオプション- width
- テーブル全体がこの横幅に収まるようにします。
- height
- テーブル全体がこの縦の長さに収まるようにします。
- fixRows
- テーブル上部で固定するヘッダの行数を指定します。
- fixCols
- テーブルの左側で固定する列数を指定します。
例えば height と fixCols を指定しなければ、縦の長さは元のテーブルのまま横スクロールだけが発生し、固定列は無くテーブル全体が横スクロールします。
また、width / height を両方とも指定しない場合や、指定した width / height が元々のテーブルサイズよりも大きい場合など、固定スクロールを必要としない場合は、無理にスクロールを追加したりしません。
サンプル
HTML<table id="tablefix1">
<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>
<br />
<table id="tablefix2">
<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>
</tbody>
</table>
<br />
<table id="tablefix3">
<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>
</tr>
<tr>
<td>データ</td>
<td>データ</td>
<td>データデータデータデータデータデータデータデータデータデータデータデータ</td>
<td>データデータデータデータデータデータデータデータデータデータデータデータ</td>
</tr>
<tr>
<td>データ</td>
<td>データ</td>
<td>データデータデータデータデータデータデータデータデータデータデータデータ</td>
<td>データデータデータデータデータデータデータデータデータデータデータデータ</td>
</tr>
</tbody>
</table>
JavaScript
$(function() {
$('#tablefix1').tablefix({width: 500, height: 200, fixRows: 2, fixCols: 2});
$('#tablefix2').tablefix({width: 500, fixCols: 2});
$('#tablefix3').tablefix({height: 200, fixRows: 2});
});
実行結果
| ヘッダA | ヘッダB | ヘッダC | ヘッダD | ヘッダE | |
|---|---|---|---|---|---|
| ヘッダ C-1 | ヘッダ C-2 | ||||
| データ | データ | データデータデータデータデータデータデータデータデータデータデータデータ | データデータデータデータデータデータデータデータデータデータデータデータ | データデータデータデータデータデータデータデータデータデータデータデータ | データデータデータデータデータデータデータデータデータデータデータデータ |
| データ | データ | データデータデータデータデータデータデータデータデータデータデータデータ | データデータデータデータデータデータデータデータデータデータデータデータ | データデータデータデータデータデータデータデータデータデータデータデータ | データデータデータデータデータデータデータデータデータデータデータデータ |
| データ | データ | データデータデータデータデータデータデータデータデータデータデータデータ | データデータデータデータデータデータデータデータデータデータデータデータ | データデータデータデータデータデータデータデータデータデータデータデータ | データデータデータデータデータデータデータデータデータデータデータデータ |
| データ | データ | データデータデータデータデータデータデータデータデータデータデータデータ | データデータデータデータデータデータデータデータデータデータデータデータ | データデータデータデータデータデータデータデータデータデータデータデータ | データデータデータデータデータデータデータデータデータデータデータデータ |
| データ | データ | データデータデータデータデータデータデータデータデータデータデータデータ | データデータデータデータデータデータデータデータデータデータデータデータ | データデータデータデータデータデータデータデータデータデータデータデータ | データデータデータデータデータデータデータデータデータデータデータデータ |
| データ | データ | データデータデータデータデータデータデータデータデータデータデータデータ | データデータデータデータデータデータデータデータデータデータデータデータ | データデータデータデータデータデータデータデータデータデータデータデータ | データデータデータデータデータデータデータデータデータデータデータデータ |
| データ | データ | データデータデータデータデータデータデータデータデータデータデータデータ | データデータデータデータデータデータデータデータデータデータデータデータ | データデータデータデータデータデータデータデータデータデータデータデータ | データデータデータデータデータデータデータデータデータデータデータデータ |
| ヘッダA | ヘッダB | ヘッダC | ヘッダD | ヘッダE | |
|---|---|---|---|---|---|
| ヘッダ C-1 | ヘッダ C-2 | ||||
| データ | データ | データデータデータデータデータデータデータデータデータデータデータデータ | データデータデータデータデータデータデータデータデータデータデータデータ | データデータデータデータデータデータデータデータデータデータデータデータ | データデータデータデータデータデータデータデータデータデータデータデータ |
| データ | データ | データデータデータデータデータデータデータデータデータデータデータデータ | データデータデータデータデータデータデータデータデータデータデータデータ | データデータデータデータデータデータデータデータデータデータデータデータ | データデータデータデータデータデータデータデータデータデータデータデータ |
| データ | データ | データデータデータデータデータデータデータデータデータデータデータデータ | データデータデータデータデータデータデータデータデータデータデータデータ | データデータデータデータデータデータデータデータデータデータデータデータ | データデータデータデータデータデータデータデータデータデータデータデータ |
| ヘッダA | ヘッダB | ヘッダC | |
|---|---|---|---|
| ヘッダ C-1 | ヘッダ C-2 | ||
| データ | データ | データデータデータデータデータデータデータデータデータデータデータデータ | データデータデータデータデータデータデータデータデータデータデータデータ |
| データ | データ | データデータデータデータデータデータデータデータデータデータデータデータ | データデータデータデータデータデータデータデータデータデータデータデータ |
| データ | データ | データデータデータデータデータデータデータデータデータデータデータデータ | データデータデータデータデータデータデータデータデータデータデータデータ |
| データ | データ | データデータデータデータデータデータデータデータデータデータデータデータ | データデータデータデータデータデータデータデータデータデータデータデータ |
| データ | データ | データデータデータデータデータデータデータデータデータデータデータデータ | データデータデータデータデータデータデータデータデータデータデータデータ |
制限事項
- テーブルの中にフォームが含まれるとフォーム自体が誤動作する可能性があります。
- テーブルに colspan や rowspan が含まれる場合、その位置によっては正しく動作しない場合があります。
- jQuery 1.2 系では動作しません。1.3 系、1.4 系で動作するはずです。
技術的な話
既存の様々な実装を参考にしつつ、固定スクロールを実現するために、以下のような方法を使っています。細かい部分は省いていますが、概ねこんな感じです。
- 元のテーブルから、スクロールさせる原点となる座標を求める。
- テーブルを 3 つコピーして、全部で 4 つの全く同じテーブルを用意。
- 全体を 1 つの div で囲い、さらに 4 つのテーブルの周りをそれぞれまた div で囲う。
- 全体の div に対しては、"relative"、4 つの div は "absolute" に position を指定。
- 4 つの div がそれぞれ、左上固定部 / 上固定行 / 左固定列 / スクロール部 になるよう、スクロール原点に合わせて、left と top を動かす。
- 4 つの div それぞれに、画面上に見せたい範囲の width と height を設定する。
- 上固定行 / 左固定列 / スクロール部 については、見えてはいけない部分を隠すため、ネガティブマージンを設定する。
- 上固定行 / 左固定列は、overflow を hidden にして、スクロールをスクロール部と同期させる。
更新履歴
- 2010-03-08 [Ver 1.0.0]
- 初版リリース
- 2013-06-13 [Ver 1.0.1]
- 複数のエレメントに対して適用した際に、width と height が少しずつずれていく問題を修正。