Những gì bạn cần là:
1) có thân bảng có chiều cao giới hạn vì cuộn chỉ xảy ra khi nội dung lớn hơn cửa sổ cuộn. Tuy nhiên tbodykhông thể có kích thước và bạn phải hiển thị nó blockđể làm như vậy:
tbody {
overflow-y: auto;
display: block;
max-height: 10em; // For example
}
2) Đồng bộ hóa lại tiêu đề cột và chiều rộng thân cột của bảng để làm cho phần sau blocktrở thành một phần tử không liên quan. Cách duy nhất để làm như vậy là mô phỏng đồng bộ hóa bằng cách thực thi cùng chiều rộng cột cho cả hai .
Tuy nhiên, vì tbodybản thân nó là một blockbây giờ, nó không còn có thể cư xử như a table. Vì bạn vẫn cần một tablehành vi để hiển thị chính xác các cột của mình, nên giải pháp là yêu cầu mỗi hàng của bạn hiển thị dưới dạng tables riêng lẻ :
thead {
display: table;
width: 100%; // Fill the containing table
}
tbody tr {
display: table;
width: 100%; // Fill the containing table
}
(Lưu ý rằng, sử dụng kỹ thuật này, bạn sẽ không thể trải dài trên các hàng nữa).
Khi đã xong, bạn có thể thực thi độ rộng cột để có cùng chiều rộng ở cả hai theadvà tbody. Bạn không thể:
- riêng cho từng cột (thông qua các lớp CSS cụ thể hoặc kiểu dáng nội tuyến), điều này khá tẻ nhạt để làm cho từng thể hiện của bảng;
- thống nhất cho tất cả các cột (
th, td { width: 20%; }ví dụ nếu bạn có 5 cột), điều này thực tế hơn (không cần đặt chiều rộng cho mỗi thể hiện của bảng) nhưng không thể hoạt động cho bất kỳ số cột nào
- thống nhất cho bất kỳ số lượng cột, thông qua một bố trí bảng cố định.
Tôi thích tùy chọn cuối cùng, yêu cầu thêm:
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
}
Xem một bản demo ở đây , rẽ nhánh từ câu trả lời cho câu hỏi này .