【CSS】テーブルヘッダーを縦スクロールで固定する方法

テーブルヘッダーを縦スクロールで固定する方法のシステム開発備忘録です。
テーブルのヘッダーを固定する要望は多いと思いますが、何かと面倒なプログラミングになってしまいます。

テーブルヘッダーを固定する方法

そこで、今回は主にCSSとjQueryでテーブルのヘッダーを固定する方法を調査テストしたので、その備忘録です。

1)テーブルのヘッダー部、ボディー部、フッター部をfloat: left;します。
  floatにすることでoverflowが有効になります。
  ヘッダー部、ボディー部、フッター部と横に伸びて行く事になります。
  そこで後程、折り返しが付くようにtdもしくはthの幅をjqueryにて求めてセットします。
2)ヘッダー部の高さを決めます。
  今回のテストでは200pxにしています。
  また、スクロールバーが表示されるように設定します。
3)th,tdの高さや幅を要件沿って設定します。
  jqueryで立ち上げ時に幅を求めます。
  幅が動的に変更されるような場合は再度設定する必要があります。
4)Jqueryでテーブル幅を設定します。
  今回は各thの幅+border幅を足して行きます。
  最後にテーブルのborder幅とスクロール幅を足しました。
  調整が必要な場合も有るようですので、動かして確かめてください。

コードを下に示します。

<html>
<head>
  <script src="http://code.jquery.com/jquery-latest.min.js"></script>
  <style>
    /*thead,tbody,tfoot*/
    #tableA > thead,
    #tableA > tbody,
    #tableA > tfoot {
      float: left; /*overflowを有効化*/
    }
 
    #tableA > tbody {
      height: 200px;
      overflow: auto;
    }
 
    /*th,td*/
    #tableA th,
    #tableA td {
      height: 50px;
    }
    .cA{
      width:60px;
    }
    .cB{
      width:50px;
    }
    .cC{
      width:90px;
    }
    .cD{
      width:60px;
    }
    .cE{
      width:40px;
    }
    .cF{
      width:40px;
    }
    .cG{
      width:40px;
    }
 
    /*border*/
    #tableA {
      border: solid 1px black;
    }
 
    #tableA > thead > tr > th {
      border: solid 1px blue;
      background-color:lightblue;
    }
 
    #tableA > tbody > tr > td{
      border: solid 1px blue;
    }
    #tableA > tfoot > tr > td {
      border: solid 1px blue;
    }
  </style>
 
  <script type="text/javascript">
 
    $(document).ready(function () {
   //thの幅の合計を求める
      var w=0;
      $("#tableA > thead > tr >th").each(function (i) {
        w=w+$(this).width()+2;
      });
      $("#tableA").width(w + 16+2);
      $("#tableA > thead").width(w + 16+2);
      $("#tableA > tbody").width(w + 16+2);
      $("#tableA > tfoot").width(w + 16+2);
 
      $("#tableA > tr").width(w);

    });
  </script>
</head>
<body>
    <table id="tableA" cellspacing="0" cellpadding="0" style="border-collapse:collapse;">
      <caption>縦スクロール</caption>
      <thead>
        <tr>
          <th class="cA">A</th>
          <th class="cB">B</th>
          <th class="cC">C</th>
          <th class="cD">D</th>
          <th class="cE">E</th>
          <th class="cF">F</th>
          <th class="cG">G</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td class="cA">A1</td>
          <td class="cB">B1</td>
          <td class="cC">C1</td>
          <td class="cD">D1</td>
          <td class="cE">E1</td>
          <td class="cF">F1</td>
          <td class="cG">G1</td>
        </tr>
        <tr>
          <td class="cA">A2</td>
          <td class="cB">B2</td>
          <td class="cC">C2</td>
          <td class="cD">D2</td>
          <td class="cE">E2</td>
          <td class="cF">F2</td>
          <td class="cG">G2</td>
  </tr>
        <tr>
          <td class="cA">A3</td>
          <td class="cB">B3</td>
          <td class="cC">C3</td>
          <td class="cD">D3</td>
          <td class="cE">E3</td>
          <td class="cF">F3</td>
          <td class="cG">G3</td>
 </tr>
        <tr>
          <td class="cA">A4</td>
          <td class="cB">B4</td>
          <td class="cC">C4</td>
          <td class="cD">D4</td>
          <td class="cE">E4</td>
          <td class="cF">F4</td>
          <td class="cG">G4</td>
 </tr>
        <tr>
          <td class="cA">A5</td>
          <td class="cB">B5</td>
          <td class="cC">C5</td>
          <td class="cD">D5</td>
          <td class="cE">E5</td>
          <td class="cF">F5</td>
          <td class="cG">G5</td>
 </tr>
        <tr>
          <td class="cA">A6</td>
          <td class="cB">B6</td>
          <td class="cC">C6</td>
          <td class="cD">D6</td>
          <td class="cE">E6</td>
          <td class="cF">F6</td>
          <td class="cG">G6</td>
 </tr>
        <tr>
          <td class="cA">A7</td>
          <td class="cB">B7</td>
          <td class="cC">C7</td>
          <td class="cD">D7</td>
          <td class="cE">E7</td>
          <td class="cF">F7</td>
          <td class="cG">G7</td>
 </tr>
      </tbody>
    </table>
</body>
</html>

縦スクロールだけで有れば割と簡単にテーブルヘッダーの固定ができます。
以上、テーブルヘッダーを縦スクロールで固定する方法のシステム開発備忘録でした。

修正2020/06/12

以前載せていたコードが上手く動作しないことを発見しました。
原因は古いjQueryを参照しようとしていてGoogleapis.com から取得できない事でした。
下のバージョンがNGの読み込みです。

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>

修正したjQueryの参照先を下に示しておきます。

<script src="http://code.jquery.com/jquery-latest.min.js"></script>

修正前のコードを参照してjQueryが動かなかった方が居られましたら、この場を借りてお詫びいたします。申し訳ありませんでしたm(_ _)m