css - 使 flex 元素包裹在列方向容器中

标签 css flexbox word-wrap css-grid

因此,要使用行布局将元素包装在 Flex div 中,我所要做的就是:

div {
  display: flex;
  flex-direction: row;  /* I want to change this to column */
  flex-wrap: wrap;      /* wrap doesn't seem to work on column, only row */
}
<div>
  <p>these</p>
  <p>will</p>
  <p>wrap</p>
</div>

这适用于我的行,但我想让它也适用于我的列。

我尝试将 flex-direction 更改为 column,但它似乎不起作用。有谁知道如何获得此功能?

最佳答案

默认情况下, block 级元素占据其包含 block 的整个宽度。实际上,这会解析为 width: 100%,这会在水平方向上的内容流中设置中断。

因此,Flex 元素可以默认换行在行方向容器中。

然而,HTML 或 CSS 中没有任何内容设置 block 级元素的默认高度。高度由内容驱动(height: auto)。

这意味着元素将垂直流动而不会出现任何中断。

(我猜想,在进化过程中的某个地方,可能是基于可用性研究,人们决定 Web 应用程序可以垂直扩展,但不能水平扩展。)

这就是为什么 Flexbox 不会自动按列方向换行元素。它需要作者定义的高度作为断点。


但是,布局的高度通常是动态的,因此无法设置特定的高度。这使得 Flexbox 无法用于按列方向包装元素。一个很好的替代方案是 CSS Grid Layout ,不需要容器的高度设置:

div {
  display: grid;
  grid-gap: 10px;
}

p:nth-child(3n + 1) {
  grid-row: 1;
  background-color: aqua;
}

p:nth-child(3n + 2) {
  grid-row: 2;
  background-color: orange;
}

p:nth-child(3n + 3) {
  grid-row: 3;
  background-color: lightgreen;
}

p {
  margin: 0;
  padding: 10px;
}
<div>
  <p>ONE</p>
  <p>TWO</p>
  <p>THREE</p>
  <p>FOUR</p>
  <p>FIVE</p>
  <p>SIX</p>
  <p>SEVEN</p>
  <p>EIGHT</p>
  <p>NINE</p>
</div>

浏览器对 CSS 网格的支持

  • Chrome - 自 2017 年 3 月 8 日起全面支持(版本 57)
  • Firefox - 自 2017 年 3 月 6 日起全面支持(版本 52)
  • Safari - 自 2017 年 3 月 26 日起全面支持(版本 10.1)
  • Edge - 自 2017 年 10 月 16 日起全面支持(版本 16)
  • IE11 - 不支持当前规范;支持过时版本

完整图片如下:http://caniuse.com/#search=grid

关于css - 使 flex 元素包裹在列方向容器中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43834172/

相关文章:

html - 如何在汉堡菜单中加入链接?

css - 如何在不指定 minmax 大小的情况下强制此 CSS 网格换行?

jQuery获取容器中加载的图像宽度/高度

html - 在 <asp : Label> 中嵌入 CSS 样式、事件超链接

css:如何将框 div 元素直接居中居中?

css - 如何使图像缩小以适合固定位置的 flexbox 模态

css - IE11 和 Safari 上的 Flexbox 布局中的文本重叠

html - 如何根据窗口高度使元素滚动或居中

html - 在 nowraps 之间换行

java - 为什么我的 JTextarea 无法正确换行?