提问者:小点点

在容器子元素包装时使其收缩以适应


我试图弄清楚flexbox在以下情况下是如何工作的(应该工作吗?……):

null

.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 &amp; 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 &amp; 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 &amp;
    <br>documents</div>
</div>

null

此处为JSFiddle

问题是,当有足够的空间来容纳元素时,我得到了一个很好的紧身的孩子们,它们之间有均匀的间距。(第一个,顶部div块)

然而,当没有足够的空间,并且孩子们内部的文本开始换行时,这一切就会朝着一个奇怪的方向发展--孩子们不再紧密地适合,即使换行之后,flex孩子们周围有足够的空间,因为不再合适,所以周围的空间也没有机会工作(第二个div块)

然而,如果我在自动换行发生的地方加上手动换行,所有的东西都按“应该”排列…(底部,第三块)

我想要的是总是让孩子们紧紧地装在他们的盒子里(黑色的边框),不管剩下的空间是什么,都将均匀地分布在他们之间,而不是我必须添加手动换行符(在我的情况下这不是一个选择)

有可能吗?…


共3个答案

匿名用户

在CSS中,父容器不知道其子容器何时包装。因此,它继续扩大其规模,而忽略了内部发生的事情。

换句话说,浏览器在初始级联上呈现容器。当子文件包装时,它不会回流文档。

这就是为什么容器不会收缩--包裹较窄的布局。它只是继续进行,就好像没有任何东西被包裹,就像右边的预留空间所证明的那样。

水平空白的最大长度是容器预期存在的元素的长度。

在下面的演示中,当窗口水平调整大小时,可以看到空格来来去去

您将需要一个JavaScript解决方案(参见此处和此处)。。。或CSS媒体查询(请参阅此处)。

在处理包装文本时,容器上的text-align:right在某些情况下可能会有帮助。

匿名用户

好好看看我换的小提琴:

  • .holder宽度最大宽度(单位为.v类)
  • .holder修改为环绕空格环绕其子级
  • 又添加了2个.v类为清楚起见
  • 删除了
  • 最重要的是,在.child中添加了flex:0 0

Flexbox几乎总是需要设置max-width,这比width更灵活。根据您需要.children的行为方式,修改flex-growflex-shrink中的flex-grow以满足您的需要。(flex:1 0的结果看起来也不错)

。。。不需要Javascript.。。

更新Codrops Flexbox参考真的帮了我很多了解FBL的东西。。。

匿名用户

你的块之所以有这样的行为是因为CSS渲染。

在第一种情况下,浏览器不知道块何时变得太小,无法容纳它的内容。所以它一直拉伸,直到达到最大值,然后呈现文本。

在最后一种情况下,您告诉浏览器在哪里中断,这样它就知道元素不应该变宽。

你可以轻松解决这个问题的唯一方法就是自己设置休息时间。