⛳
table要素のcss操作が難しい
table要素をカスタマイズしたいことがあったが、CSSが思うようにハマらなかったのでそこで得た知見の備忘録。
tableを画面幅に応じて横スクロールさせる
- セルは親要素の幅に応じて自動伸縮するので、
min-width
やtext-wrap: nowrap
を使ってセルが小さくなりすぎないようにする - table要素をラッピングするdiv要素を作り
overflow-x: auto
を指定
{/* overflowを入れる */}
<div className="overflow-x-auto">
<table>
<thead>
{Array.from({length: 20}).map((_, i) => (
{/* text-wrap: nowrapやmin-widthを入れて縮まないようにする */}
<th key={i} className="text-nowrap">{ i + 1 }列目</th>
))}
</thead>
</table
<div>
tbody部分だけを縦スクロールさせる
- table要素には直接heightを指定できないため、ラッピング要素に固定値の
height
を指定する - ラッピング要素に
overflow: auto
を適用 - thead要素に
position: sticky
とtop: 0px
を指定する
{/* heightとoverflow: autoを入れる */}
<div className="h-[500px] overflow-auto">
<table>
{/* position: stickyとtop: 0px を入れる */}
<thead className="sticky top-0">
{Array.from({length: 20}).map((_, i) => (
<th>{ i + 1 }列目</th>
))}
</thead>
</table
<div>
theadとtbodyにスペースを開ける
thead
にmarginを直接指定できないが、下記の方法で対応できる。
擬似要素を使う
thead
に擬似要素でmargin-bottom
をつける
<div>
<table>
{/* 擬似要素でmargin-bottomを入れる */}
<thead className="after:block after:content-[''] after:mb-10">
<tr>
{Array.from({ length: 20 }).map((_, i) => (
<th key={i}>{ i + 1 }列目</th>
))}
</tr>
</thead>
<tbody>
{Array.from({ length: 200 }).map((_, i) => (
<tr key={i}>
{Array.from({ length: 20 }).map((_, i) => (
<td key={i}>🥺🥺</td>
))}
</tr>
))}
</tbody>
</table>
</div>
空行を入れる
<div>
<table>
<thead>
<tr>
{Array.from({ length: 20 }).map((_, i) => (
<th key={i}>{ i + 1 }列目</th>
))}
</tr>
</thead>
{/* 空のtrを入れる */}
<tr className="h-10"></tr>
<tbody>
{Array.from({ length: 200 }).map((_, i) => (
<tr key={i}>
{Array.from({ length: 20 }).map((_, i) => (
<td key={i}>🥺🥺</td>
))}
</tr>
))}
</tbody>
</table>
</div>
行の特定の列だけを縦に結合する
- 縦結合したtdを1つのtrにする
- 1で結合した行分だけtrを作る
- 結合したtdの
rowSapn
に一行としたいtrの数を入れる
<table>
<thead>
<tr>
{Array.from({ length: 3 }).map((_, i) => (
<th key={i}>{ i + 1 }列目</th>
))}
</tr>
</thead>
<tbody>
{/* 1列目の縦2行を結合 */}
<tr>
{/* 1行に存在するtrの数をrowSpanに入れる */}
<td rowSpan={3}>
1列目
</td>
</tr>
<tr>
<td>2列目-上段</td>
<td>2列目-下段</td>
</tr>
<tr>
<td>3列目-上段</td>
<td>3列目-下段</td>
</tr>
</tbody>
</table>
Discussion