Recientemente tuve un problema similar y terminé solucionándolo usando una mezcla de diferentes soluciones.
La primera y más simple fue usar dos tablas, una para los encabezados y otra para el cuerpo. Esto funciona pero los encabezados y las columnas del cuerpo no están alineados. Y, dado que quería usar el tamaño automático que viene con las tablas de arranque de Twitter, terminé creando una función Javascript que cambia los encabezados cuando: se representa el cuerpo; las ventanas cambian de tamaño; los datos en la columna cambian, etc.
Aquí hay algunos de los códigos que utilicé:
<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>
Los encabezados y el cuerpo se dividen en dos tablas separadas. Uno de ellos está dentro de un DIV con el estilo necesario para generar las barras de desplazamiento verticales. Aquí está el CSS que utilicé:
.bodycontainer {
//height: 200px
width: 100%;
margin: 0;
}
.table-scrollable {
margin: 0px;
padding: 0px;
}
Comenté la altura aquí porque quería que la tabla llegara al final de la página, cualquiera que sea la altura de la página.
Los atributos de clasificación de datos que utilicé en los encabezados también se utilizan en cada td. De esta manera podría obtener el ancho y el relleno de cada td y el ancho de la fila. Usando los atributos de clasificación de datos que configuré usando CSS, el relleno y el ancho de cada encabezado en consecuencia y de la fila del encabezado, que siempre es más grande ya que no tiene una barra de desplazamiento. Aquí está la función usando 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
Aquí supongo que tiene una serie de encabezados llamados @headers.
No es bonito pero funciona. Espero que ayude a alguien.