Make it stick! Sticky headers in CSS πŸ¦ŽπŸ”

Rob OLeary - Apr 13 '20 - - Dev Community

CSS introduced the property position: sticky in 2012, one obvious application of this is for making sticky headers.

The idea is straightforward: If an element has position: sticky, treat it as a normal position: relative block, as long as it’s on screen. If the user scrolls far enough that the element (let’s say it’s a h1) will move off the screen, but it's parent is still visible onscreen, treat it as though it were position: fixed.

Initially, the problem with this property was that adoption was slow by some browser vendors, but that is no longer an issue, so we can embrace it without big reservations now! There is a caveat with tables, which I will discuss below.

So, how do you make sticky headers with just CSS?

It’s super-easy!

All you do is:

.stayOnTop{
    position: -webkit-sticky;
    position: -moz-sticky;
    position: -ms-sticky;
    position: -o-sticky;
    position: sticky;
    top: 0;
}
Enter fullscreen mode Exit fullscreen mode

The position is set through the properties: top, left, right, bottom. So, to have the element stay on top, use top: 0;.

Using the browser prefixes is still necessary for some Browsers such as Safari, so it's best to add them all, and avoid cross-browser compatibility mishaps!

Tables

One of the best use-cases for this is for bigggg tables. Tables where you want to see the column headers on top as you scroll down through your data.

There is one caveat though, Chrome and Edge have a bug with using position: sticky on thead. So, the way around this is to apply it to th instead.

You can use it to make sticky headers on the side and top for easy cross-referencing for big data sets, maybe you're showing scientific findings like below! So, it kind of mimics frozen rows in Excel!

Other Use Cases

  • It is used often to make a sticky navigation bar when there is a hero section above it. The navigation bar becomes fixed when the user scrolls past the hero section.

  • I think the example below is cool, but it requires some JS. A reading progress bar for a blog post. Scroll to see it in action. You can get creative with sticky too!

I wrote a tutorial on this if you would like to learn more.

Browser Support

As long as you avoid using it on thead, you are good on the major browsers (see green-shaded squares in image below). IE be damned!😜

can i use table

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .