我如何最好地使用 CSS 使包含高嵌套元素的页面限制在视口的高度内?

How do I best use CSS to make a page with tall nested elements to be limited to the height of the viewport?

如何最好地将页面限制在视口的高度内?我想管理子元素上的 overflow-y,但似乎我无法限制高度——我只能管理以像素或百分比为单位的最大高度。我想我需要将某些元素的高度限制为视口高度的剩余部分(不是百分比),但我找不到这样做的方法。

(我正在使用 bootstrap,但我怀疑答案不是以 bootstrap 为中心的。)

我想也许我可以将 flex 与 flex-grow 一起使用,但这也不会限制高度。我错过了什么?

<div class="container d-flex flex-column ">
 <div>
 My full-width page title goes here 
 </div>
  <div class="row flex-grow-1">
    <div class="col col-4">
      potentially long content here
    </div>
    <div class="col-8">
     main content 
    </div>
  </div>
</div>

与CSS

body {
  height: 100vh;
}

.row {
  margin-top: 20px;
}

.col {
  border: solid 1px black;
  padding: 10px;
  overflow-y: scroll;
}

(Fiddle)

实际:页面无限高;内部滚动条没有实际意义;视口滚动条开启

期望:页面使用视口的整个高度,仅此而已;内部滚动条有效;没有视口滚动条

如果您不习惯使用 bootstrap/flexbox,css 网格会让这一切变得非常简单。

HTML

<div class="wrapper">
   <div class="header">
     My full-width page title goes here 
   </div>
   <div class="sidebar">
      sidebar content
    </div>
    <div class="main">
     main content 
    </div>
</div>

CSS

html, body, .wrapper {
  height: 100%;
}

.wrapper {
  display: grid;
  grid-template-columns: 1fr 2fr;
  grid-auto-rows: min-content auto;
  grid-template-areas: 
    "header header"
    "sidebar main";
}

.header {
  grid-area: header;
  background: red;
}

.sidebar {
  grid-area: sidebar;
  overflow: auto;
}

.main {
  grid-area: main;
}

fiddle