【问题标题】:How to get grid items of different lengths to wrap?如何让不同长度的网格项目包裹起来?
【发布时间】:2018-04-15 09:04:57
【问题描述】:

使用repeat()auto-fit / auto-fill 函数,当列或行有定义的长度模式时,很容易让网格项换行。

在下面的示例中,所有列的最小宽度为 100px,最大宽度为 1fr。

jsFiddle demo

#grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
  grid-gap: 1em;
}

#grid > div {
  background-color: #ccddaa;
  padding: 10px;
}
<div id="grid">
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
</div>

但是当轨道没有长度模式(即长度随机变化)时,如何使网格项进行换行?

在下面的示例中,第一列的宽度为 60%。第二列是最小/最大 250px/1fr。如何让第二列在较小的屏幕上换行?

jsFiddle demo

#grid {
  display: grid;
  grid-template-columns: 60% minmax(250px, 1fr);
  grid-gap: 1em;
}

#grid > div {
  background-color: #ccddaa;
  padding: 10px;
}
<div id="grid">
  <div></div>
  <div></div>
</div>

我知道 flexbox 和媒体查询提供了解决方案,但我想知道网格布局是否可以做到这一点。我搜索了spec,但没有找到任何东西。也许我错过了这个部分。感谢您的帮助。

【问题讨论】:

  • grid 通过列和行构建网格,这使得每行和列的大小相同,就像 HTML 表格一样。像表格一样,元素可以跨越几行或几列,.. 但它需要通过类/id 或伪类在每个容器的 css 中设置。自动填充可以使项目的数量发生变化,但列宽和行高将采用它包含的最宽元素。请参阅:w3.org/TR/css-grid-1/#auto-repeat auto-fit 可能是您正在寻找的内容
  • 谢谢。我熟悉规范中的布局概念和部分 (I've written about it before)。我想知道 Grid 是否有不同的方法来包装轨道,或者通过我还没有发现的方法,或者通过创建一个比方说 12 列的网格,然后使用基于行的放置来使项目跨列和最终包裹。 @G-Cyr
  • oups,不幸的是,据我所知,事实并非如此,不幸的是,您最终可能会遇到孩子相互重叠的情况:(您的问题和期望似乎与内联元素 101 行为非常相似......如果它包含内联内容。这确实是一个不错的智能功能。
  • 是的,grid(table 2.0 显示版本)与表格显示非常相似,但从一开始就缺少 col 和 row span。 Flex 绝对是目前最灵活的网格系统

标签: css css-grid


【解决方案1】:

网格项目实际上并没有换行。您看到网格项目“包装”到下一行的原因实际上是因为显式网格正在被更改以保持在minmax() 规定的约束范围内。 repeat()生成的列数与网格容器的使用宽度成正比,网格项根据列数一一布局,并根据需要创建新行。

因此,当有两列并且显式网格中有空间可以在第二列中插入该网格项时,不可能强制第二个网格项换行。此外,即使您可以告诉第二个网格项“换行”,这也意味着将其放置在新行中第一列,因此其布局将受到控制由第一列而不是第二列。当然,仍然根据第二列调整大小会完全破坏网格布局。

如果打算通过将元素换行来适应较小的屏幕,则应使用 flex 布局,而不是网格布局。网格布局不适用于此目的。

【讨论】:

  • Flexbox 迫使我跳出传统的 CSS 概念去思考。现在 Grid 迫使我在 flex 概念之外思考。 Flex 包装行为是我问题背后的(错误)想法。感谢您的澄清。