溢出的弹性容器的孩子超过容器[重复]
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。再次感谢。以上是关于溢出的弹性容器的孩子超过容器[重复]的主要内容,如果未能解决你的问题,请参考以下文章