有一种方法使换行在多行flexbox?

例如,在这个CodePen的每个第三个项目之后中断。

.container { background: tomato; display: flex; flex-flow: row wrap; align-content: space-between; justify-content: space-between; } .item { width: 100px; height: 100px; background: gold; border: 1px solid black; font-size: 30px; line-height: 100px; text-align: center; margin: 10px; } .item:nth-child(3n) { background: silver; } <div class="container"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> <div class="item">5</div> <div class="item">6</div> <div class="item">7</div> <div class="item">8</div> <div class="item">9</div> <div class="item">10</div> </div>

Like

.item:nth-child(3n){
  /* line-break: after; */    
}

当前回答

.container { background: tomato; display: flex; flex-flow: row wrap; align-content: space-between; justify-content: space-between; } .item { width: 100px; height: 100px; background: gold; border: 1px solid black; font-size: 30px; line-height: 100px; text-align: center; margin: 10px; } <div class="container"> <div> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> </div> <div> <div class="item">4</div> <div class="item">5</div> <div class="item">6</div> </div> <div> <div class="item">7</div> <div class="item">8</div> <div class="item">9</div> </div> <div class="item">10</div> </div>

您可以尝试将项目包装在像这样的dom元素中。有了这个,你不需要知道很多CSS只是有一个良好的结构将解决问题。

其他回答

.container { background: tomato; display: flex; flex-flow: row wrap; align-content: space-between; justify-content: space-between; } .item { width: 100px; height: 100px; background: gold; border: 1px solid black; font-size: 30px; line-height: 100px; text-align: center; margin: 10px; } <div class="container"> <div> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> </div> <div> <div class="item">4</div> <div class="item">5</div> <div class="item">6</div> </div> <div> <div class="item">7</div> <div class="item">8</div> <div class="item">9</div> </div> <div class="item">10</div> </div>

您可以尝试将项目包装在像这样的dom元素中。有了这个,你不需要知道很多CSS只是有一个良好的结构将解决问题。

对于将来的问题,也可以通过使用float属性并在每个3个元素中清除它来实现。

我举了一个例子。

