有没有办法在多行flexbox中换行?

例如,在this 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>

喜欢

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

推荐答案

最简单、最可靠的解决方案是在正确的位置插入flex项.如果它们足够宽(width: 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容器中生成伪元素,并使用order将它们移动到正确的位置.

.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次换行.

要解决这个问题,您可以在flex项中生成伪元素,而不是在flex容器中.这样您就不会被限制为2个,但是那些伪元素将不是弹性项,因此它们将不能强制换行.

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

元素本身不会生成任何框,但它的子级和 伪元素仍然照常生成方框.为了…的目的 框生成和布局时,必须将元素视为具有 已在文档中替换为其子元素和伪元素 树.

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

.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>

或者,根据an old version of the spec的说法,Flexbox允许通过使用break-beforebreak-after或其旧的CSS 2.1别名来强制中断:

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

但是这些强制换行符只在Firefox上有效,我认为它们不应该按照当前的规范工作.新提议的方式(没有在任何地方实施)是wrap-before or wrap-after:

.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>

Html相关问答推荐

将小文本放在输入字段的右侧

卸载伪元素 destruct 了CSS

在Apps Script中连接CSS与HTML

试图让三个Divs与下面的另外三个对齐

Chrome和Safari浏览器中的CSS3动画不同

附加点的列表样式

邮箱追踪器-有效,但在Gmail客户端中是否可以显示问号图标以外的其他内容?

如何使用HTML和css代码在vb.net上打印POS

如何翻转卡片图像的背面

如何在页面太短时使<;img&>缩小而不发生y溢出

柔性盒内的物品;t覆盖整个宽度,即使设置为100%

如果您将带有 html 标签的字符串数据(name : test) 放在 `

如何在 VS Code 中 Select 和删除 HTML 元素(其标签和内容)?

对齐页面左侧的单选按钮

网页设计不适合移动设备

父背景仅在子元素中可见

自定义进度条 Html 和 CSS 布局

使用 tailwind css 将 HTML/CSS/JS 站点转换为 React App

文本输入在 Chrome 中保持水平滚动,带有文本溢出:省略号

下拉菜单项在页面加载时显示,需要隐藏直到悬停