Flexbox:如何让 div 在不换行的情况下填充 100% 的容器宽度?

Posted

技术标签:

【中文标题】Flexbox:如何让 div 在不换行的情况下填充 100% 的容器宽度?【英文标题】:Flexbox: how to get divs to fill up 100% of the container width without wrapping? 【发布时间】:2015-08-21 11:31:19 【问题描述】:

我正在更新一个旧的基于inline-block 的网格模型,我必须使用我创建的一个较新的 Flexbox 模型。一切都很好,除了一个小障碍,这已经成为一个破坏者:

我有一堆 CSS 控制的滑块;所以有一个 100% 宽度的包含包装器,里面是另一个 div:它的宽度也是 100%,但它的 white-space 设置为 nowrap。使用inline-block,这意味着内部 div(设置为 100% 宽度)不会受到其父母的约束并换行到下一行 - 他们只会携带开箱即用。这正是我想要的。但是,我根本无法让它与 flexbox 一起工作。供参考,这是一张图片:

作为参考,这里有一个使用 inline-block 的 jsFiddle:http://jsfiddle.net/5zzvqx4b/

...使用 Flexbox:http://jsfiddle.net/5zzvqx4b/1/

我已经尝试了flexflex-basisflex-wrapflex-grow 等的各种变体,但对于我的生活,我无法让它发挥作用。

请注意,我可以通过将.boxcontainer 宽度设置为200% 来强制它以一种笨拙、不灵活的方式执行我想要的操作。这适用于这个单个示例,但在某些情况下,我不会事先知道会有多少子框,并且如果可能的话,我宁愿不要对每个元素使用内联样式。

【问题讨论】:

... 不是答案,但是为什么要更改 flex,您已经有一个没有前缀的工作代码,并且可以在更多浏览器上工作? @sdcr:由于项目的其他要求,大约 20,000 行代码,可能需要一段时间才能进入。 哦,好吧,只是说您在那里设置的一些 flex 属性甚至没有必要,例如 flex-direction: row;justify-content: flex-start;align-items: flex-start; 这些是默认规则,除非您重新覆盖它们。有一个很棒的指南here。 @sdcr:谢谢——在那个例子中确实非常冗长,但这只是因为我直接从我的样式表中复制粘贴它,其中有很多条件和子类等。这就是明确设置属性的原因。我对 flexbox 的了解还不够充分,无法将其从头顶上写下来! 是有道理的,请注意,浏览器对 flex 的支持是带有 -ms* 前缀的 IE10+。 【参考方案1】:

为防止弹性项目收缩,请将flex shrink factor 设置为0

弹性收缩系数决定了flex item 的大小 相对于 flex 中的 flex items 的其余部分收缩 分配负可用空间时的容器。省略时为 设置为 1。

.boxcontainer .box 
  flex-shrink: 0;

* 
  box-sizing: border-box;

.wrapper 
  width: 200px;
  background-color: #EEEEEE;
  border: 2px solid #DDDDDD;
  padding: 1rem;

.boxcontainer 
  position: relative;
  left: 0;
  border: 2px solid #BDC3C7;
  transition: all 0.4s ease;
  display: flex;

.boxcontainer .box 
  width: 100%;
  padding: 1rem;
  flex-shrink: 0;

.boxcontainer .box:first-child 
  background-color: #F47983;

.boxcontainer .box:nth-child(2) 
  background-color: #FABCC1;

#slidetrigger:checked ~ .wrapper .boxcontainer 
  left: -100%;

#overflowtrigger:checked ~ .wrapper 
  overflow: hidden;
<input type="checkbox" id="overflowtrigger" />
<label for="overflowtrigger">Hide overflow</label><br />
<input type="checkbox" id="slidetrigger" />
<label for="slidetrigger">Slide!</label>
<div class="wrapper">
  <div class="boxcontainer">
    <div class="box">
      First bunch of content.
    </div>
    <div class="box">
      Second load  of content.
    </div>
  </div>
</div>

【讨论】:

天哪谢谢。我实际上忽略了flex-shrink 属性,因为我读过的描述似乎并不相关。认为自己在... 6 分钟内被接受!【参考方案2】:

您可以使用简写的 flex 属性并将其设置为

flex: 0 0 100%;

flex-growflex-shrinkflex-basis 在一行中。上面介绍了flex的收缩,flex的增长是相反的,flex的基础是容器的大小。

【讨论】:

太棒了!超级好用。【参考方案3】:

就我而言,仅使用 flex-shrink: 0 是行不通的。但是添加flex-grow: 1 是有效的。

.item 
    flex-shrink: 0;
    flex-grow: 1;

【讨论】:

以上是关于Flexbox:如何让 div 在不换行的情况下填充 100% 的容器宽度?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不裁剪或换行的情况下限制列宽?

在不换行的情况下创建 Bootstrap 3 Navbar 的最佳方法(并且不折叠)

如何可以让div内的元素不换行?

div不换行的三种方法

html5简单问题,如何不换行?

如何让多个div横向排列而不换行