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 divs 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
 
     
     
     
    