Ce dont vous avez besoin est:
1) ont un corps de table de hauteur limitée car le défilement se produit uniquement lorsque le contenu est plus grand que la fenêtre de défilement. Cependant, tbody
il ne peut pas être dimensionné et vous devez l'afficher block
pour le faire:
tbody {
overflow-y: auto;
display: block;
max-height: 10em; // For example
}
2) Synchronisez à nouveau les largeurs des colonnes d'en-tête et de corps de table, car ce dernier en a block
fait un élément non lié. La seule façon de le faire est de simuler la synchronisation en appliquant la même largeur de colonne aux deux .
Cependant, puisque tbody
lui-même est un block
maintenant, il ne peut plus se comporter comme un table
. Puisque vous avez toujours besoin d'un table
comportement pour afficher correctement vos colonnes, la solution est de demander à chacune de vos lignes de s'afficher en tant que table
s individuels :
thead {
display: table;
width: 100%; // Fill the containing table
}
tbody tr {
display: table;
width: 100%; // Fill the containing table
}
(Notez qu'en utilisant cette technique, vous ne pourrez plus vous étendre sur les lignes).
Une fois cela fait, vous pouvez imposer aux largeurs de colonne d'avoir la même largeur dans les deux thead
et tbody
. Vous ne pourriez pas que:
- individuellement pour chaque colonne (via des classes CSS spécifiques ou un style en ligne), ce qui est assez fastidieux à faire pour chaque instance de table;
- uniformément pour toutes les colonnes (par
th, td { width: 20%; }
si vous avez 5 colonnes par exemple), ce qui est plus pratique (pas besoin de définir la largeur pour chaque instance de table) mais ne peut fonctionner pour aucun nombre de colonnes
- uniformément pour tout nombre de colonnes, grâce à une disposition de table fixe.
Je préfère la dernière option, qui nécessite d'ajouter:
thead {
table-layout: fixed; // Same layout for all cells
}
tbody tr {
table-layout: fixed; // Same layout for all cells
}
th, td {
width: auto; // Same width for all cells, if table has fixed layout
}
Voir une démo ici , tirée de la réponse à cette question .