当将父元素设置为 display: flex
时,其子元素会像这样从左到右对齐
现在,我们可以使用 flexbox 做的一件很酷的事情是改变方向,使子元素垂直堆叠在彼此之上,形成一个列。 我们可以使用 flex-direction
属性(或使用 flex-flow
简写)来实现这一点
好的,很酷。 但是我如何使用 CSS 网格来完成这样的操作呢? 也就是说,假设我想要所有这些子元素像这样对齐
1 3 5 7
--------
2 4 6 8
…而不是这样
1 2 3 4
--------
5 6 7 8
默认情况下,当我将父元素设置为使用 CSS 网格时,元素会像 flexbox 一样从左到右定位。 在下面的示例中,我告诉网格有 6 列和 2 行,然后让子元素填满第一行的每一列,然后再填满第二行的每一列。 你知道,标准的换行行为。
.parent {
display: grid;
grid-template-columns: repeat(6, 1fr);
grid-template-rows: repeat(2, 150px);
gap: 20px;
}
基本上,我在这里想要的是相反的效果:我希望我们的子元素填满第 1 列、第 1 行 **和** 第 2 行,然后再移动到下一列。 换句话说,就是列换行! 我知道,如果我创建一个带有行和列的网格,我可以将这些元素分别放置到这些位置。 像这样
.parent {
display: grid;
grid-template-columns: repeat(6, 1fr);
grid-template-rows: repeat(6, 150px);
}
.child-1 {
grid-column: 1;
grid-row: 1;
}
.child-2 {
grid-column: 1;
grid-row: 2;
}
.child-3 {
grid-column: 2;
grid-row: 1;
}
/* etc, etc. */
好的,很酷! 这样可以让我得到我想要的结果,但是分别设置每个项目的定位实在是太麻烦了。 我感觉就像在使用 position: absolute
,而且感觉不太智能。 那么,如果我只想让这种布局自动完成,以便每个新的子元素都按正确的位置对齐呢?
我想问的是:有没有 CSS 网格版本的 flex-direction: column
呢?
好吧,在四处查找了一番之后,Rachel Andrew 在她相当出色的游乐场 Grid by Example 中为我指出了正确的答案。 正如您在这个演示中所看到的,Rachel 向我们展示了如何实现这一点
太棒了! Rachel 使用 grid-auto-flow
属性来实现这一点:它告诉网格容器如何使用子元素填充未占用的空间。 所以我可以只写这样一行代码
.parent {
display: grid;
grid-auto-flow: column;
/* set up columns and rows here */
}
默认情况下,网格的子元素会填满每一列,直到一行填满,然后它会流到下一行。 这就是为什么 grid-auto-flow
的默认值为 row
,因为我们首先填满网格的行。 但是,如果我们将其设置为 column
,则每个新元素会填满第 1 列的所有空间,然后再移动到第 2 列,依此类推。
.parent {
display: grid;
grid-auto-flow: column;
grid-template-columns: repeat(6, 1fr);
grid-template-rows: repeat(2, 150px);
}
这就是 grid-auto-flow
中的 flow 部分的含义,而我很久以来都忽略了这个属性,因为它看起来(别笑)很可怕。 仅仅读到 grid-auto-flow
这个词就足以让我想要关掉笔记本电脑,然后跑到海里去。
但是!这是一个非常有用的属性,而且非常有意义,尤其是如果您将其视为 flex-direction
的 CSS 网格版本。
您的文章很棒,非常有用,谢谢
这感觉非常接近于允许我使用网格布局模型,在普通的大于手机的横屏上进行表格化(通常,本质上非常水平),然后切换方向,以便每一行中的每个单元格在瘦长的竖屏手机上垂直堆叠。
嗯。
顺便说一句,您诚实地承认害怕 IT 中的新概念,这一点值得赞扬。 被迫不断重造轮子的 IT 工作人员所承受的负担是可怕的。 谢谢您坦诚相待。
太酷了,谢谢您!
我仍然漏掉了什么… 有没有办法在不知道行数的情况下使用它呢?
这行代码暗示您将有两行
grid-template-rows: repeat(2, 150px);
这行代码有 6 列
grid-template-columns: repeat(6, 1fr);
如果我有 30 个项目怎么办?
有没有办法只说:在两列之间均匀分割,并调整行数?
谢谢
可能无法使用网格实现,但您可以使用 Multicol。 设置
columns: 4
而不是display: grid
,您应该会得到四个平衡的列。在调整视窗大小的时候,有没有办法将整列按行的方向换行?
我的意思是,从
1 4
2 5
3 6
到
1
2
3
4
5
6
当视窗过窄而无法容纳两列时。
我知道这在某种程度上是矛盾的——将自动流从行更改为列,然后再更改为行,但也许有解决方法?