HTML Tables With Sticky Header
HTML tables with sticky header and footer make a tall data grid more visually appealing. Printers automatically place headers and footers on each page if the HTML table spans more pages.
CSS Code
Making sticky HTML table headers is easy but it's far from how you would expect to make it. I would assume to assign position: relative to the table tag and position: fixed; top:0; to the thead tag. This approach hovewer isn't working.
How to do it correctly?
What we have to do is assign the position:sticky;top:0; styles to the thhead tag, just like in the example below where a tall table is wrapped in a div container with a limited height. We can assign these styles to the th tags instead but that doesn't make too much sense.
.stickyTable thead { position: sticky; top: 0; }
<div style="height: 300px;overflow: auto;"> <table class="stickyTable demo"> <thead> <tr> <th>Color</th><th>Name</th> <th>HEX</th><th>RGB</th> </tr> </thead> <tbody> <tr> <td><span style="background: #F0F8FF;">
</span></td> <td>AliceBlue</td><td>#F0F8FF</td> <td>rgb(240,248,255)</td> </tr> <tr> <td><span style="background: #FAEBD7;">
</span></td> <td>AntiqueWhite</td><td>#FAEBD7</td> <td>rgb(250,235,215)</td> </tr> <!-- many more rows... --> </tbody> </table> </div>
Color | Name | HEX | RGB |
---|---|---|---|
AliceBlue | #F0F8FF | rgb(240,248,255) | |
AntiqueWhite | #FAEBD7 | rgb(250,235,215) | |
Aqua | #00FFFF | rgb(0,255,255) | |
Aquamarine | #7FFFD4 | rgb(127,255,212) | |
Azure | #F0FFFF | rgb(240,255,255) | |
Beige | #F5F5DC | rgb(245,245,220) | |
Bisque | #FFE4C4 | rgb(255,228,196) | |
Black | #000000 | rgb(0,0,0) | |
BlanchedAlmond | #FFEBCD | rgb(255,235,205) | |
Blue | #0000FF | rgb(0,0,255) | |
BlueViolet | #8A2BE2 | rgb(138,43,226) | |
Brown | #A52A2A | rgb(165,42,42) | |
BurlyWood | #DEB887 | rgb(222,184,135) | |
CadetBlue | #5F9EA0 | rgb(95,158,160) | |
Chartreuse | #7FFF00 | rgb(127,255,0) | |
Chocolate | #D2691E | rgb(210,105,30) | |
Coral | #FF7F50 | rgb(255,127,80) | |
CornflowerBlue | #6495ED | rgb(100,149,237) | |
Cornsilk | #FFF8DC | rgb(255,248,220) | |
Crimson | #DC143C | rgb(220,20,60) | |
Crimson | #DC143C | rgb(220,20,60) | |
Cyan | #00FFFF | rgb(0,255,255) | |
DarkBlue | #00008B | rgb(0,0,139) | |
DarkCyan | #008B8B | rgb(0,139,139) | |
DarkGoldenrod | #B8860B | rgb(184,134,11) | |
DarkGray | #A9A9A9 | rgb(169,169,169) | |
DarkGreen | #006400 | rgb(0,100,0) | |
DarkKhaki | #BDB76B | rgb(189,183,107) | |
DarkMagenta | #8B008B | rgb(139,0,139) | |
DarkOliveGreen | #556B2F | rgb(85,107,47) | |
DarkOrange | #FF8C00 | rgb(255,140,0) | |
DarkOrchid | #9932CC | rgb(153,50,204) | |
DarkRed | #8B0000 | rgb(139,0,0) | |
DarkRed | #8B0000 | rgb(139,0,0) | |
DarkSalmon | #E9967A | rgb(233,150,122) | |
DarkSalmon | #E9967A | rgb(233,150,122) | |
DarkSeaGreen | #8FBC8B | rgb(143,188,139) | |
DarkSlateBlue | #483D8B | rgb(72,61,139) | |
DarkSlateGray | #2F4F4F | rgb(47,79,79) | |
DarkTurquoise | #00CED1 | rgb(0,206,209) | |
DarkViolet | #9400D3 | rgb(148,0,211) | |
DeepPink | #FF1493 | rgb(255,20,147) | |
DeepPink | #FF1493 | rgb(255,20,147) | |
DeepSkyBlue | #00BFFF | rgb(0,191,255) | |
DimGray | #696969 | rgb(105,105,105) | |
DodgerBlue | #1E90FF | rgb(30,144,255) | |
FireBrick | #B22222 | rgb(178,34,34) | |
FireBrick | #B22222 | rgb(178,34,34) | |
FloralWhite | #FFFAF0 | rgb(255,250,240) | |
ForestGreen | #228B22 | rgb(34,139,34) | |
Fuchsia | #FF00FF | rgb(255,0,255) | |
Gainsboro | #DCDCDC | rgb(220,220,220) | |
GhostWhite | #F8F8FF | rgb(248,248,255) | |
Gold | #FFD700 | rgb(255,215,0) | |
Goldenrod | #DAA520 | rgb(218,165,32) | |
Gray | #808080 | rgb(128,128,128) | |
Green | #008000 | rgb(0,128,0) | |
GreenYellow | #ADFF2F | rgb(173,255,47) | |
HoneyDew | #F0FFF0 | rgb(240,255,240) | |
HotPink | #FF69B4 | rgb(255,105,180) | |
HotPink | #FF69B4 | rgb(255,105,180) | |
IndianRed | #CD5C5C | rgb(205,92,92) | |
IndianRed | #CD5C5C | rgb(205,92,92) | |
Indigo | #4B0082 | rgb(75,0,130) | |
Ivory | #FFFFF0 | rgb(255,255,240) | |
Khaki | #F0E68C | rgb(240,230,140) | |
Lavender | #E6E6FA | rgb(230,230,250) | |
LavenderBlush | #FFF0F5 | rgb(255,240,245) | |
LawnGreen | #7CFC00 | rgb(124,252,0) | |
LemonChiffon | #FFFACD | rgb(255,250,205) | |
LightBlue | #ADD8E6 | rgb(173,216,230) | |
LightCoral | #F08080 | rgb(240,128,128) | |
LightCoral | #F08080 | rgb(240,128,128) | |
LightCyan | #E0FFFF | rgb(224,255,255) | |
LightGoldenrodYellow | #FAFAD2 | rgb(250,250,210) | |
LightGray | #D3D3D3 | rgb(211,211,211) | |
LightGreen | #90EE90 | rgb(144,238,144) | |
LightPink | #FFB6C1 | rgb(255,182,193) | |
LightPink | #FFB6C1 | rgb(255,182,193) | |
LightSalmon | #FFA07A | rgb(255,160,122) | |
LightSalmon | #FFA07A | rgb(255,160,122) | |
LightSalmon | #FFA07A | rgb(255,160,122) | |
LightSeaGreen | #20B2AA | rgb(32,178,170) | |
LightSkyBlue | #87CEFA | rgb(135,206,250) | |
LightSlateGray | #778899 | rgb(119,136,153) | |
LightSteelBlue | #B0C4DE | rgb(176,196,222) | |
LightYellow | #FFFFE0 | rgb(255,255,224) | |
Lime | #00FF00 | rgb(0,255,0) | |
LimeGreen | #32CD32 | rgb(50,205,50) | |
Linen | #FAF0E6 | rgb(250,240,230) | |
Magenta | #FF00FF | rgb(255,0,255) | |
Maroon | #800000 | rgb(128,0,0) | |
MediumAquamarine | #66CDAA | rgb(102,205,170) | |
MediumBlue | #0000CD | rgb(0,0,205) | |
MediumOrchid | #BA55D3 | rgb(186,85,211) | |
MediumPurple | #9370DB | rgb(147,112,219) | |
MediumSeaGreen | #3CB371 | rgb(60,179,113) | |
MediumSlateBlue | #7B68EE | rgb(123,104,238) | |
MediumSlateBlue | #7B68EE | rgb(123,104,238) | |
MediumSpringGreen | #00FA9A | rgb(0,250,154) | |
MediumTurquoise | #48D1CC | rgb(72,209,204) | |
MediumVioletRed | #C71585 | rgb(199,21,133) | |
MediumVioletRed | #C71585 | rgb(199,21,133) | |
MidnightBlue | #191970 | rgb(25,25,112) | |
MintCream | #F5FFFA | rgb(245,255,250) | |
MistyRose | #FFE4E1 | rgb(255,228,225) | |
Moccasin | #FFE4B5 | rgb(255,228,181) | |
NavajoWhite | #FFDEAD | rgb(255,222,173) | |
Navy | #000080 | rgb(0,0,128) | |
OldLace | #FDF5E6 | rgb(253,245,230) | |
Olive | #808000 | rgb(128,128,0) | |
OliveDrab | #6B8E23 | rgb(107,142,35) | |
Orange | #FFA500 | rgb(255,165,0) | |
OrangeRed | #FF4500 | rgb(255,69,0) | |
Orchid | #DA70D6 | rgb(218,112,214) | |
PaleGoldenrod | #EEE8AA | rgb(238,232,170) | |
PaleGreen | #98FB98 | rgb(152,251,152) | |
PaleTurquoise | #AFEEEE | rgb(175,238,238) | |
PaleVioletRed | #DB7093 | rgb(219,112,147) | |
PaleVioletRed | #DB7093 | rgb(219,112,147) | |
PapayaWhip | #FFEFD5 | rgb(255,239,213) | |
PeachPuff | #FFDAB9 | rgb(255,218,185) | |
Peru | #CD853F | rgb(205,133,63) | |
Pink | #FFC0CB | rgb(255,192,203) | |
Pink | #FFC0CB | rgb(255,192,203) | |
Plum | #DDA0DD | rgb(221,160,221) | |
PowderBlue | #B0E0E6 | rgb(176,224,230) | |
Purple | #800080 | rgb(128,0,128) | |
RebeccaPurple | #663399 | rgb(102,51,153) | |
Red | #FF0000 | rgb(255,0,0) | |
Red | #FF0000 | rgb(255,0,0) | |
RosyBrown | #BC8F8F | rgb(188,143,143) | |
RoyalBlue | #4169E1 | rgb(65,105,225) | |
SaddleBrown | #8B4513 | rgb(139,69,19) | |
Salmon | #FA8072 | rgb(250,128,114) | |
Salmon | #FA8072 | rgb(250,128,114) | |
SandyBrown | #F4A460 | rgb(244,164,96) | |
SeaGreen | #2E8B57 | rgb(46,139,87) | |
SeaShell | #FFF5EE | rgb(255,245,238) | |
Sienna | #A0522D | rgb(160,82,45) | |
Silver | #C0C0C0 | rgb(192,192,192) | |
SkyBlue | #87CEEB | rgb(135,206,235) | |
SlateBlue | #6A5ACD | rgb(106,90,205) | |
SlateGray | #708090 | rgb(112,128,144) | |
Snow | #FFFAFA | rgb(255,250,250) | |
SpringGreen | #00FF7F | rgb(0,255,127) | |
SteelBlue | #4682B4 | rgb(70,130,180) | |
Tan | #D2B48C | rgb(210,180,140) | |
Teal | #008080 | rgb(0,128,128) | |
Thistle | #D8BFD8 | rgb(216,191,216) | |
Tomato | #FF6347 | rgb(255,99,71) | |
Turquoise | #40E0D0 | rgb(64,224,208) | |
Violet | #EE82EE | rgb(238,130,238) | |
Wheat | #F5DEB3 | rgb(245,222,179) | |
White | #FFFFFF | rgb(255,255,255) | |
WhiteSmoke | #F5F5F5 | rgb(245,245,245) | |
Yellow | #FFFF00 | rgb(255,255,0) | |
YellowGreen | #9ACD32 | rgb(154,205,50) |
Scroll down the table to see the sticky header in action.
Sticky Header and Footer
Implementing a HTML table with a sticky footer is also easy and doesn't require the use of JavaScript.
We need to assign the position: sticky; bottom: 0; styles to the tfoot tag. The example below has both a sticky header and footer:
.stickyTable thead, .stickyTable tfoot { position: sticky; top: 0; } .stickyTable tfoot { bottom: 0; } .wrapstickyTable { height: 300px; overflow: auto; }
<div class="wrapstickyTable"> <table class="stickyTable"> <thead> <tr><th>Nr.</th><th>Car</th><th>Sold</th></tr> </thead> <tbody> <tr><td>1.</td><td>Ford F-Series</td><td>653,957</td></tr> <!-- more entries here --> <tr><td>25.</td><td>Honda Civic</td><td>133,932</td></tr> </tbody> <tfoot> <tr><td></td><td>Make, model</td><td>6,128,571</td></tr> </tfoot> </table> </div>
Nr. | Car | Sold |
---|---|---|
1. | Ford F-Series | 653,957 |
2. | Chevy Silverado | 513,354 |
3. | Ram Pickup | 468,344 |
4. | Toyota RAV4 | 399,941 |
5. | Toyota Camry | 295,201 |
6. | GMC Sierra | 241,522 |
7. | Honda CR-V | 238,155 |
8. | Toyota Tacoma | 237,323 |
9. | Tesla Model Y | 231,400 |
10. | Jeep Grand Cherokee | 223,345 |
11. | Toyota Highlander | 222,805 |
12. | Toyota Corolla | 222,216 |
13. | Chevy Equinox | 212,072 |
14. | Ford Explorer | 207,673 |
15. | Tesla Model 3 | 198,200 |
16. | Nissan Rogue | 186,480 |
17. | Jeep Wrangler | 181,409 |
18. | Hyundai Tucson | 175,307 |
19. | Subaru Crosstrek | 155,142 |
20. | Honda Accord | 154,612 |
21. | Mazda CX-5 | 151,594 |
22. | Subaru Outback | 147,262 |
23. | Nissan Altima | 139,955 |
24. | Ford Escape | 137,370 |
25. | Honda Civic | 133,932 |
Make, model | 6,128,571 |
The 25 Bestselling Cars last year. Scroll the table to see the sticky header and footer
Div Tables With Sticky Header and Footer
Div tags are not suitable for building tables with sticky header and footer. A position:absolute header would detach from the rest of the cells and the columns would stop being aligned.
The example below has a header with cells automatically set to width:33%, below that comes the scrolling container with height: 300px; overflow: auto; with the high table inside. The header is aligned with the cells because they are both fixed width.
Generate HTML Tables With Sticky Header and Footer
Create HTML tables with the generator below and use one of the methods listed in this article to add a sticky header.