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 blockpara 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 blockconvirtió 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 tbodyes un blockahora, 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 tables 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 .