我一直很享受学习 CSS 网格。 这一功能正在开始在许多浏览器中发布,看起来我们很快就能在生产环境中使用它。
CSS 网格最让我印象深刻的一点是其语法非常灵活。 为了说明这一点,我们将看看如何用三种不同的方式创建相同的布局,所有这些都使用 CSS 网格属性。 特别地,我们将使用 圣杯布局 作为我们的例子

首先,我们将定义一个父元素,名为 .grid
,并设置三列和三行,为不同的布局方法做好准备
.grid {
display: grid;
grid-template-columns: 150px auto 150px;
grid-template-rows: repeat(3, 100px);
grid-gap: 1em;
}
这表示我们的 .grid
元素有三个列(两个设置为 150px,一个灵活地占用剩余空间)和三个行(所有都设置为 100px,用于演示目的)。
我们还将在每个示例中使用以下子元素:<header>
、<footer>
.sidebar-left
、sidebar-right
和 <article>
。 这些将是我们布局的基础,并在 HTML 中表示如下
<div class="grid">
<header>
Header
</header>
<aside class="sidebar-left">
Left Sidebar
</aside>
<article>
Article
</article>
<aside class="sidebar-right">
Right Sidebar
</aside>
<footer>
Footer
</footer>
</div>
好了,让我们用 CSS 网格以三种方式重新创建它!
方法 1:指定网格列
我们可以直接在元素本身定义每个子元素占据的网格单元格
header {
/* Start on Row 1 */
grid-row: 1;
/* Start on the first column line and extend all the to the last column line */
grid-column: 1 / 4;
}
.sidebar-left {
/* Start on Row 2 */
grid-row: 2;
/* Start on the first column line and stop at the next column line */
grid-column: 1 / 2;
}
article {
/* Start on Row 2 */
grid-row: 2;
/* Start on the second column line and stop at the third column line */
grid-column: 2 / 3;
}
.sidebar-right {
/* Start on Row 2 */
grid-row: 2;
/* Start on the third column line and stop at the last column line */
grid-column: 3 / 4;
}
footer {
/* Start on Row 3, the last row */
grid-row: 3;
/* Start on the first column line and extend all the to the last column line */
grid-column: 1 / 4;
}
查看 CodePen 上 Geoff Graham 的 CSS 网格 - 圣杯 1。
这为我们提供了创建布局所需的一切! 但是,我们还可以做得更好,所以让我们继续前进。
方法 2:压缩第一种方法的标记
CSS 网格足够智能,可以计算出侧边栏和文章在哪里,只要我们指定 <header>
和 <footer>
的位置即可
header, footer {
grid-column: 1 / 4;
}
就是这样! 由于我们已经确定 <header>
和 <footer>
都应该占据 .grid
元素的整个宽度,CSS 网格将流入剩余的元素,而无需我们告诉它任何其他信息。 太棒了!
查看 CodePen 上 Geoff Graham 的 CSS 网格 - 圣杯 2。
方法 3:定义网格模板区域
CSS 网格还允许我们使用 grid-area
属性为元素命名,并使用 grid-template-areas
属性将它们放置在父元素上。
让我们使用 grid-area
为子元素命名
header {
grid-area: header;
}
footer {
grid-area: footer;
}
.sidebar-left {
grid-area: sidebar-1;
}
article {
grid-area: article;
}
.sidebar-right {
grid-area: sidebar-2;
}
现在,让我们使用 grid-template-areas
在父 .grid
元素上命名这些区域
.grid {
display: grid;
grid-template-columns: 150px auto 150px;
grid-template-rows: repeat(3, 100px);
grid-gap: 1em;
grid-template-areas: "header header header"
"sidebar-1 article sidebar-2"
"footer footer footer";
}
您看到我们是如何通过在属性上添加命名区域来创建布局的吗? 这几乎就像是在我们的代码中拥有一个可视化编辑器!
查看 CodePen 上 Geoff Graham 的 CSS 网格 - 圣杯 3。
总结
我们当然可以更深入地研究 CSS 网格的强大功能,但我想具体探讨一下在创建布局(尤其是过去使用浮动时难以创建的布局)方面,它的语法是多么灵活。
除了这里介绍的方法之外,我们还可以用 CSS 网格实现圣杯布局吗? 欢迎在评论区分享您的想法,我们将很乐意添加进来。
这太容易了。 您觉得今年主要流行的浏览器会支持它吗?
希望如此! 一些主要浏览器计划在即将发布的版本中提供支持,其他浏览器则提供部分支持
https://caniuse.cn/#search=grid
让我们期待不久的将来拥有更愉快的布局。 :)
所有最新的支持细节都在这里:http://gridbyexample.com/browsers/
简而言之:Firefox 和 Chrome 预计将在 3 月发布,网格布局也包含在 Safari 10.1(当前测试版)中,因此将在 Safari 发布后发布。
另请参阅 Chris House 的指南 https://css-tricks.org.cn/snippets/css/complete-guide-grid/
我不明白斜杠后面的第二个数字,例如
footer {
grid-column: 1 / 4;
}
很明显,“4” 代表整个宽度,但这个“4”是从哪里来的?
1 不代表“整个宽度”,它是第 1 行。 4 是第 4 行,因此在该示例中,该区域从第 1 行跨越到第 4 行。
我有一系列关于网格的教程视频,可能有助于澄清:http://gridbyexample.com/video/
我也对“4”感到困惑。
一个 3 列布局包含 4 列线。
因此,我们希望页脚元素从第 1 列线延伸到第 4 列线。
而右侧边栏应该从第 3 列线延伸到第 4 列线。
定义了 3 列,每列都由起点和终点组成。
列 1 从 1 开始,在 2 结束 = 1/2
列 2 从 2 开始,在 3 结束 = 2/3
列 3 从 3 开始,在 4 结束 = 3/4
因此,如果您需要占据整个宽度
整个宽度从 1 开始,在 4 结束 = 1/4
如果您想让某个元素占据两列,它可以是 1/3 或 2/4
从第 1 列的开头到第 4 列的开头。 由于只有 3 列,这意味着整个宽度。
您好,
您说得对,这可能有点令人困惑。 例子中使用了 3 列网格,但 CSS 中突然出现了数字 4。
我理解的是,每列都需要 2 个“构建线”(起点和终点),因此构建线总是比列多一个。 在 CSS 中,当我们想要设置列跨度(从 - 到)时,实际上是将这些构建线作为参考。 希望下面的图片能帮助您更好地理解。
http://vpx.pl/i/2017/02/20/grid.jpg
那是网格项目结束的列线
老实说,CSS 网格是近年来最棒的规范之一。 使用它构建复杂的布局是多么容易。
很棒,谢谢!
是的,非常感谢大家!
是的,我理解得非常清楚。
非常感谢大家!
我不明白。CodePen 不应该是像文章开头图片中展示的“圣杯布局”吗?我看到的样子不一样。
https://www.dropbox.com/s/bkscjhgdbm9nspt/Screenshot%202017-02-21%2000.41.09.png?dl=0
请参见:http://gridbyexample.com/browsers/
要查看网格,您必须使用浏览器开发者预览版,例如 Firefox nightly 等。
FF(nightly)有一个名为“Grid Inspector”的插件,可以使 CSS 布局网格可见。
https://addons.mozilla.org/de/firefox/addon/css-grid-inspector/
感谢您提供这篇关于简化基本网格的文章。我一直使用 Flex,效果不错,但现在看到 Grid 很容易学习,就像 Flex 一样。