Di recente ho avuto un problema simile e ho finito per risolverlo usando una combinazione di soluzioni diverse.
Il primo e il più semplice era usare due tavoli, uno per le intestazioni e uno per il corpo. Funziona ma le intestazioni e le colonne del corpo non sono allineate. E, dal momento che volevo usare la dimensione automatica fornita con le tabelle bootstrap di Twitter, ho finito per creare una funzione Javascript che cambia le intestazioni quando: il corpo è reso; le finestre vengono ridimensionate; i dati nella colonna cambiano, ecc.
Ecco alcuni dei codici che ho usato:
<table class="table table-striped table-hover" style="margin-bottom: 0px;">
<thead>
<tr>
<th data-sort="id">Header 1</i></th>
<th data-sort="guide">Header 2</th>
<th data-sort="origin">Header 3</th>
<th data-sort="supplier">Header 4</th>
</tr>
</thead>
</table>
<div class="bodycontainer scrollable">
<table class="table table-hover table-striped table-scrollable">
<tbody id="rows"></tbody>
</table>
</div>
Le intestazioni e il corpo sono divisi in due tabelle separate. Uno di questi è all'interno di un DIV con lo stile necessario per generare le barre di scorrimento verticali. Ecco il CSS che ho usato:
.bodycontainer {
//height: 200px
width: 100%;
margin: 0;
}
.table-scrollable {
margin: 0px;
padding: 0px;
}
Ho commentato l'altezza qui perché volevo che la tabella raggiungesse il fondo della pagina, qualunque sia l'altezza della pagina.
Gli attributi di ordinamento dei dati che ho usato nelle intestazioni sono usati anche in ogni td. In questo modo ho potuto ottenere la larghezza e l'imbottitura di ogni td e la larghezza della riga. Usando gli attributi di ordinamento dei dati ho impostato usando CSS il riempimento e la larghezza di ciascuna intestazione di conseguenza e della riga di intestazione che è sempre più grande poiché non ha una barra di scorrimento. Ecco la funzione che utilizza coffeescript:
fixHeaders: =>
for header, i in @headers
tdpadding = parseInt(@$("td[data-sort=#{header}]").css('padding'))
tdwidth = parseInt(@$("td[data-sort=#{header}]").css('width'))
@$("th[data-sort=#{header}]").css('padding', tdpadding)
@$("th[data-sort=#{header}]").css('width', tdwidth)
if (i+1) == @headers.length
trwidth = @$("td[data-sort=#{header}]").parent().css('width')
@$("th[data-sort=#{header}]").parent().parent().parent().css('width', trwidth)
@$('.bodycontainer').css('height', window.innerHeight - ($('html').outerHeight() -@$('.bodycontainer').outerHeight() ) ) unless @collection.length == 0
Qui presumo che tu abbia una serie di intestazioni chiamate @headers.
Non è carino ma funziona. Spero che aiuti qualcuno.