弹性容器溢出的子项超过容器

时间:2019-01-27 17:46:05

标签: html css css3 flexbox

我已经花了一段时间了,并尝试了我在不同的Stackoverflow问题/博客文章/中看到的许多解决方案。但是,老实说,我无法弄清楚出了什么问题。

我有一个灵活的div,其中有两个div。顶部div A具有固定的高度,另一个div B使用flex: 1;填充其余部分。如果调整了屏幕大小,并且屏幕的总和小于A + B的高度,则B将开始溢出。我希望它滚动,但我也希望滚动时内容完全可见。由于某些我无法弄清的原因,您可以在my fiddle的屏幕截图中看到该内容呈现在div B顶部之外:

enter image description here

某些先前问到的问题使我陷入困境。例如,将正文设置为height: auto;,但是当我的屏幕大于A + B时​​,它将无法再进行中心对齐。 min-height: 0;在这种情况下似乎也无济于事。

我如何确保我的容器溢出,但会完全显示其中的内容?

1 个答案:

答案 0 :(得分:1)

您可以通过提供.second来解决此问题:

flex-basis: auto;
flex-shrink: 0;

或者,用简写:flex: 1 0 auto;

工作示例:

html, body {
  width: 100%;
  height: 100%;
  padding: 0;
  margin: 0;
}

body {
  display: flex;
  flex-direction: column;
}

.second {
  flex: 1 0 auto;
  background: blue;
  width: 100%;
  
  display: flex;
  justify-content: center;
  align-items: center;
  
  min-height: 0;
  
  overflow: auto;
}

.container {
  display: flex;
  flex-direction: column;
  width: 100%;
  max-width: 500px;
  min-height: 0;
  /* added this to make it obvious. Obviously, not needed */
  padding: 2rem 0;
}

.container-child {
  height: 110px;
  background: green;
  width: 100%;
}

.container-child:not(:last-child) {
  margin-bottom: 30px;
}
<div class="second">
  <div class="container">
    <div class="container-child"></div>
    <div class="container-child"></div>
    <div class="container-child"></div>
  </div>
</div>

我在.container上添加了一些顶部和底部填充,以使其明显起作用-但这不是必需的。

现在让我们看看为什么。当您应用.second { flex:1; }时,它意味着:

flex-grow: 1;
flex-shrink: 1;
flex-basis: 0%;

...,使其尺寸小于其内容。

只要您有一个较大的孩子并以较小的父母为中心,浏览器就不会向top(或left,水平时)提供滚动条,因为那么,如果父母与孩子的顶部重合,并且孩子比父母大,孩子不再居中,对吗? 当使用其他居中技术时,也会发生相同的情况,而您将较大的孩子放在较小的父母中。 要解决此问题,您需要防止孩子的父母长大。

在这种情况下,这意味着根据其内容(.second)调整flex-basis: auto的大小,并且不允许其收缩(flex-shrink: 0;)。

为更好地了解问题,请考虑以下示例:

.left, .right {
  position: relative;
  border: 1px solid red;
  padding: 1rem 5rem;
}
.left {
  left: -5rem;
}
.right {
  right: -5rem;
}
<div class="left">
  I'm taken left
</div>
<div class="right">
  I'm taken right
</div>

如果浏览器提供了滚动条以允许您滚动到.left的开头,则意味着left: -5rem不适用。我希望这是有道理的,我无法更好地解释它。