I want to to create a table with fixed thead
and tfoot
and a scrollable tbody
!
I've tried several approaches, both CSS only and CSS + Javascript, but they are all weak and unreliable and I can easily break them by changing the markup in the demo.
What I want is a way to have the table to behave like a table, this means that the browser will automatically adjust columns based on the content (both at page load that in case of window resize) and that in these scenarios:
if the content of the column's header (thead > tr > th
) is larger than the content of the column's body (tbody > tr > td
) and larger than the content of the column's footer (tfoot > tr > td
) the column should resize based on the size of the column's header
if the content of the column's body (tbody > tr > td
) is larger than the content of the column's header (thead > tr > th
) and larger than the content of the column's footer (tfoot > tr > td
) the column should resize based on the size of the column's body
if the content of the column's footer (tfoot > tr > td
) is larger than the content of the column's header (thead > tr > th
) and larger than the content of the column's body (tbody > tr > td
) the column should resize based on the size of the column's footer
The table
below should clarify the scenarios:
<table>
<thead>
<tr>
<th>Header one *leads the width* (case 1)</th>
<th>Header two</th>
<th>Header three</th>
</tr>
</thead>
<tbody>
<tr>
<td>Column one</td>
<td>Column two *leads the width* (case 2)</td>
<td>Column three</td>
</tr>
</tbody>
<tfoot>
<tr>
<td>Footer one</td>
<td>Footer two</td>
<td>Footer three *leads the width* (case 3)</td>
</tr>
</tfoot>
</table>
I want a clean (as possible) and reliable solution that will work for the different scenarios, possibly CSS only but also JavaScript is OK (vanilla and clean JavaScript, not jQuery plugins).
I don't care about old browser support (it would be great to have it or at least to reach a solution which can degrade gracefully on old browser but it's optional)... I can even accept to use div
s instead of table nodes if the final solution works as expected... so in 2016, with modern browser and CSS is this possible somehow?!
EDIT:
The body should scroll vertically and the table may have any number of columns
UPDATE:
I came up with this solution: https://codepen.io/daveoncode/pen/LNomBE
but I'm still not 100% satisfied. The main issue is that I can't set different backgrounds for header and footer cells.
UPDATE 2:
it works now!
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…