溢出的弹性容器的孩子超过容器[重复]

Posted

技术标签:

【中文标题】溢出的弹性容器的孩子超过容器[重复]【英文标题】:Children of overflowing flex container exceed container [duplicate] 【发布时间】:2019-06-20 19:28:00 【问题描述】:

我在这方面已经有一段时间了,并尝试了很多我在不同 *** 问题/博客文章中看到的解决方案/...但老实说,我不知道出了什么问题。

我有一个带有两个 div 的 flexed div。顶部 div A 具有固定高度,另一个 div B 使用 flex: 1; 填充其余部分。如果屏幕被调整大小并且小于 A + B 的高度,那么 B 将开始溢出。我希望它滚动,但我也希望滚动时内容完全可见。出于某种我无法理解的原因,如您在my fiddle 的截图中所见,内容呈现在 div B 的顶部:

之前提出的一些问题让我有所了解。例如将主体设置为height: auto;,但是当我的屏幕大于 A + B 时,它就不能再居中对齐了。 min-height: 0; 在这种情况下似乎也没有帮助。

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

【问题讨论】:

因此,如果我理解正确,您希望能够在屏幕尺寸小于 A + B 时滚动浏览所有内容,而不仅仅是能够上下滚动一点并且仍然有你的一些内容被隐藏了?这是正确的还是我错过了什么? 当然,当屏幕小于 A + B 时,如果您认为这就是我的意思,就不可能看到整个 A + B。如果您查看我附加的代码笔并调整屏幕大小使其小于容器,我认为您会更好地理解我想要实现的目标。如果然后向上滚动,您将看不到 3 个 div 的顶部。但是,您可以看到底部的 2 个 div(取决于您的屏幕有多小),但现在不可能看到顶部的矩形。我希望能够看到该代码笔中的所有 3 个矩形。 我修复了它.. 但是我觉得你投入的 css 比需要的多得多.. 如果你需要更多帮助,请告诉我 主要问题是align-items: center on .second。删除它并将margin: auto 添加到.container,加上flex-shrink: 0.container-child,你就完成了(你可以删除很多不必要的代码)(revised codepen)。副本中的完整解释。 【参考方案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)提供滚动条,因为那样的话,如果父级的顶部和顶部孩子的重合并且孩子比父母大,孩子不再居中,是吗? 当使用其他居中技术并且您将较大的孩子置于较小的父母中时,也会发生同样的情况。 要解决此问题,您需要防止孩子长得超过父母。

在这种情况下,这意味着根据其内容 (flex-basis: auto) 调整 .second 的大小,并且不允许其缩小:(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 不适用。我希望这是有道理的,我无法更好地解释它。

【讨论】:

这似乎确实可以解决问题。我不明白这现在是怎么解决的......另外,我显然没有 100% 正确地复制我的项目中的情况,因为那不是解决方案......我不确定我是否' ' d 能够得到它在一个工作小提琴,虽然那时...... 我会解释为什么会出现这个问题,但这需要几分钟,因为它并不像看起来那么简单。 我想通了。我一直在阅读并试图 100% 完全理解 flexbox 周围的一切,因为它是一个非常强大的掌握工具。 这是很久以前做出的决定,此后一直在进行:决定当内容溢出到右侧或底部时,用户希望能够滚动到它们,但是当对左上角做同样的事情,主要目的是隐藏它们,所以不应该允许滚动。底线:它就是这样,你无法改变它。 :) 当你想到它时,它是有道理的。非常感谢您的广泛解释,非常感谢!现在也设法在我的个人项目中修复它,只需将flex-shrink: 0; 应用于它旁边的 div,因为您的修复将另一个 div 推开而不会缩小另一个 div。再次感谢。

以上是关于溢出的弹性容器的孩子超过容器[重复]的主要内容,如果未能解决你的问题,请参考以下文章

flex容器内的居中元素正在增长并溢出顶部[重复]

IE11中的Flex项目溢出[重复]

缩放弹性容器中的子元素[重复]

当它也是一个弹性容器时,如何防止最后一个弹性项目填充剩余宽度[重复]

滚动弹性容器不适合居中的项目[重复]

输入元素溢出容器[重复]