table で左端ヘッダーを固定する
◆ スクロールバーの範囲外と範囲内に固定の列をつくる
◆ 範囲内の固定列分のスペースを確保するようにダミーの tr を最初に入れる
◆ 固定したい td を absolute で固定
◆ 範囲内の固定列分のスペースを確保するようにダミーの tr を最初に入れる
◆ 固定したい td を absolute で固定
前にテーブルでも css でいろいろできると知ったので 今回は横をスクロール固定してみます
縦スクロールの固定は HTML 構造が行単位なので thead の tr を移動するだけで簡単そうですが 横スクロールはいろいろと大変です
作ったものはこんなの
なんと IE8 でも動きました
複雑な css は使ってないですし
サンプル
スクロールバーの外側と内側で固定する列を作ってます
コードはこんなの
内側をうまく配置するために見えないダミーの行が一番最初にあります
スクロールバー出すために table-layout が fixed なので width で指定が必要ですが position:absolute; で固定しているので height も必須になります
高さ自動にするならテーブル表示後すぐに JavaScript で行内の一番 height が大きい要素に合わせることになりそうです
それと colspan や rowspan が混ざってくるとずれてきそうです
css のデザインと colspan, rowspan の相性って最悪だと思うんです
HTML として colspan や rowspan じゃなくて td に対して「上と結合」や「左と結合」という属性にして td は綺麗に縦横で数が揃ってるようになってほしいです
2 つめの tbody だけ見れば全く問題なしです
CSS Selector で扱うときも .tbody を通せば dummy を気にせず使えます
縦スクロールの固定は HTML 構造が行単位なので thead の tr を移動するだけで簡単そうですが 横スクロールはいろいろと大変です
作ったものはこんなの
なんと IE8 でも動きました
複雑な css は使ってないですし
サンプル
スクロールバーの外側と内側で固定する列を作ってます
コードはこんなの
<!doctype html>
<meta charset="utf-8">
<div class="area">
<div class="wrapper">
<table>
<tr class="dummy"><td></td><td></td><td></td><td></td></tr>
<tr><td class="out-of-table-fixed">表の外側で固定</td><td class="in-table-fixed">表の内側で固定</td><td>ここから右のセルだけがスクロールされます</td><td>text1</td><td>あいうえお</td></tr>
<tr><td class="out-of-table-fixed">表の外側で固定</td><td class="in-table-fixed">表の内側で固定</td><td>ここから右のセルだけがスクロールされます</td><td>text2</td><td>かきくけこ</td></tr>
<tr><td class="out-of-table-fixed">表の外側で固定</td><td class="in-table-fixed">表の内側で固定</td><td>ここから右のセルだけがスクロールされます</td><td>text3</td><td>さしすせそ</td></tr>
</table>
</div>
</div>
<style>
*{
box-sizing:border-box;
font-family:meiryo;}
.area{
width:564px;
position:relative;
border:12px solid darkslateblue;
background:#FFE2FA;}
.wrapper{
width:360px;
overflow:auto;
margin-left:180px;}
table{
background:mintcream;
table-layout:fixed;
width:100%;
border-spacing:0;}
td{
width:180px;
height:60px;
padding:0;
border-right:2px solid red;
border-bottom:2px solid red;
vertical-align:top;}
tr td:first-child{
border-left:2px solid red;}
tr.dummy+tr td{
border-top:2px solid red;}
tr.dummy,tr.dummy *{
height:0;
border:0;
font-size:0;
visibility:hidden;}
td.out-of-table-fixed{
position:absolute;
left:0px;}
td.in-table-fixed{
position:absolute;
background:mintcream;
left:180px;}
</style>
<meta charset="utf-8">
<div class="area">
<div class="wrapper">
<table>
<tr class="dummy"><td></td><td></td><td></td><td></td></tr>
<tr><td class="out-of-table-fixed">表の外側で固定</td><td class="in-table-fixed">表の内側で固定</td><td>ここから右のセルだけがスクロールされます</td><td>text1</td><td>あいうえお</td></tr>
<tr><td class="out-of-table-fixed">表の外側で固定</td><td class="in-table-fixed">表の内側で固定</td><td>ここから右のセルだけがスクロールされます</td><td>text2</td><td>かきくけこ</td></tr>
<tr><td class="out-of-table-fixed">表の外側で固定</td><td class="in-table-fixed">表の内側で固定</td><td>ここから右のセルだけがスクロールされます</td><td>text3</td><td>さしすせそ</td></tr>
</table>
</div>
</div>
<style>
*{
box-sizing:border-box;
font-family:meiryo;}
.area{
width:564px;
position:relative;
border:12px solid darkslateblue;
background:#FFE2FA;}
.wrapper{
width:360px;
overflow:auto;
margin-left:180px;}
table{
background:mintcream;
table-layout:fixed;
width:100%;
border-spacing:0;}
td{
width:180px;
height:60px;
padding:0;
border-right:2px solid red;
border-bottom:2px solid red;
vertical-align:top;}
tr td:first-child{
border-left:2px solid red;}
tr.dummy+tr td{
border-top:2px solid red;}
tr.dummy,tr.dummy *{
height:0;
border:0;
font-size:0;
visibility:hidden;}
td.out-of-table-fixed{
position:absolute;
left:0px;}
td.in-table-fixed{
position:absolute;
background:mintcream;
left:180px;}
</style>
内側をうまく配置するために見えないダミーの行が一番最初にあります
スクロールバー出すために table-layout が fixed なので width で指定が必要ですが position:absolute; で固定しているので height も必須になります
高さ自動にするならテーブル表示後すぐに JavaScript で行内の一番 height が大きい要素に合わせることになりそうです
それと colspan や rowspan が混ざってくるとずれてきそうです
css のデザインと colspan, rowspan の相性って最悪だと思うんです
HTML として colspan や rowspan じゃなくて td に対して「上と結合」や「左と結合」という属性にして td は綺麗に縦横で数が揃ってるようになってほしいです
追記
ダミーの行が混ざってるのが気持ち悪い気がしたので tbody にわけてみました<table>
<tbody>
<tr class="dummy"><td></td><td></td><td></td><td></td></tr>
</tbody>
<tbody class="tbody">
<tr><td class="out-of-table-fixed">表の外側で固定</td><td class="in-table-fixed">表の内側で固定</td><td>ここから右のセルだけがスクロールされます</td><td>text1</td><td>あいうえお</td></tr>
<tr><td class="out-of-table-fixed">表の外側で固定</td><td class="in-table-fixed">表の内側で固定</td><td>ここから右のセルだけがスクロールされます</td><td>text2</td><td>かきくけこ</td></tr>
<tr><td class="out-of-table-fixed">表の外側で固定</td><td class="in-table-fixed">表の内側で固定</td><td>ここから右のセルだけがスクロールされます</td><td>text3</td><td>さしすせそ</td></tr>
</tbody>
</table>
<tbody>
<tr class="dummy"><td></td><td></td><td></td><td></td></tr>
</tbody>
<tbody class="tbody">
<tr><td class="out-of-table-fixed">表の外側で固定</td><td class="in-table-fixed">表の内側で固定</td><td>ここから右のセルだけがスクロールされます</td><td>text1</td><td>あいうえお</td></tr>
<tr><td class="out-of-table-fixed">表の外側で固定</td><td class="in-table-fixed">表の内側で固定</td><td>ここから右のセルだけがスクロールされます</td><td>text2</td><td>かきくけこ</td></tr>
<tr><td class="out-of-table-fixed">表の外側で固定</td><td class="in-table-fixed">表の内側で固定</td><td>ここから右のセルだけがスクロールされます</td><td>text3</td><td>さしすせそ</td></tr>
</tbody>
</table>
2 つめの tbody だけ見れば全く問題なしです
CSS Selector で扱うときも .tbody を通せば dummy を気にせず使えます
document.querySelectorAll("table .tbody tr")
document.querySelector("table .tbody tr:nth-child(" + n + ")")
document.querySelector("table .tbody tr:nth-child(" + n + ")")