2010年5月5日水曜日

HTMLのテーブル(table)を行列固定でスクロールさせる

技術屋さんの視点からは「結構キツイな~」と思うことでも、お客様からは「えっ!?それぐらいできないの?」なんて思われることが結構あります。

その代表格はtableをExcelっぽくして欲しい、という要望ではないでしょうか。
なまじっかGooleDocsなんてものがあったりするのでExcelを日常的に使用されているお客様はWEBでもそのようなI/Fを求められます。

ExcelっぽいHTMLテーブル、、
結構キツイのよね・・・。

Flash使える場合はその方向になりますが、1画面だけ、なんて要件でしたらJavascriptで何とかしたい。

JSでテーブルをExcelっぽくするライブラリには、まとまったものではYahooUIやDojoがありますが、行列を固定したスクロールは調べた限りでは出来なさそうでした。

そんな時のJSライブラリ。


・Super Tables

http://www.matts411.com/post/super_tables/

※参考
http://c-brains.jp/blog/wsg/09/06/16-151445.php

1. CSSとJSのロード

こんな感じで。

<style type="text/css"> 
  @import "/js/Super_Tables_0_30beta_compressed/stylesheets/superTables_compressed.css";
</style> 
<script src="/js/Super_Tables_0_30beta_compressed/javascripts/superTables_compressed.js" type="text/javascript"></script>

2. テーブル全体のスタイル

こんな感じで。

<style type="text/css">
.fakeContainer {
    margin: 0 0 20px;
    border: none;
    width: 400px;
    height: 100px;
    overflow: hidden;
}
</style>

3. テーブル作成

<div class="fakeContainer">
<table id="demoTableA">
  <tr>
    <th>header00</th>
    <th>header01</th>
    <th>header02</th>
    <th>header03</th>
    <th>header04</th>
    <th>header05</th>
    <th>header06</th>
    <th>header07</th>
    <th>header08</th>
    <th>header09</th>
  </tr>
  <tr>
    <th>header10</th>
    <th>header11</th>
    <th>header12</th>
    <th>header13</th>
    <th>header14</th>
    <th>header15</th>
    <th>header16</th>
    <th>header17</th>
    <th>header18</th>
    <th>header19</th>
  </tr>
  <tr>
    <td>data00</td>
    <td>data01</td>
    <td>data02</td>
    <td>data03</td>
    <td>data04</td>
    <td>data05</td>
    <td>data06</td>
    <td>data07</td>
    <td>data08</td>
    <td>data09</td>
  </tr>
  <tr>
    <td>data10</td>
    <td>data11</td>
    <td>data12</td>
    <td>data13</td>
    <td>data14</td>
    <td>data15</td>
    <td>data16</td>
    <td>data17</td>
    <td>data18</td>
    <td>data19</td>
  </tr>
  <tr>
    <td>data20</td>
    <td>data21</td>
    <td>data22</td>
    <td>data23</td>
    <td>data24</td>
    <td>data25</td>
    <td>data26</td>
    <td>data27</td>
    <td>data28</td>
    <td>data29</td>
  </tr>
  <tr>
    <td>data30</td>
    <td>data31</td>
    <td>data32</td>
    <td>data33</td>
    <td>data34</td>
    <td>data35</td>
    <td>data36</td>
    <td>data37</td>
    <td>data38</td>
    <td>data39</td>
  </tr>
</table>
</div>

4. 行列固定設定

HTMLを読み込んでからこんな感じでスクリプト実行。
(</body>直前に書けばいい)

<script type="text/javascript">
//<![CDATA[
(function () {
 new superTable("demoTableA", {
  cssSkin : "sOrange", // eg. "sDefault", "sSky", "sOrange", "sDark"
  headerRows : 1, // 固定する行数
  fixedCols : 1 // 固定する列数
  // onStart : function(), // スクリプトを実行できるらしい(試してない)
  // onFinish : function(), // スクリプトを実行できるらしい(試してない)
 });
})();
//]]>
</script>


・jquery

※元ネタ
http://fixed-header-using-jquery.blogspot.com/2009/05/scrollable-table-with-fixed-header-and.html

上述のSuper Tablesでほとんどの場合は事足りることと思われますが、テーブルにFormを入れ込まないといけなくなると途端に使えなくなります。
Super Tablesは普通のtable記述にclass打つだけで実現できるので非常に分かりやすいのですが、固定スクロールを実現するために裏でダミーのtableを複製したりしており、formをsubmitした際に新しいデータが飛んできません。(同一nameやidを持つformエレメントがSuper Tablesによって裏でいくつか複製されます。)

Super Tablesに比べてやや分かりにくくはなりますが、Pavanさんが作成してくれたリンク先のスクリプトを適用すればFormが入ったスクロールテーブルも実現可能です。
確かめてはいませんが、IE6、7、8、FF3、3.5、Chrom2で動作するとのことです。

また、リンク先の記述ではjquery-1.3.2.jsを使用していますが、jquery-1.4.2.min.jsでも動作しています。

※デモ
http://acatalept.com/common/test/fixed-table.html
※ソース
http://snipt.org/loz

0 件のコメント:

コメントを投稿