How to create HTML tables with fixed header using CSS
In one of my recent project I had to display data in HTML table with header row remains fixed and body can be scrolled vertically.
Since the html was generated on server and rendered directly on browser, I thought of using only css do this. Check the code bellow.
Example
# | Skill Name | Experience | Expertise |
---|---|---|---|
1. | .Net Framework | 15 Years | Expert |
2. | ASP.Net Web Forms | 15 Years | Expert |
3. | ASP.Net MVC | 10 Years | Expert |
4. | C# | 15 Years | Expert |
5. | VB.Net | 15 Years | Expert |
6. | JavaScript | 15 Years | Expert |
7. | jQuery | 10 Years | Expert |
8. | SQL Server | 15 Years | Expert |
9. | Entity Framework | 6 Years | Expert |
10. | HTML5 | 4 Years | Expert |
11. | Twitter Bootstrap | 8 Years | Expert |
12. | Angular JS | 3 Years | Professional |
13. | ReactJS | 3 Years | Professional |
Code
<table class="fixedHeader"> <thead> <tr> <th style="width:30px;">#</th> <th style="width:200px;">Skill Name</th> <th style="width:150px;">Experience</th> <th style="width:150px;">Expertise</th> </tr> </thead> <tbody> <tr> <td style="width:30px;">1.</td> <td style="width:200px;">.Net Framework</td> <td style="width:150px;">15 Years</td> <td style="width:150px;">Expert</td> </tr> <tr> <td style="width:30px;">2.</td> <td style="width:200px;">ASP.Net Web Forms</td> <td style="width:150px;">15 Years</td> <td style="width:150px;">Expert</td> </tr> ...add more rows here </tbody> </table> <style> //this is decorative only .fixedHeader td, .fixedHeader th { border: 1px solid; border-color: cadetblue; text-align: left; padding: 5px; } //This is important .fixedHeader > thead, .fixedHeader > tbody { display: block; } //set max height and overflow properties .fixedHeader > tbody { max-height: 300px; overflow: auto; } </style>
Details
There are two important aspects this solution.
-
Each td and th has a specific width.
Setting width of each cell will enable browser to enforce it rather than calculate the best fit.
-
tbody and thead are set to display-block
This is required so that body and head can be independent of the table tag.