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>
ColorNameHEXRGB
AliceBlue#F0F8FFrgb(240,248,255)
AntiqueWhite#FAEBD7rgb(250,235,215)
Aqua#00FFFFrgb(0,255,255)
Aquamarine#7FFFD4rgb(127,255,212)
Azure#F0FFFFrgb(240,255,255)
Beige#F5F5DCrgb(245,245,220)
Bisque#FFE4C4rgb(255,228,196)
Black#000000rgb(0,0,0)
BlanchedAlmond#FFEBCDrgb(255,235,205)
Blue#0000FFrgb(0,0,255)
BlueViolet#8A2BE2rgb(138,43,226)
Brown#A52A2Argb(165,42,42)
BurlyWood#DEB887rgb(222,184,135)
CadetBlue#5F9EA0rgb(95,158,160)
Chartreuse#7FFF00rgb(127,255,0)
Chocolate#D2691Ergb(210,105,30)
Coral#FF7F50rgb(255,127,80)
CornflowerBlue#6495EDrgb(100,149,237)
Cornsilk#FFF8DCrgb(255,248,220)
Crimson#DC143Crgb(220,20,60)
Crimson#DC143Crgb(220,20,60)
Cyan#00FFFFrgb(0,255,255)
DarkBlue#00008Brgb(0,0,139)
DarkCyan#008B8Brgb(0,139,139)
DarkGoldenrod#B8860Brgb(184,134,11)
DarkGray#A9A9A9rgb(169,169,169)
DarkGreen#006400rgb(0,100,0)
DarkKhaki#BDB76Brgb(189,183,107)
DarkMagenta#8B008Brgb(139,0,139)
DarkOliveGreen#556B2Frgb(85,107,47)
DarkOrange#FF8C00rgb(255,140,0)
DarkOrchid#9932CCrgb(153,50,204)
DarkRed#8B0000rgb(139,0,0)
DarkRed#8B0000rgb(139,0,0)
DarkSalmon#E9967Argb(233,150,122)
DarkSalmon#E9967Argb(233,150,122)
DarkSeaGreen#8FBC8Brgb(143,188,139)
DarkSlateBlue#483D8Brgb(72,61,139)
DarkSlateGray#2F4F4Frgb(47,79,79)
DarkTurquoise#00CED1rgb(0,206,209)
DarkViolet#9400D3rgb(148,0,211)
DeepPink#FF1493rgb(255,20,147)
DeepPink#FF1493rgb(255,20,147)
DeepSkyBlue#00BFFFrgb(0,191,255)
DimGray#696969rgb(105,105,105)
DodgerBlue#1E90FFrgb(30,144,255)
FireBrick#B22222rgb(178,34,34)
FireBrick#B22222rgb(178,34,34)
FloralWhite#FFFAF0rgb(255,250,240)
ForestGreen#228B22rgb(34,139,34)
Fuchsia#FF00FFrgb(255,0,255)
Gainsboro#DCDCDCrgb(220,220,220)
GhostWhite#F8F8FFrgb(248,248,255)
Gold#FFD700rgb(255,215,0)
Goldenrod#DAA520rgb(218,165,32)
Gray#808080rgb(128,128,128)
Green#008000rgb(0,128,0)
GreenYellow#ADFF2Frgb(173,255,47)
HoneyDew#F0FFF0rgb(240,255,240)
HotPink#FF69B4rgb(255,105,180)
HotPink#FF69B4rgb(255,105,180)
IndianRed#CD5C5Crgb(205,92,92)
IndianRed#CD5C5Crgb(205,92,92)
Indigo#4B0082rgb(75,0,130)
Ivory#FFFFF0rgb(255,255,240)
Khaki#F0E68Crgb(240,230,140)
Lavender#E6E6FArgb(230,230,250)
LavenderBlush#FFF0F5rgb(255,240,245)
LawnGreen#7CFC00rgb(124,252,0)
LemonChiffon#FFFACDrgb(255,250,205)
LightBlue#ADD8E6rgb(173,216,230)
LightCoral#F08080rgb(240,128,128)
LightCoral#F08080rgb(240,128,128)
LightCyan#E0FFFFrgb(224,255,255)
LightGoldenrodYellow#FAFAD2rgb(250,250,210)
LightGray#D3D3D3rgb(211,211,211)
LightGreen#90EE90rgb(144,238,144)
LightPink#FFB6C1rgb(255,182,193)
LightPink#FFB6C1rgb(255,182,193)
LightSalmon#FFA07Argb(255,160,122)
LightSalmon#FFA07Argb(255,160,122)
LightSalmon#FFA07Argb(255,160,122)
LightSeaGreen#20B2AArgb(32,178,170)
LightSkyBlue#87CEFArgb(135,206,250)
LightSlateGray#778899rgb(119,136,153)
LightSteelBlue#B0C4DErgb(176,196,222)
LightYellow#FFFFE0rgb(255,255,224)
Lime#00FF00rgb(0,255,0)
LimeGreen#32CD32rgb(50,205,50)
Linen#FAF0E6rgb(250,240,230)
Magenta#FF00FFrgb(255,0,255)
Maroon#800000rgb(128,0,0)
MediumAquamarine#66CDAArgb(102,205,170)
MediumBlue#0000CDrgb(0,0,205)
MediumOrchid#BA55D3rgb(186,85,211)
MediumPurple#9370DBrgb(147,112,219)
MediumSeaGreen#3CB371rgb(60,179,113)
MediumSlateBlue#7B68EErgb(123,104,238)
MediumSlateBlue#7B68EErgb(123,104,238)
MediumSpringGreen#00FA9Argb(0,250,154)
MediumTurquoise#48D1CCrgb(72,209,204)
MediumVioletRed#C71585rgb(199,21,133)
MediumVioletRed#C71585rgb(199,21,133)
MidnightBlue#191970rgb(25,25,112)
MintCream#F5FFFArgb(245,255,250)
MistyRose#FFE4E1rgb(255,228,225)
Moccasin#FFE4B5rgb(255,228,181)
NavajoWhite#FFDEADrgb(255,222,173)
Navy#000080rgb(0,0,128)
OldLace#FDF5E6rgb(253,245,230)
Olive#808000rgb(128,128,0)
OliveDrab#6B8E23rgb(107,142,35)
Orange#FFA500rgb(255,165,0)
OrangeRed#FF4500rgb(255,69,0)
Orchid#DA70D6rgb(218,112,214)
PaleGoldenrod#EEE8AArgb(238,232,170)
PaleGreen#98FB98rgb(152,251,152)
PaleTurquoise#AFEEEErgb(175,238,238)
PaleVioletRed#DB7093rgb(219,112,147)
PaleVioletRed#DB7093rgb(219,112,147)
PapayaWhip#FFEFD5rgb(255,239,213)
PeachPuff#FFDAB9rgb(255,218,185)
Peru#CD853Frgb(205,133,63)
Pink#FFC0CBrgb(255,192,203)
Pink#FFC0CBrgb(255,192,203)
Plum#DDA0DDrgb(221,160,221)
PowderBlue#B0E0E6rgb(176,224,230)
Purple#800080rgb(128,0,128)
RebeccaPurple#663399rgb(102,51,153)
Red#FF0000rgb(255,0,0)
Red#FF0000rgb(255,0,0)
RosyBrown#BC8F8Frgb(188,143,143)
RoyalBlue#4169E1rgb(65,105,225)
SaddleBrown#8B4513rgb(139,69,19)
Salmon#FA8072rgb(250,128,114)
Salmon#FA8072rgb(250,128,114)
SandyBrown#F4A460rgb(244,164,96)
SeaGreen#2E8B57rgb(46,139,87)
SeaShell#FFF5EErgb(255,245,238)
Sienna#A0522Drgb(160,82,45)
Silver#C0C0C0rgb(192,192,192)
SkyBlue#87CEEBrgb(135,206,235)
SlateBlue#6A5ACDrgb(106,90,205)
SlateGray#708090rgb(112,128,144)
Snow#FFFAFArgb(255,250,250)
SpringGreen#00FF7Frgb(0,255,127)
SteelBlue#4682B4rgb(70,130,180)
Tan#D2B48Crgb(210,180,140)
Teal#008080rgb(0,128,128)
Thistle#D8BFD8rgb(216,191,216)
Tomato#FF6347rgb(255,99,71)
Turquoise#40E0D0rgb(64,224,208)
Violet#EE82EErgb(238,130,238)
Wheat#F5DEB3rgb(245,222,179)
White#FFFFFFrgb(255,255,255)
WhiteSmoke#F5F5F5rgb(245,245,245)
Yellow#FFFF00rgb(255,255,0)
YellowGreen#9ACD32rgb(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.CarSold
1.Ford F-Series653,957
2.Chevy Silverado513,354
3.Ram Pickup468,344
4.Toyota RAV4399,941
5.Toyota Camry295,201
6.GMC Sierra241,522
7.Honda CR-V238,155
8.Toyota Tacoma237,323
9.Tesla Model Y231,400
10.Jeep Grand Cherokee223,345
11.Toyota Highlander222,805
12.Toyota Corolla222,216
13.Chevy Equinox212,072
14.Ford Explorer207,673
15.Tesla Model 3198,200
16.Nissan Rogue186,480
17.Jeep Wrangler181,409
18.Hyundai Tucson175,307
19.Subaru Crosstrek155,142
20.Honda Accord154,612
21.Mazda CX-5151,594
22.Subaru Outback147,262
23.Nissan Altima139,955
24.Ford Escape137,370
25.Honda Civic133,932
Make, model6,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.

Base Form
Past Simple
Past Participle
arise
arose
arisen
awake
awoke
awoken
be
was/were
been
bear
bore
born(e)
beat
beat
beaten
become
became
become
begin
began
begun
bend
bent
bent
bet
bet
bet
bind
bound
bound
bite
bit
bitten
bleed
bled
bled
blow
blew
blown
break
broke
broken
breed
bred
bred
bring
brought
brought
broadcast
broadcast
broadcast
build
built
built
burn
burnt/burned
burnt/burned
burst
burst
burst
buy
bought
bought
can
could
… (been able)
catch
caught
caught
choose
chose
chosen
cling
clung
clung
come
came
come
cost
cost
cost
creep
crept
crept
cut
cut
cut
V1
V2
V3

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.

2 × 2

Table

Style Name
Georgia
Georgia
Palatino
Times New Roman
Arial
Arial Black
Comic Sans
Impact
Lucida Sans
Tahoma
Trebuchet
Verdana
Courier
Lucida Console
Left Center Right
px
px

Body

Left Center Right

HTML
Preview Apply »
HTML Copy
CSS « Apply