提问人:Mikhail Kornienko 提问时间:5/24/2016 最后编辑:Mo.Mikhail Kornienko 更新时间:11/11/2022 访问量:37828
使容器在包装时收缩以适合子元素
Make container shrink-to-fit child elements as they wrap
问:
我试图弄清楚 flexbox 是如何工作的(应该工作?...),适用于以下情况:
.holder {
width: 500px;
background: lightgray;
display: flex;
flex-direction: row;
justify-content: space-between;
flex-wrap: nowrap;
}
.v2 {
width: 320px;
}
.child {
display: inline-block;
border: 1px solid black;
padding: 30px 0px;
text-align: center;
}
<div class="holder">
<div class="child">At a glance</div>
<div class="child">After coverage ends</div>
<div class="child">Forms & documents</div>
</div>
<br>
<br>
<div class="holder v2">
<div class="child">At a glance</div>
<div class="child">After coverage ends</div>
<div class="child">Forms & documents</div>
</div>
<br>
<br>
<div class="holder v2">
<div class="child">At a
<br>glance</div>
<div class="child">After coverage
<br>ends</div>
<div class="child">Forms &
<br>documents</div>
</div>
问题是,当有足够的空间来容纳元素时,我会得到一个漂亮的紧身儿童,两者之间的间距均匀。(第一个,顶部 div 块)
然而,当没有足够的空间并且 children 内部的文本开始换行时,这一切都朝着一个奇怪的方向发展——孩子们不再紧密贴合,即使换行后,flex children 周围也有足够的空间,因为不再适合了,space-around 真的没有机会工作(第二个 div 块)
但是,如果我在发生自动换行符的地方添加手动换行符,那么一切都会按照“应该”的方式布局......(底部,第三块)
我想要的是始终让孩子们紧紧地放在他们的盒子里(黑色边框),无论剩下什么空间,都会在他们之间均匀分布,而我不必添加手动换行符(这在我的情况下不是一个选项)
有可能吗?...
答:
你的块之所以像这样,是因为 CSS 渲染。
在第一种情况下,你摆弄浏览器不知道块何时变得太小而无法容纳它的内容。因此,它一直拉伸,直到达到最大值,然后呈现文本。
在最后一种情况下,你告诉浏览器在哪里中断,这样它就知道元素不应该变宽。
轻松解决此问题的唯一方法是自己设置休息时间。
评论
在 CSS 中,父容器不知道其子容器何时换行。因此,它继续扩大其规模,而忽略了内部发生的事情。
换句话说,浏览器在初始级联上呈现容器。当子项换行时,它不会重排文档。
这就是为什么容器不会收缩包装较窄的布局的原因。它只是继续前进,就好像没有任何东西包裹一样,正如右边的预留空间所证明的那样。
水平空白的最大长度是容器预期存在的元素的长度。
在下面的演示中,可以看到在窗口水平调整大小时出现和消失的空白:DEMO
你需要一个 JavaScript 解决方案(见 这里 和 这里)......或 CSS 媒体查询(请参阅此处)。
在处理换行文本时,在某些情况下,在容器上可能会有所帮助。text-align: right
评论
.item
.internal-container
好好看看我改变的小提琴:
.holder
设置为(在类中)width
max-width
.v
- 将
.holder
修改为及其子项wrap
space-around
- 为清楚起见,又添加了 2 个
.v
类 - 删除了
<br>'s
- 最重要的是,添加到
.child
flex: 0 0
Flexbox 几乎总是需要设置,这比 .
根据您需要任的行为方式,修改 和 in 以满足您的需求。(结果看起来也不错)max-width
width
.child
flex-grow
flex-shrink
flex: 0 0
flex: 1 0
...无需 Javascript...
Codrops Flexbox 参考对于理解灵活框布局非常有用。
评论
flex: 0 0;
如果你正在寻找一个纯CSS的解决方案,你可以使用类似的东西来设置子项的最小宽度,以便它增长。width: 100px;
flex: auto;
示例:https://jsfiddle.net/ncvp7gzs/1
(请注意,这仅在 Chrome 上进行了测试)
评论