🥥
【CSS】tableのヘッダーを固定して縦スクロールするメモ
th
,td
を幅指定したがレイアウトがぐちゃる
調べていたらthead
とtbody
をblock
要素にして、tbody
にoverflow-y:auto;
を付与する方法があったのでやってみました。
<div style="width:500px; height:300px; border-width: 1px;">
<table style="width:100%; text-align: left;border: 1px solid black; table-layout: fixed;border-collapse: collapse;">
<thead style="width:100%;display:block;">
<tr style="width:500px;">
<th style="width:25%; border: 1px solid black;">ユーザー名</th>
<th style="width:25%; border: 1px solid black;">メールアドレス</th>
<th style="width:25%; border: 1px solid black;">部署</th>
<th style="width:25%; border: 1px solid black;">役職</th>
</tr>
</thead>
<tbody style="width:100%;display:block; max-height:50px; overflow-x: hidden; overflow-y: auto;">
<tr style="width:500px;">
<td style="width:25%; border: 1px solid black;">田中太郎</td>
<td style="width:25%; border: 1px solid black;">tana@aa.aa</td>
<td style="width:25%; border: 1px solid black;">総務</td>
<td style="width:25%; border: 1px solid black;">部長</td>
</tr>
<tr style="width:500px;">
<td style="width:25%; border: 1px solid black;">山本次郎</td>
<td style="width:25%; border: 1px solid black;">yama@bb.bb</td>
<td style="width:25%; border: 1px solid black;">経理</td>
<td style="width:25%; border: 1px solid black;">係長</td>
</tr>
<tr style="width:500px;">
<td style="width:25%; border: 1px solid black;">山田三郎</td>
<td style="width:25%; border: 1px solid black;">yama@cc.cc</td>
<td style="width:25%; border: 1px solid black;">営業</td>
<td style="width:25%; border: 1px solid black;">主任</td>
</tr>
</tbody>
</table>
</div>
tbody
にoverflow-x: hidden;
としているのは、スクロールバーが表示されたときにthead
とtbody
でスクロールバーの幅分幅がずれるのを隠すためです。
th
、td
要素の幅を任意に固定したかったのですが、以下のように右側に変な隙間ができてうまくいきませんでした。
解決法
thead
とtbody
のtr
要素にdisplay:flex;
を加えることで思った表示になりました。
<div style="width:500px; height:300px; border-width: 1px;">
<table style="width:100%; text-align: left;border: 1px solid black; table-layout: fixed;border-collapse: collapse;">
<thead style="width:100%;display:block;">
- <tr style="width:500px;">
+ <tr style="display:flex; width:500px;">
<th style="width:25%; border: 1px solid black;">ユーザー名</th>
<th style="width:25%; border: 1px solid black;">メールアドレス</th>
<th style="width:25%; border: 1px solid black;">部署</th>
<th style="width:25%; border: 1px solid black;">役職</th>
</tr>
</thead>
<tbody style="width:100%;display:block; max-height:50px; overflow-x: hidden; overflow-y: auto;">
- <tr style="width:500px;">
+ <tr style="display:flex; width:500px;">
<td style="width:25%; border: 1px solid black;">田中太郎</td>
<td style="width:25%; border: 1px solid black;">tana@aa.aa</td>
<td style="width:25%; border: 1px solid black;">総務</td>
<td style="width:25%; border: 1px solid black;">部長</td>
</tr>
- <tr style="width:500px;">
+ <tr style="display:flex; width:500px;">
<td style="width:25%; border: 1px solid black;">山本次郎</td>
<td style="width:25%; border: 1px solid black;">yama@bb.bb</td>
<td style="width:25%; border: 1px solid black;">経理</td>
<td style="width:25%; border: 1px solid black;">係長</td>
</tr>
- <tr style="width:500px;">
+ <tr style="display:flex; width:500px;">
<td style="width:25%; border: 1px solid black;">山田三郎</td>
<td style="width:25%; border: 1px solid black;">yama@cc.cc</td>
<td style="width:25%; border: 1px solid black;">営業</td>
<td style="width:25%; border: 1px solid black;">主任</td>
</tr>
</tbody>
</table>
</div>
そのほかthead
をsticky
にする方法などもあるみたいです。
Discussion