Lo que necesitas es:
1) tener un cuerpo de mesa de altura limitada ya que el desplazamiento se produce solo cuando el contenido es más grande que la ventana de desplazamiento. Sin embargo tbody
, no se puede dimensionar, y debe mostrarlo como block
para hacerlo:
tbody {
overflow-y: auto;
display: block;
max-height: 10em; // For example
}
2) Vuelva a sincronizar el ancho de las columnas del encabezado de la tabla y del cuerpo de la tabla, ya que esto último lo block
convirtió en un elemento no relacionado. La única forma de hacerlo es simular la sincronización aplicando el mismo ancho de columnas a ambos .
Sin embargo, dado que tbody
es un block
ahora, ya no puede comportarse como un table
. Ya que todavía necesitas untable
comportamiento para mostrar sus columnas correctamente, la solución es solicitar que cada una de sus filas se muestre como table
s individuales :
thead {
display: table;
width: 100%; // Fill the containing table
}
tbody tr {
display: table;
width: 100%; // Fill the containing table
}
(Tenga en cuenta que, utilizando esta técnica, ya no podrá atravesar filas).
Una vez hecho esto, puede exigir que los anchos de columna tengan el mismo ancho en ambos thead
y tbody
. No podrías eso:
- individualmente para cada columna (a través de clases CSS específicas o estilo en línea), lo cual es bastante tedioso para cada instancia de tabla;
- uniformemente para todas las columnas (a través de
th, td { width: 20%; }
si tiene 5 columnas, por ejemplo), lo cual es más práctico (no es necesario establecer el ancho para cada instancia de la tabla) pero no puede funcionar para ningún recuento de columnas
- uniformemente para cualquier recuento de columnas, a través de un diseño de tabla fijo.
Prefiero la última opción, que requiere agregar:
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
}
Vea una demostración aquí , bifurcada de la respuesta a esta pregunta .