Flexbox项目换行到新行[重复]

Posted

技术标签:

【中文标题】Flexbox项目换行到新行[重复]【英文标题】:Flexbox item wrap to a new line [duplicate] 【发布时间】:2017-12-18 14:33:13 【问题描述】:

有一个 flexbox 网格。

.flex 
  display: flex;
  flex-wrap: wrap;
  border: 2px solid red;


.item 
  width: 50px;
  height: 50px;
  margin: 5px;
  border: 2px solid blue;
<div class="flex">
  <div class="item"></div>
  <div class="item"></div>
  <div class="item new-string"></div>
</div>

如何将 .new-string 连同其后的元素一起转移到新行?

【问题讨论】:

一种方法是 - 在它之前放置一个 div 并将其设置为 100% 宽度,或者您可以使用 [suedo 元素来实现相同的效果 1) 是否允许更改标记? 2) 这里允许使用 javascript 吗? @VadimOvchinnikov,1)没有它是可取的,但它是允许的。 2) 允许 您可以将flex-basis: 100% 用于要换行的项目。 【参考方案1】:

如果您查看 this great answer,您会注意到唯一的跨浏览器方式(没有 2 个换行符限制)是插入 100%-width 空块(“换行符”)。所以对于类似的标记,这看起来像

.flex 
  display: flex;
  flex-wrap: wrap;
  border: 2px solid red;


.item 
  width: 50px;
  height: 50px;
  margin: 5px;
  border: 2px solid blue;


.line-break 
  width: 100%;
<div class="flex">
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="line-break"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="line-break"></div>
  <div class="item"></div>
  <div class="line-break"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
</div>

如果你想保留你的标记风格,你必须通过 JavaScript 插入这个 line-break 块:

var items = document.querySelectorAll(".flex > .item.new-string");

for (var i = 0; i < items.length; i++) 
  var lineBreak = document.createElement('div');
  lineBreak.className = "line-break";

  items[i].parentNode.insertBefore(lineBreak, items[i]);
.flex 
  display: flex;
  flex-wrap: wrap;
  border: 2px solid red;


.item 
  width: 50px;
  height: 50px;
  margin: 5px;
  border: 2px solid blue;


.line-break 
  width: 100%;
<div class="flex">
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item new-string"></div>
  <div class="item"></div>
  <div class="item new-string"></div>
  <div class="item new-string"></div>
  <div class="item"></div>
  <div class="item"></div>
</div>

【讨论】:

【参考方案2】:

这似乎与网格布局有关。 首先定位项目内联,你可以使用

grid-template-columns: repeat(auto-fill, 50px);

这样每个项目占用 50px 并将项目放置在一行中,直到没有更多的项目可以容纳在一行中。然后您可以在特定项目上使用grid-column-start: 1;,以便它转到新行。

* 
  box-sizing: border-box;

.flex 
  display: grid;
  grid-gap: 10px;
  grid-template-columns: repeat(auto-fill, 50px);
  border: 2px solid red;


.item 
  width: 50px;
  height: 50px;
  margin: 5px;
  border: 2px solid blue;


.new-string 
  grid-column-start: 1;
  background: red;
&lt;div class="flex"&gt;&lt;div class="item"&gt;&lt;/div&gt;&lt;div class="item"&gt;&lt;/div&gt;&lt;div class="item"&gt;&lt;/div&gt;&lt;div class="item new-string"&gt;&lt;/div&gt;&lt;div class="item"&gt;&lt;/div&gt;&lt;div class="item"&gt;&lt;/div&gt;&lt;div class="item"&gt;&lt;/div&gt;&lt;div class="item"&gt;&lt;/div&gt;&lt;div class="item new-string"&gt;&lt;/div&gt;&lt;div class="item"&gt;&lt;/div&gt;&lt;div class="item"&gt;&lt;/div&gt;&lt;div class="item new-string"&gt;&lt;/div&gt;&lt;div class="item"&gt;&lt;/div&gt;&lt;/div&gt;

【讨论】:

如果你走这条路线,请务必检查浏览器兼容性 很好的答案,值得注意的是,即使使用过时的标记,也无法将此标记转换为 IE/Edge。在 IE/Edge 中没有自动放置,您需要手动为每个单元格指定行和列(除非它们每个单元格内容都将堆叠在单个单元格中)但是这里我们不能这样做(由于需要灵活的自动生成网格)。【参考方案3】:

作为替代方案,您可以简单地这样做

html

<div class="flex">
  <div class="item"></div>
  <div class="item"></div>
  <div class="item line-break"></div>
  <div class="item new-string"></div>
</div>

CSS

.line-break 
    width: 100%;

100% 宽度的弹性项目会给你换行符。 在 flex 网格中获取新行的最简单方法,当然你需要一个额外的 div,但我不觉得这样做很糟糕

【讨论】:

【参考方案4】:

所有弹性项目默认设置为order: 0。这意味着它们将按照它们在源代码中出现的顺序排列。

如果你给最后一个项目order: 1,这会在添加其他项目时强制它在最后一个。

::before::after pseudo elements on a flex container create new flex items。

因此,如果我们添加一个宽度足够大的伪元素,它将强制您的最后一项(由order 设置)到下一行。

.flex 
  display: flex;
  flex-wrap: wrap;
  border: 2px solid red;


.item 
  width: 50px;
  height: 50px;
  margin: 5px;
  border: 2px solid blue;


.new-string 
  order: 1;


.flex::after 
  content: "";
  flex: 0 0 100%;
  height: 0;
<div class="flex">
  <div class="item"></div>
  <div class="item"></div>
  <div class="item new-string"></div>
</div>

【讨论】:

但是如果你需要移动几次,那么这个选项就不起作用了

以上是关于Flexbox项目换行到新行[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用flexbox将项目保存在包装列表的第一行

css Flexbox:收缩时切换卡文本轴

Flexbox 网格 - 对齐:围绕空格并对齐最后一个项目

如何使用 Flexbox 以特定项目开始新行?

flexbox 可以检测 flex 项目何时换行吗?

文本正在调整 flexbox 子项的大小而不是换行(使用 flex-grow)[重复]