网格区域和占据它们的元素大小并不一定相同。

Avatar of Chris Coyier
Chris Coyier

DigitalOcean 为您旅程的每个阶段提供云产品。 立即开始使用 $200 免费信用额度!

这是一个关于 CSS 网格的不错的知识点。

我相信对你们中的许多人来说这是显而易见的,但我写这篇博文是因为我自己对它花了很长时间才明白。

让我们仔细看看。

这里有两个需要你记住的东西

  1. 网格区域,由父元素使用 display: grid; 创建。
  2. 元素本身,比如一个 <div>,它进入这个网格区域。

例如,假设我们设置了一个像这样非常简单的网格

.grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  grid-gap: 1rem;
}

如果我们在里面放置四个网格项目,在 Firefox DevTools 中检查时它看起来像这样

现在让我们定位其中一个网格项目并赋予它一个 background-color

网格区域和元素大小相同!

不过,这是有充分理由的。因为 justify-itemsalign-items 的默认值为 stretchstretch 的值实际上是将项目拉伸以填充网格区域。

但是有几个原因会导致元素可能不会填充网格区域

  1. 在网格父元素上,justify-itemsalign-items 是某个非 stretch 值。
  2. 在网格元素上,align-selfjustify-self 是某个非 stretch 值。
  3. 在网格元素上,如果高度或宽度受到限制。

检查一下

谁在乎呢?

我不知道,只是感觉知道这一点很有用:将元素放置在网格区域中时,这只是布局的起点。它默认情况下会填充该区域,但它并不一定非要这样做。它可以更小或更大。它可以对齐到任何角落或居中。

也许最有趣的限制是你不能直接定位网格区域本身。例如,如果你想利用对齐方式,你就放弃了填充整个网格区域的承诺。因此,你不能再应用背景并知道它会覆盖整个网格区域。如果你需要利用对齐方式并应用覆盖背景,你需要将其留给 stretch,将新元素也设为 display: grid;,并使用它进行对齐。