.grid { display: inline-block; } .cell { display: inline-block; position: relative; float: left; margin: 8px; width: 48px; height: 48px; background-color: #bdbdbd; font-family: 'Helvetica', 'Arial', sans-serif; font-size: 14px; font-weight: 400; line-height: 20px; text-indent: 4px; color: #fff; } .cell:nth-child(3n) + .cell { clear: both; } <div class="grid"> <div class="cell">1</div> <div class="cell">2</div> <div class="cell">3</div> <div class="cell">4</div> <div class="cell">5</div> <div class="cell">6</div> <div class="cell">7</div> <div class="cell">8</div> <div class="cell">9</div> <div class="cell">10</div> </div>

从我的角度来看,使用<hr>元素作为伸缩项之间的换行符更有语义意义。

.container { 显示:flex; flex-flow:包装; } .container hr { 宽度:100%; } < div class = "容器" > < div > < / div > 1 2 < div > < / div > <人力资源> < div > 3 < / div > 2 < div > < / div > ... < / div >

在Chrome 66, Firefox 60和Safari 11中测试。

最简单、最可靠的解决方案是在正确的位置插入伸缩件。如果它们足够宽(宽度:100%),它们将强制换行。

.container { background: tomato; display: flex; flex-flow: row wrap; align-content: space-between; justify-content: space-between; } .item { width: 100px; background: gold; height: 100px; border: 1px solid black; font-size: 30px; line-height: 100px; text-align: center; margin: 10px } .item:nth-child(4n - 1) { background: silver; } .line-break { width: 100%; } <div class="container"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="line-break"></div> <div class="item">4</div> <div class="item">5</div> <div class="item">6</div> <div class="line-break"></div> <div class="item">7</div> <div class="item">8</div> <div class="item">9</div> <div class="line-break"></div> <div class="item">10</div> </div>

但这是丑陋的,也不是语义上的。相反,我们可以在flex容器内生成伪元素,并使用顺序将它们移动到正确的位置。

.container { background: tomato; display: flex; flex-flow: row wrap; align-content: space-between; justify-content: space-between; } .item { width: 100px; background: gold; height: 100px; border: 1px solid black; font-size: 30px; line-height: 100px; text-align: center; margin: 10px } .item:nth-child(3n) { background: silver; } .container::before, .container::after { content: ''; width: 100%; order: 1; } .item:nth-child(n + 4) { order: 1; } .item:nth-child(n + 7) { order: 2; } <div class="container"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> <div class="item">5</div> <div class="item">6</div> <div class="item">7</div> <div class="item">8</div> <div class="item">9</div> </div>

但是有一个限制:flex容器只能有一个::before和一个::after伪元素。这意味着你只能强制2个换行符。

要解决这个问题,您可以在伸缩项中而不是在伸缩容器中生成伪元素。这样你就不会被限制在2个。但是这些伪元素不是伸缩项,所以它们不能强制换行。

但幸运的是,CSS Display L3引入了Display: contents(目前仅由Firefox 37支持):

元素本身不生成任何框,但是它的子元素和 伪元素仍然会正常生成方框。为了 框生成和布局时,必须将元素视为已存在 已替换为文档中的子元素和伪元素 树。

因此,您可以将display: contents应用于伸缩容器的子容器,并将每个子容器的内容包装在一个额外的包装器中。然后,伸缩项将是那些额外的包装器和子元素的伪元素。

.container { background: tomato; display: flex; flex-flow: row wrap; align-content: space-between; justify-content: space-between; } .item { display: contents; } .item > div { width: 100px; background: gold; height: 100px; border: 1px solid black; font-size: 30px; line-height: 100px; text-align: center; margin: 10px; } .item:nth-child(3n) > div { background: silver; } .item:nth-child(3n)::after { content: ''; width: 100%; } <div class="container"> <div class="item"><div>1</div></div> <div class="item"><div>2</div></div> <div class="item"><div>3</div></div> <div class="item"><div>4</div></div> <div class="item"><div>5</div></div> <div class="item"><div>6</div></div> <div class="item"><div>7</div></div> <div class="item"><div>8</div></div> <div class="item"><div>9</div></div> <div class="item"><div>10</div></div> </div>

另外,根据旧版本的规范,Flexbox通过使用break-before, break-after或旧的CSS 2.1别名来允许强制中断:

.item:nth-child(3n) {
  page-break-after: always; /* CSS 2.1 syntax */
  break-after: always; /* CSS 3 syntax */
}

但是这些强制换行只适用于Firefox,而且我不认为它们应该适用于当前的规范。新提议的方法(没有在任何地方实现)是前后换行:

.item:nth-child(3n) {
  wrap-after: flex; /* New proposed syntax */
}

.container { background: tomato; display: flex; flex-flow: row wrap; align-content: space-between; justify-content: space-between; } .item { width: 100px; background: gold; height: 100px; border: 1px solid black; font-size: 30px; line-height: 100px; text-align: center; margin: 10px } .item:nth-child(3n) { page-break-after: always; break-after: always; wrap-after: flex; background: silver; } <div class="container"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> <div class="item">5</div> <div class="item">6</div> <div class="item">7</div> <div class="item">8</div> <div class="item">9</div> <div class="item">10</div> </div>

另一个不需要添加任何额外标记的解决方案是添加一些动态边距来分隔元素。

在本例中,这可以通过calc()的帮助来完成,只需在3n+2元素(2,5,8)上添加左边距和右边距。

.item:nth-child(3n+2) {
  background: silver;
  margin: 10px calc(50% - 175px);
}

片段的例子

.container { background: tomato; display: flex; flex-flow: row wrap; align-content: space-between; justify-content: space-between; } .item { width: 100px; height: 100px; background: gold; border: 1px solid black; font-size: 30px; line-height: 100px; text-align: center; margin: 10px; } .item:nth-child(3n+2) { background: silver; margin: 10px calc(50% - 175px); } <div class="container"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> <div class="item">5</div> <div class="item">6</div> <div class="item">7</div> <div class="item">8</div> <div class="item">9</div> <div class="item">10</div> </div>