O que você precisa é:
1) ter um corpo de tabela de altura limitada, pois a rolagem ocorre apenas quando o conteúdo é maior que a janela de rolagem. No entanto, tbody
não pode ser dimensionado, e você deve exibi-lo como block
:
tbody {
overflow-y: auto;
display: block;
max-height: 10em; // For example
}
2) Ressincronize as larguras das colunas do cabeçalho da tabela e do corpo da tabela , tornando esta última um block
elemento não relacionado. A única maneira de fazer isso é simular a sincronização, aplicando a mesma largura de colunas a ambas .
No entanto, como tbody
ele é um block
agora, ele não pode mais se comportar como um table
. Como você ainda precisa de um table
comportamento para exibir suas colunas corretamente, a solução é solicitar que cada uma de suas linhas seja exibida como table
s individuais :
thead {
display: table;
width: 100%; // Fill the containing table
}
tbody tr {
display: table;
width: 100%; // Fill the containing table
}
(Observe que, usando esta técnica, você não poderá mais se estender por linhas).
Feito isso, você pode impor larguras de coluna para ter a mesma largura em ambos thead
e tbody
. Você não poderia:
- individualmente para cada coluna (por meio de classes CSS específicas ou estilo embutido), o que é bastante tedioso para cada instância da tabela;
- uniformemente para todas as colunas (por exemplo,
th, td { width: 20%; }
se você tiver cinco colunas), o que é mais prático (não é necessário definir a largura para cada instância da tabela), mas não pode funcionar para nenhuma contagem de colunas
- uniformemente para qualquer contagem de colunas, por meio de um layout de tabela fixo.
Eu prefiro a última opção, que requer adicionar:
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
}
Veja uma demonstração aqui , bifurcada da resposta a esta pergunta .