Ciò di cui hai bisogno è:
1) avere un corpo di tabella di altezza limitata poiché lo scorrimento si verifica solo quando il contenuto è più grande della finestra di scorrimento. Tuttavia, tbodynon è possibile ridimensionare e devi visualizzarlo come blockper farlo:
tbody {
overflow-y: auto;
display: block;
max-height: 10em; // For example
}
2) Risincronizza le larghezze delle colonne dell'intestazione della tabella e del corpo della tabella , rendendola blockun elemento non correlato. L'unico modo per farlo è simulare la sincronizzazione applicando la stessa larghezza di colonne a entrambi .
Tuttavia, poiché di per tbodysé è un blockora, non può più comportarsi come un table. Dato che hai ancora bisogno di un tablecomportamento per visualizzare correttamente le tue colonne, la soluzione è chiedere che ciascuna delle tue righe venga visualizzata come singola tables:
thead {
display: table;
width: 100%; // Fill the containing table
}
tbody tr {
display: table;
width: 100%; // Fill the containing table
}
(Nota che, usando questa tecnica, non sarai più in grado di attraversare più righe).
Fatto ciò, puoi imporre che le larghezze delle colonne abbiano la stessa larghezza in entrambi theade tbody. Non potresti che:
- individualmente per ogni colonna (attraverso specifiche classi CSS o stile in linea), che è abbastanza noioso da fare per ogni istanza di tabella;
- uniformemente per tutte le colonne (fino
th, td { width: 20%; }ad esempio se hai 5 colonne), il che è più pratico (non è necessario impostare la larghezza per ogni istanza della tabella) ma non può funzionare per il conteggio delle colonne
- uniformemente per ogni conteggio delle colonne, attraverso un layout di tabella fisso.
Preferisco l'ultima opzione, che richiede l'aggiunta di:
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
}
Guarda una demo qui , biforcuta dalla risposta a questa domanda .