J'ai récemment eu un problème similaire et j'ai fini par le résoudre en utilisant un mélange de différentes solutions.
La première et la plus simple consistait à utiliser deux tables, une pour les en-têtes et une pour le corps. Cela fonctionne mais les en-têtes et les colonnes du corps ne sont pas alignés. Et comme je voulais utiliser la taille automatique fournie avec les tables de bootstrap Twitter, j'ai fini par créer une fonction Javascript qui change les en-têtes lorsque: le corps est rendu; les fenêtres sont redimensionnées; les données de la colonne changent, etc.
Voici une partie du code que j'ai utilisé:
<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>
Les en-têtes et le corps sont divisés en deux tableaux distincts. L'un d'eux se trouve à l'intérieur d'un DIV avec le style nécessaire pour générer les barres de défilement verticales. Voici le CSS que j'ai utilisé:
.bodycontainer {
//height: 200px
width: 100%;
margin: 0;
}
.table-scrollable {
margin: 0px;
padding: 0px;
}
J'ai commenté la hauteur ici parce que je voulais que le tableau atteigne le bas de la page, quelle que soit la hauteur de la page.
Les attributs de tri de données que j'ai utilisés dans les en-têtes sont également utilisés dans chaque td. De cette façon, je pourrais obtenir la largeur et le remplissage de chaque td et la largeur de la ligne. En utilisant les attributs de tri de données que j'ai définis en utilisant CSS, le remplissage et la largeur de chaque en-tête en conséquence et de la ligne d'en-tête qui est toujours plus grande car elle n'a pas de barre de défilement. Voici la fonction utilisant 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
Ici, je suppose que vous avez un tableau des en-têtes appelés @headers.
Ce n'est pas joli mais ça marche. J'espère que ça aide quelqu'un.