Sticky header on css grid

10,233

Using position: fixed; will take it out of the flow, and thus won't be part of your grid system. To achieve this, you can use the non-standard position: sticky; with top: 0;, the fallback being it behaving like a non-sticky element.

Here, I'm assuming the nav element is your header, since your header is set to display: none; but the position property can be moved to any element of your grid (why put header in your markup if you're not going to show it?)

* {
  margin: 0;
  padding: 0;
}

body {
  display: grid;
  font-family: sans-serif;
}

a {
  text-decoration: none;
  color: white;
}

header,
nav {
  background: blue;
  color: #fff;
  position: fixed;
}

nav {
  position: -webkit-sticky;
  position: sticky;
  top: 0;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
}

nav span {
  margin-right: auto;
}

header {
  display: none;
}

aside {
  background: lightgreen;
}

main {
  background: pink;
}


/* mobile  */

@media (max-width: 767px) {
  body {
    grid-template-columns: 1fr;
    grid-template-rows: 1fr 1fr 1fr;
  }
  nav,
  aside,
  main {
    grid-column: 1 / 1;
    padding: 0 15px;
  }
}


/* tablets */

@media (min-width: 768px) {
  body {
    grid-template-columns: 275px 1fr;
    grid-template-rows: 1fr 1fr;
  }
  nav {
    grid-column: 1 / 4;
    grid-row: 1;
    height: 50px;
    grid-row: 1;
  }
  aside {
    grid-column: 1;
  }
  main {
    grid-column: 2;
  }
  nav,
  aside,
  main {
    padding: 0 15px;
  }
}


/* desktops */

@media (min-width: 992px) {
  body {
    grid-template-columns: 10% 275px 1fr 10%;
    grid-template-rows: 1fr 1fr;
  }
  header {
    display: block;
    grid-column: 1 / -1;
    grid-row: 1;
  }
  nav {
    grid-column: 2 / 4;
    grid-row: 1;
  }
  aside {
    grid-column: 2 / 3;
  }
  main {
    grid-column: 3 / 4;
  }
}


/* xl desktops */

@media (min-width: 1920px) {
  body {
    grid-template-columns: 1fr minmax(auto, 300px) minmax(auto, 1620px) 1fr;
    grid-template-rows: 1fr 1fr;
  }
}
<header></header>
<nav>
  <span>Logo</span>
  <a href="#">login</a>
</nav>
<aside>aside</aside>
<main>main</main>
Share:
10,233
totalnoob
Author by

totalnoob

Updated on June 06, 2022

Comments

  • totalnoob
    totalnoob about 2 years

    I've got a nifty responsive css template using css grids and I'd like to make the header of this responsive css grid sticky, but because of the way the header and nav is designed, I can't get it to use fixed positioning.

    is there a better way of doing this with some grid property I might not have seen yet?

    * {
      margin: 0;
      padding: 0;
    }
    
    body {
      display: grid;
      font-family: sans-serif;
    }
    
    a {
      text-decoration: none;
      color: white;
    }
    
    header,
    nav {
      background: blue;
      color: #fff;
      position: fixed;
    }
    
    nav {
      display: flex;
      flex-wrap: wrap;
      align-items: center;
    }
    
    nav span {
      margin-right: auto;
    }
    
    header {
      display: none;
    }
    
    aside {
      background: lightgreen;
    }
    
    main {
      background: pink;
    }
    
    
    /* mobile  */
    
    @media (max-width: 767px) {
      body {
        grid-template-columns: 1fr;
        grid-template-rows: 1fr 1fr 1fr;
      }
      nav,
      aside,
      main {
        grid-column: 1 / 1;
        padding: 0 15px;
      }
    }
    
    
    /* tablets */
    
    @media (min-width: 768px) {
      body {
        grid-template-columns: 275px 1fr;
        grid-template-rows: 1fr 1fr;
      }
      nav {
        grid-column: 1 / 4;
        grid-row: 1;
        height: 50px;
        grid-row: 1;
      }
      aside {
        grid-column: 1;
      }
      main {
        grid-column: 2;
      }
      nav,
      aside,
      main {
        padding: 0 15px;
      }
    }
    
    
    /* desktops */
    
    @media (min-width: 992px) {
      body {
        grid-template-columns: 10% 275px 1fr 10%;
        grid-template-rows: 1fr 1fr;
      }
      header {
        display: block;
        grid-column: 1 / -1;
        grid-row: 1;
      }
      nav {
        grid-column: 2 / 4;
        grid-row: 1;
      }
      aside {
        grid-column: 2 / 3;
      }
      main {
        grid-column: 3 / 4;
      }
    }
    
    
    /* xl desktops */
    
    @media (min-width: 1920px) {
      body {
        grid-template-columns: 1fr minmax(auto, 300px) minmax(auto, 1620px) 1fr;
        grid-template-rows: 1fr 1fr;
      }
    }
    <header></header>
    <nav>
      <span>Logo</span>
      <a href="#">login</a>
    </nav>
    <aside>aside</aside>
    <main>main</main>

    https://jsfiddle.net/90kotz8d/3/