When developing a website, it is essential to ensure that the header remains fixed at the top of the page as the user scrolls. This allows for easy access to crucial elements such as the navigation bar, home page logo, or menu, enhancing the user experience. In this post, we will explore two straightforward methods for achieving a sticky header.

Sticky with CSS Only

The CSS position: sticky property was first introduced in CSS3 and has been supported in modern browsers since around 2012. It allows elements to be positioned as relative until they reach a specified threshold, at which point they become fixed. This feature provides a convenient way to create sticky headers, footers, and other elements that should remain fixed in place as the user scrolls.

Here’s an example:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    header {
      position: sticky;
      margin: 0;
      top: 0;
      left: 0;
      right: 0;
      background-color: lightgray;
      padding: 10px;
    }
    body {
      margin: 0;
      padding: 0;
    }
    </style>
</head>
<body>
<header>
  <h1>Sticky with CSS Only</h1>
</header>

<main>
  <!-- Long text example here-->
  <div style="font-size: 48px;"><p>Long text example here</p></div>
  <div style="font-size: 48px;"><p>Long text example here</p></div>
  <div style="font-size: 48px;"><p>Long text example here</p></div>
  <div style="font-size: 48px;"><p>Long text example here</p></div>
  <div style="font-size: 48px;"><p>Long text example here</p></div>
  <div style="font-size: 48px;"><p>Long text example here</p></div>
  <div style="font-size: 48px;"><p>Long text example here</p></div>
  <div style="font-size: 48px;"><p>Long text example here</p></div>
  <div style="font-size: 48px;"><p>Long text example here</p></div>
  <div style="font-size: 48px;"><p>Long text example here</p></div>
  <div style="font-size: 48px;"><p>Long text example here</p></div>
  <div style="font-size: 48px;"><p>Long text example here</p></div>
  <div style="font-size: 48px;"><p>Long text example here</p></div>
  <div style="font-size: 48px;"><p>Long text example here</p></div>
  <div style="font-size: 48px;"><p>Long text example here</p></div>
</main>
  
</body>
</html>

In this example, the header element has the position property set to sticky and the top property set to 0. This causes the header to remain at the top of the viewport as you scroll down the page. The background-color and padding properties are used to give the header some visual styling.

It’s important to note that the position: sticky property is not supported by all browsers, so make sure to check for browser compatibility before using this method.

Sticky header with CSS only

There can be a few reasons why a sticky header created using CSS might not work:

  1. Browser compatibility: The position: sticky property is not supported by all browsers, so make sure you are using a browser that supports it.
  2. Parent elements: The parent elements of the header must have a position property value of relative or absolute for the header to become sticky.
  3. Z-index: If other elements on your page overlap the header, you may need to set a z-index value on the header to ensure that it appears on top.
  4. Overflow: If the parent container of the header has its overflow property set to hidden, the header may not become sticky.

If you are still experiencing issues with your sticky header, it may be helpful to check these factors and make sure they are properly set.

Using JavaScript

The second method uses JavaScript to create a sticky header. Here’s the code:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      header.sticky {
        position: fixed;
        top: 0;
        left: 0;
        width: 100%;
        background-color: #fff;
        z-index: 10;
      }
      body {
        margin: 0;
        padding: 0;
      }
    </style>
  </head>
  <body>
    <header>
      <h1>Sticky with CSS Only</h1>
    </header>

    <main>
      <!-- Long text example here-->
      <div style="font-size: 48px"><p>Long text example here</p></div>
      <div style="font-size: 48px"><p>Long text example here</p></div>
      <div style="font-size: 48px"><p>Long text example here</p></div>
      <div style="font-size: 48px"><p>Long text example here</p></div>
      <div style="font-size: 48px"><p>Long text example here</p></div>
      <div style="font-size: 48px"><p>Long text example here</p></div>
      <div style="font-size: 48px"><p>Long text example here</p></div>
      <div style="font-size: 48px"><p>Long text example here</p></div>
      <div style="font-size: 48px"><p>Long text example here</p></div>
      <div style="font-size: 48px"><p>Long text example here</p></div>
      <div style="font-size: 48px"><p>Long text example here</p></div>
      <div style="font-size: 48px"><p>Long text example here</p></div>
      <div style="font-size: 48px"><p>Long text example here</p></div>
      <div style="font-size: 48px"><p>Long text example here</p></div>
      <div style="font-size: 48px"><p>Long text example here</p></div>
    </main>
    <script>
      window.onscroll = function () {
        const header = document.querySelector('header');
        if (window.pageYOffset > header.offsetTop) {
          header.classList.add('sticky');
        } else {
          header.classList.remove('sticky');
        }
      };
    </script>
  </body>
</html>

In this method, the onscroll event listener is attached to the window, which is fired whenever the user scrolls the page. The header variable is set to the header element on the page. If the user has scrolled down past the header’s top offset, the sticky class is added to the header. If the user has scrolled back up to the top of the page, the sticky class is removed. The CSS styles for the sticky class are the same as in the first method, and they ensure that the header will remain fixed at the top of the page.

💡 Note: Adding a sticky header to your website can improve the user experience and make it easier for visitors to access important navigation links. Don’t forget to test your sticky header on different devices and screen sizes to ensure it works as expected. 💻📱👌