【问题标题】:How to use all available space vertically in a CSS Grid?如何在 CSS 网格中垂直使用所有可用空间?
【发布时间】:2018-02-19 20:20:15
【问题描述】:

我正在尝试构建一个 Web 布局,其中包含标题栏、导航页眉、页脚和中间的主要内容区域(为侧边栏和主视图分成两部分)。

我打算为此使用 CSS 网格布局。我当前的代码管理这一切,除了:主要内容(和侧边栏)调整到其内容。这不是我想要的。

如何让第三个网格行填满所有剩余的垂直空间?

* {
  box-sizing: border-box;
}

.grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  grid-template-rows: min-content min-content auto min-content;
  grid-gap: 10px;
  grid-template-areas: "header header" "nav nav" "sidebar main" "footer footer";
}

.title {
  grid-area: header;
  background-color: #1BC336;
}

.navigation {
  grid-area: nav;
  background-color: #C3A21B;
}

.sidebar {
  grid-area: sidebar;
  background-color: gold;
  overflow: auto;
}

.main {
  grid-area: main;
  background-color: #1BC3B9;
  overflow: auto;
}

.footer {
  grid-area: footer;
  background-color: #5C1BC3;
}
<div class="grid">
  <div class="title">
    <h3>Title Bar</h1>
  </div>
  <div class="navigation">Navbar</div>
  <div class="sidebar">Sidebar:<br>Info-type stuff about what's currently being shown in main</div>
  <div class="footer">Footer</div>
  <div class="main">
    <h1>Main content</h2><br>Should occupy all the remaining space. <br>Test<br>Test<br>Test<br>Test<br>Test</div>
</div>

【问题讨论】:

    标签: html css css-grid


    【解决方案1】:

    解决方案

    网格高度设置为视口高度 - 将height: 100vh 添加到.grid 并将默认浏览器body 边距重置为零。


    为什么

    这是因为除非容器(您已为其提供display: grid)有一个集合height,否则它将占用与其内容一样多的空间. 所以当你给出高度时,现在有可用的空间来填充。请参阅下面的演示:

    * {
      box-sizing: border-box;
    }
    body { /* ADDED */
      margin: 0;
    }
    
    .grid {
      display: grid;
      grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
      grid-template-rows: min-content min-content auto min-content;
      grid-gap: 10px;
      grid-template-areas: "header header" "nav nav" "sidebar main" "footer footer";
      height: 100vh; /* ADDED */
    }
    
    .title {
      grid-area: header;
      background-color: #1BC336;
    }
    
    .navigation {
      grid-area: nav;
      background-color: #C3A21B;
    }
    
    .sidebar {
      grid-area: sidebar;
      background-color: gold;
      overflow: auto;
    }
    
    .main {
      grid-area: main;
      background-color: #1BC3B9;
      overflow: auto;
    }
    
    .footer {
      grid-area: footer;
      background-color: #5C1BC3;
    }
    <div class="grid">
      <div class="title">
        <h3>Title Bar</h1>
      </div>
      <div class="navigation">Navbar</div>
      <div class="sidebar">Sidebar:<br>Info-type stuff about what's currently being shown in main</div>
      <div class="footer">Footer</div>
      <div class="main">
        <h1>Main content</h2><br>Should occupy all the remaining space. <br>Test<br>Test<br>Test<br>Test<br>Test</div>
    </div>

    【讨论】:

    • 一个未删除的答案会显示它首次发布的日期和时间?所以有时候很奇怪^^
    【解决方案2】:

    如何让第三个网格行填满所有剩余的垂直空间?

    在您的布局中,没有剩余的垂直空间。由于您的容器没有定义的高度,因此它的高度基于内容的高度。所以没有多余的空间可以分配。

    但是,如果你的容器有,比如说,视口的高度......

    .grid { height: 100vh }
    

    ...然后您可以获取侧边栏和主要内容(统称为第三行)以获取所有剩余高度:

    .grid { grid-template-rows: min-content min-content 1fr min-content; }
    

    而不是

    .grid { grid-template-rows: min-content min-content auto min-content; }
    

    * {
      box-sizing: border-box;
    }
    
    .grid {
      height: 100vh;
      display: grid;
      grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
      grid-template-rows: min-content min-content 1fr min-content;
      grid-gap: 10px;
      grid-template-areas: "header header" 
                            "nav nav" 
                            "sidebar main"
                            "footer footer";
    }
    
    .title {
      grid-area: header;
      background-color: #1BC336;
    }
    
    .navigation {
      grid-area: nav;
      background-color: #C3A21B;
    }
    
    .sidebar {
      grid-area: sidebar;
      background-color: gold;
      overflow: auto;
    }
    
    .main {
      grid-area: main;
      background-color: #1BC3B9;
      overflow: auto;
    }
    
    .footer {
      grid-area: footer;
      background-color: #5C1BC3;
    }
    
    body {
      margin: 0;
    }
    <div class="grid">
      <div class="title">
        <h1>Title Bar</h1>
      </div>
      <div class="navigation">Navbar</div>
      <div class="sidebar">Sidebar:
        <br>Info-type stuff about what's currently being shown in main</div>
      <div class="footer">Footer</div>
      <div class="main">
        <h2>Main content</h2>
        <br>Should occupy all the remaining space.
    </div>
    </div>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-12
      • 1970-01-01
      • 1970-01-01
      • 2020-09-06
      相关资源
      最近更新 更多