我已经花了一段时间了,并尝试了我在不同的Stackoverflow问题/博客文章/中看到的许多解决方案。但是,老实说,我无法弄清楚出了什么问题。
我有一个灵活的div,其中有两个div。顶部div A具有固定的高度,另一个div B使用flex: 1;
填充其余部分。如果调整了屏幕大小,并且屏幕的总和小于A + B的高度,则B将开始溢出。我希望它滚动,但我也希望滚动时内容完全可见。由于某些我无法弄清的原因,您可以在my fiddle的屏幕截图中看到该内容呈现在div B顶部之外:
某些先前问到的问题使我陷入困境。例如,将正文设置为height: auto;
,但是当我的屏幕大于A + B时,它将无法再进行中心对齐。 min-height: 0;
在这种情况下似乎也无济于事。
我如何确保我的容器溢出,但会完全显示其中的内容?
答案 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
不适用。我希望这是有道理的,我无法更好地解释它。