CSSでテーブルの一部を固定してスクロールさせる方法(IEはjQueryで対応)
HTMLで組んだテーブルを使って表示したいことがある時に、長くなりすぎてスペースに入り切らなかったり、見た目がよろしくない感じになることがあります。
そういう場合に「Excelのウィンドウ枠の固定」のように、一部を固定してスクロールさせる方法をご紹介します。
IE非対応でも問題がない場合は、CSSプロパティ「position: sticky;」を使用すれば一発で実装可能です。
stickyで固定してスクロール
HTML
<div class="table-outer"> <table> <tr class="sticky"> <th>見出し</th> <th>見出し</th> <th>見出し</th> </tr> <tr> <td>テキスト</td> <td>テキスト</td> <td>テキスト</td> </tr> <tr> <td>テキスト</td> <td>テキスト</td> <td>テキスト</td> </tr> <tr> <td>テキスト</td> <td>テキスト</td> <td>テキスト</td> </tr> <tr> <td>テキスト</td> <td>テキスト</td> <td>テキスト</td> </tr> <tr> <td>テキスト</td> <td>テキスト</td> <td>テキスト</td> </tr> </table> </div>
CSS
body {
margin: 0;
}
.table-outer {
height: 300px;
overflow-y: scroll;
}
table {
width: 100%;
border-spacing: 0;
border-collapse: collapse;
}
th, td {
padding: 20px;
text-align: center;
vertical-align: middle;
border: 1px solid #ccc;
}
th {
color: #fff;
background: #333;
}
td {
height: 150px;
}
.sticky th {
position: sticky;
top: 0;
}
.sticky th:before {
position: absolute;
top: -1px;
left: -1px;
width: 100%;
height: 100%;
content: "";
border: 1px solid #ccc;
}
簡単な解説
「position: sticky;」は「指定された場所までいくと固定」される仕様です。上部で固定したいので、「top: 0;」を指定しています。
スクロールされている要素が見えてしまうのを防ぐため、「:before」で固定した要素に枠線を設定しています。
stickyはIE非対応
「position: sticky;」は今の所IE非対応です。
works with table cellsremoved for consistency until Firefox makes a native implementation
「IEではthが固定されない」というだけで表示には問題がないため、割り切って使うのもありだと思いますがIEに対応したい場合の記述もご紹介します。
IEに対応させるためjQueryで固定
HTML
<div class="table-outer"> <table> <tr class="fixed"> <th>見出し</th> <th>見出し</th> <th>見出し</th> </tr> <tr> <td>テキスト</td> <td>テキスト</td> <td>テキスト</td> </tr> <tr> <td>テキスト</td> <td>テキスト</td> <td>テキスト</td> </tr> <tr> <td>テキスト</td> <td>テキスト</td> <td>テキスト</td> </tr> <tr> <td>テキスト</td> <td>テキスト</td> <td>テキスト</td> </tr> <tr> <td>テキスト</td> <td>テキスト</td> <td>テキスト</td> </tr> </table> </div>
CSS
body {
margin: 0;
}
.table-outer {
height: 300px;
overflow-y: scroll;
}
table {
width: 100%;
border-spacing: 0;
border-collapse: collapse;
}
th, td {
box-sizing: border-box;
padding: 20px;
text-align: center;
vertical-align: middle;
border: 1px solid #ccc;
}
th {
color: #fff;
background: #333;
}
td {
height: 150px;
}
.fixed {
position: fixed;
top: 0;
}
jQuery
$(function() {
var tdWidth = $('.fixed + tr td').width();
$('.fixed th').width(tdWidth);
var fixedHeight = $('.fixed').height();
$('table').css('margin-top',fixedHeight);
});
簡単な解説
IEではstickyが使えないため、fixedを使用します。
fixedを指定するとwidthが要素内に記述されている文字列の長さの幅になるため、次の行のtdのwidthを取得して指定します。
このままでは固定した行の下に次の行が潜ってしまうため、固定した行の高さを取得しtableの上marginに指定します。
fixedは位置指定をブラウザからの位置で指定するため、tableでの使い勝手はあまりよくありません。
はやいところstickyがIEで標準対応されるか、stickyfillがtableでも使えるようになってほしいですね。
MovableType/WordPressを使ったホームページ制作、機能追加や設置代行などの改修、システム開発、サイトの保守を手掛けております。
アナタが実現させたい機能、やりたい事をお聞かせいただけませんか? そのイメージを一緒に実現しましょう!
お問い合わせは以下のページから!!