Search code examples
csscss-grid

Grid item 100% height of parent


The red sidebar in this page needs to be 100% of the container height:

body {
  display: grid;
  min-height: 85vh;
  grid-template-columns: auto 10fr 4fr;
  grid-template-rows: minmax(1rem, max-content) 1fr minmax(1rem, max-content);
  grid-template-areas: "header header aside" "main main aside" "footer footer footer";
}

header {
  grid-area: header;
  background: pink;
}

footer {
  grid-area: footer;
  background: blue;
}

main {
  grid-area: main;
  background: green;
}

aside {
  grid-area: aside;
  background: red;
  height: 100px;
  overflow-y: scroll;
}
<header> header </header>
<main>main</main>
<aside>
  aside<br>aside<br>aside<br>aside<br>aside<br>aside<br>aside<br>aside<br>aside<br>aside<br>aside<br>aside<br>aside<br>aside<br>aside<br>aside<br>aside<br>aside<br>aside<br>aside<br>aside<br>aside<br>aside<br>aside<br>
</aside>
<footer> footer </footer>

Can this be achieved without adding another inner element with 100% height absolute position ?

note that I added 100px height to it just to point out that it needs to be scrollable. But I want the height to be 100% of container...


Solution

  • Use min-height: 100%;height:0; to avoid the height of the aside affecting the layout then force it to be 100% height at the same time (height of its track defined by the other content)

    body {
      display: grid;
      min-height: 85vh;
      grid-template-columns: auto 10fr 4fr;
      grid-template-rows: 
        minmax(1rem, max-content) 1fr minmax(1rem, max-content);
      grid-template-areas: 
        "header header aside" 
        "main   main   aside" 
        "footer footer footer";
    }
    
    header {
      grid-area: header;
      background: pink;
    }
    
    footer {
      grid-area: footer;
      background: blue;
    }
    
    main {
      grid-area: main;
      background: green;
    }
    
    aside {
      grid-area: aside;
      background: red;
      min-height: 100%;
      height:0;
      overflow-y: scroll;
    }
    <header> header </header>
    <main>main</main>
    <aside>
      aside<br>aside<br>aside<br>aside<br>aside<br>aside<br>aside<br>aside<br>aside<br>aside<br>aside<br>aside<br>aside<br>aside<br>aside<br>aside<br>aside<br>aside<br>aside<br>aside<br>aside<br>aside<br>aside<br>aside<br>
    </aside>
    <footer> footer </footer>