CSS网格中的放置、跨度和密度
介绍
你在 CSS Grid 中学到的最常见的东西通常与网格容器有关,而不是与网格项有关。 应用于网格容器的通用网格定义对于基本布局结构来说已经足够了。 但是,当您需要对网格的内容进行更多控制时,网格容器的使用会受到限制。
例如,您可能想要一个 4 x 2 的网格,但第一个网格项应占用第 1 列和第 2 列以及第 1 和第 2 行。 或者,当您不知道网格列轨道的运行时总数是多少时,您可能希望一个项目跨越到最后一个网格列轨道。
每个网格项的大小都是预定义的,您需要找到一种方法来相对于网格容器中的其他项调整它们的大小。
在本教程中,您将探索 CSS Grid 中的放置、跨越和密度。
放置网格项目:从这里开始,从那里结束
浏览器中的所有内容都有默认样式,例如 0
或 auto
。 在调整自定义值之前,您还可能需要了解其他默认值。 当你有一个网格时,网格项的放置值由 grid-[x]-start
和 grid-[x]-end
定义(其中 x
可以是 column
或 row
)。 值为自动。
当您看到网格布局时,请记住该网格中的每个项目都有一个放置值,无论流程看起来多么对称:
.container { display: grid; grid-gap: 10px; grid-template-columns: repeat(5, 1fr) } .item { grid-column-start: auto; /_ default _/ grid-column-end: auto; /_ default _/ grid-row-start: auto; /_ default _/ grid-row-end: auto; /_ default _/ }
放置柱子
让我们从列开始调整这些默认值:
.item:nth-child(1) { grid-column-start: 1; grid-column-end: 5; }
- 我们想要网格中的第一项
.item:nth-child(1)
- 从线一开始,
grid-column-start: 1;
- 并在 line 5,
grid-column-end: 5;
结束
请在此处查看 完整代码 。
放置行
相同的规则适用于行放置:
.item:nth-child(22) { grid-row-start: 1; grid-row-end: 4; }
但是,grid-row-[x]
会将网格项的默认放置重置为从第 1 列和第 1 行开始,然后会发生放置跨越。
您将在此 代码 中看到 22
行离开其位置并在跨越之前向上移动到 1
行。
如果您希望它保持其原始列轨道,那么您必须明确声明:
.item:nth-child(20) { grid-column-start: 3; grid-row-start: 5; grid-row-end: 10; }
您可以只提供 start
或 end
- 您不必成对提供放置属性。 您可以只提供一个,其余的将保持为 auto
(默认)。 需要注意的棘手问题是,如果您仅更改 grid-[x]-start
的值,则网格项将从 行 开始,而不是轨道:
.item:nth-child(1) { grid-column-start: 5; }
另一方面,如果您仅指定 end
,它将从指定的结束值开始并反向跨越网格。 例如,如果您告诉项目 10
在 3
结束,它将从最近的下一行 2
开始并绘制到行 3
:
.item:nth-child(10) { grid-column-end: 3; }
你可以在这里看到所有的代码。
还有 grid-[x]-start
和 grid-[x]-end
的简写语法,允许您取消 -start
和 -end
代码:
.item { grid-column: [start] / [end]; grid-row: [start] / [end]; }
以下是一些可以替代我们目前编写的代码示例的示例:
.item { grid-column: 1 / 5; /__ Line 1 to 5 / grid-row: 1 / 4; /*_ Line 1 to 4 __/ grid-column: 5 / auto; / Line 5 to 6 *_/ grid-column: auto / 3; /_ Line 2 to 3 _/ }
跨越:从这里开始/结束,取 n
我们一直使用“span”这个词来描述一个放置应该占据的轨道数量。 当我们说行 1
到 5
时,我们是说网格项应该从 1
到 5
。 我通常将此称为隐式跨越。
有一个 span
关键字用作值。 使用它时,您可以将其称为显式跨越。 放置和跨越足够灵活,您可以使用隐式和显式跨越作为单个属性的值。
跨越列
让我们先来看看我们如何跨列轨道跨越一个项目:
.item:nth-child(1) { grid-column: span 5; }
这是我们编写的第一个示例的替代方案:
.item:nth-child(1) { grid-column: 1 / 5; }
但我们可以包括其他细节:
.item:nth-child(1) { grid-column: span 2 / 5; }
在这里,我们在 5
结束,跨度 2
向后跟踪。
另一个例子:
.item:nth-child(1) { grid-column: 2 / span 2; }
这里我们从列行 2
开始,到列行 4
结束(在 2
跳转之后)。
跨越行
到目前为止,您在本教程中学到的有关行的所有内容都适用,无一例外:
.item:nth-child(1) { grid-column: 2 / span 2; /_ highlight line_/ grid-row: span 5 }
我们仍然是第一次跨越,但后来我们跨越了行轴。 浏览器会将框向下绘制,占据五个轨道。
过度放置和跨越
回想一下,我们已经明确定义我们的网格有 5
列。 我们可以从 6
列向上跨越或放置一个项目,如下所示:
.item:nth-child(1) { grid-column: span 10; /_ 1 _/ grid-column: 1 / 10; /_ 2 _/ grid-column: 7 / 10; /_ 3 _/ grid-column: 1 / span 10; /_ 4 _/ }
将创建隐式轨道以容纳它们。
负整数作为值
负整数与正整数一样有用——它们反转放置或跨越。 因此,放置或跨越将从最后一列或行开始,而不是从第一列或第一行开始。
这些代码片段是直接相反的:
.item:nth-child(1) { grid-column: 1 / 5 }
.item:nth-child(1) { grid-column: -1 / -5 }
正如我上面提到的,由于我们从最后开始向后绘制,所以在 1
列中将有项目 2
的空间,因此它被向下推。 我们将研究使用密度来填充在这种情况下创建的这些空间(如果内容不对称)。
有一种方法可以跨越到列或行的末尾,而无需知道网格容器定义了多少列。 当您使用 auto-fill 或 auto-fit 定义动态网格时,这很有用:
.item:nth-child(1) { grid-column: 1 / -1 }
为行结束或列结束指定 -1
将使网格项目从您提供的任何开始处开始跨越到网格结束(在本例中为第 1 行)。
但是,这不适用于隐式网格。 因此,由于我们在网格容器中只定义了列和行,这不会做任何事情:
.item:nth-child(1) { grid-row: 1 / -1; }
为了让它工作,你必须给网格容器一个明确的行定义。 例如:
.container { grid-template-rows: repeat(10, 30px); }
密度
在前面的示例中,您会看到一些放置或跨越导致空白区域散布在网格中间。
您可以使用网格容器上的 grid-auto-flow
属性来关闭这些空格,以关闭这些空格:
.container { grid-auto-flow: dense; }
您应该注意的一件事是,如果您有需要遵循顺序的对称内容,则使流密集会扭曲该顺序。 如果您想要一个紧凑的设计同时仍然不规则地放置网格项目,这是您必须做出的权衡。
请注意在将项目 1
放置在末尾之后,网格如何返回以继续将 2
放置在轨道的开头。
结论
在本教程中,我们探索了 CSS 网格:放置、跨越和密度。