Search code examples
htmlcsscss-grid

Why is my nested grid-container not creating equal width columns?


so I am new to CSS grids and I've been toying around with it. I'm trying to see if I can match the layout of this mock-up in a general sense with some experimental code I've been writing: https://ibb.co/GFYqMRx

Here is my HTML:

<!DOCTYPE html>
  <head>
    <meta charset="utf-8">
    <title></title>
    <meta name="description" content="">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link rel="stylesheet" href="normalize.css">
    <link rel="stylesheet" href="styles.css">
  </head>
  <body class="body">


    <div class="header">Header</div>
    <div class="side-navigation">Side Navigation</div>

    <main class="main">
      <div class="item search">Search</div>
      <div class="item traffic">Traffic</div>
      <div class="item daily-traffic">Daily Traffic </div>
      <div class="item mobile-users">Mobile Users</div>
      <div class="item social-stats">Social Stats</div>
      <div class="item new-members">New Members</div>
      <div class="item recent-activity">Recent Activity</div>
      <div class="item message-user">Message User</div>
      <div class="item settings">Settings</div>
    </main>


    <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.bundle.min.js"></script> 
    <script src="app.js"></script>
  </body>
</html>

Here is my CSS:

* {
  box-sizing: border-box;
}
.item {
  border: 1px red solid;
}

.header {
  background-color: purple;
  grid-area: header;
}
.side-navigation {
  background-color: orange;
  grid-area: side-navigation;
}
.main {
  background-color: grey;
  grid-area: main;
}

.search {
  grid-area: search;
}
.traffic {
  grid-area: traffic;
}
.daily-traffic {
  grid-area: daily-traffic;
}
.mobile-users {
  grid-area: mobile-users;
}
.social-stats {
  grid-area: social-stats;
}
.new-members {
  grid-area: new-members;
}
.recent-activity {
  grid-area: recent-activity;
}
.message-user {
  grid-area: message-user;
}
.settings {
  grid-area: settings;
}
body {
  display: grid;
  grid-template-rows: 80px 80px 1fr;
  grid-template-areas: 
  "header"
  "side-navigation"
  "main";
}


@media (min-width: 769px) {

  body {
    grid-template-columns: 80px 1fr;
    grid-template-rows: 80px 1fr;
    grid-template-areas:
    "header header"
    "side-navigation main"
  }
  .main {
    display: grid;
    grid-template-columns: 1fr 1fr;
    grid-auto-rows: 150px;
  } 
}

I was first able to create the desired layout by manipulating grid lines, but I wanted to see if I could do the same thing by solely utilizing the grid-template-areas property.

For screen sizes greater than 769px, I split the nested main container into two columns, 1fr each, but I ended up getting some weird effect with a third column being installed: enter image description here

Why am I unable to create equal width columns in the nested main container? Shouldn't my grid be equally split in half if I put two fr units for grid-template-columns?

Everything was working perfectly until I applied grid to the nested main container.

And why are my grid-items jumbled up like this at the bottom of the screen?


Solution

  • This is because you are giving grid-areas to your elements withing your main grid, without actually using the grid-area property on main. I've removed these in the snippet and the main grid displays with 2 equal columns:

    * {
      box-sizing: border-box;
    }
    
    .item {
      border: 1px red solid;
    }
    
    .header {
      background-color: purple;
      grid-area: header;
    }
    
    .side-navigation {
      background-color: orange;
      grid-area: side-navigation;
    }
    
    .main {
      background-color: grey;
      grid-area: main;
    }
    
    .search {}
    
    .traffic {}
    
    .daily-traffic {}
    
    .mobile-users {}
    
    .social-stats {}
    
    .new-members {}
    
    .recent-activity {}
    
    .message-user {}
    
    .settings {}
    
    body {
      display: grid;
      grid-template-rows: 80px 80px 1fr;
      grid-template-areas: "header" "side-navigation" "main";
    }
    
    @media (min-width: 769px) {
      body {
        grid-template-columns: 80px 1fr;
        grid-template-rows: 80px 1fr;
        grid-template-areas: "header header" "side-navigation main"
      }
      .main {
        display: grid;
        grid-template-columns: 1fr 1fr;
        grid-auto-rows: 150px;
      }
    }
    <body>
      <div class="header">Header</div>
      <div class="side-navigation">Side Navigation</div>
    
      <main class="main">
        <div class="item search">Search</div>
        <div class="item traffic">Traffic</div>
        <div class="item daily-traffic">Daily Traffic </div>
        <div class="item mobile-users">Mobile Users</div>
        <div class="item social-stats">Social Stats</div>
        <div class="item new-members">New Members</div>
        <div class="item recent-activity">Recent Activity</div>
        <div class="item message-user">Message User</div>
        <div class="item settings">Settings</div>
      </main>
    
    
      <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.bundle.min.js"></script>
      <script src="app.js"></script>
    </body>