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, tbody
non è possibile ridimensionare e devi visualizzarlo come block
per 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 block
un elemento non correlato. L'unico modo per farlo è simulare la sincronizzazione applicando la stessa larghezza di colonne a entrambi .
Tuttavia, poiché di per tbody
sé è un block
ora, non può più comportarsi come un table
. Dato che hai ancora bisogno di un table
comportamento per visualizzare correttamente le tue colonne, la soluzione è chiedere che ciascuna delle tue righe venga visualizzata come singola table
s:
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 thead
e 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 .