CSS网格中的放置、跨度和密度

来自菜鸟教程
跳转至:导航、​搜索

介绍

你在 CSS Grid 中学到的最常见的东西通常与网格容器有关,而不是与网格项有关。 应用于网格容器的通用网格定义对于基本布局结构来说已经足够了。 但是,当您需要对网格的内容进行更多控制时,网格容器的使用会受到限制。

例如,您可能想要一个 4 x 2 的网格,但第一个网格项应占用第 1 列和第 2 列以及第 1 和第 2 行。 或者,当您不知道网格列轨道的运行时总数是多少时,您可能希望一个项目跨越到最后一个网格列轨道。

每个网格项的大小都是预定义的,您需要找到一种方法来相对于网格容器中的其他项调整它们的大小。

在本教程中,您将探索 CSS Grid 中的放置、跨越和密度。

放置网格项目:从这里开始,从那里结束

浏览器中的所有内容都有默认样式,例如 0auto。 在调整自定义值之前,您还可能需要了解其他默认值。 当你有一个网格时,网格项的放置值由 grid-[x]-startgrid-[x]-end 定义(其中 x 可以是 columnrow )。 值为自动。

当您看到网格布局时,请记住该网格中的每个项目都有一个放置值,无论流程看起来多么对称:

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

您可以只提供 startend - 您不必成对提供放置属性。 您可以只提供一个,其余的将保持为 auto(默认)。 需要注意的棘手问题是,如果您仅更改 grid-[x]-start 的值,则网格项将从 开始,而不是轨道:

    .item:nth-child(1) {
      grid-column-start: 5;
    }

另一方面,如果您仅指定 end,它将从指定的结束值开始并反向跨越网格。 例如,如果您告诉项目 103 结束,它将从最近的下一行 2 开始并绘制到行 3

    .item:nth-child(10) {
      grid-column-end: 3;
    }

你可以在这里看到所有的代码。

还有 grid-[x]-startgrid-[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”这个词来描述一个放置应该占据的轨道数量。 当我们说行 15 时,我们是说网格项应该从 15。 我通常将此称为隐式跨越。

有一个 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 网格:放置、跨越和密度。