使用 CSS Grid 创建“圣杯布局”






4.38/5 (9投票s)
本文展示了如何使用 CSS Grid 创建圣杯布局。
引言
圣杯布局是一种包含固定宽度的页头、页脚、左侧边栏、右侧边栏和流体主体内容的布局,如下所示
传统上,它通过 负边距技术 实现。
说实话,这对我来说意义不大,看起来更像一堆技巧。幸运的是,`display: grid` 已经出现,它允许我们以更具语义意义的方式构建二维布局。
标记
让我们定义我们的标记如下
<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>
样式
首先,我们定义容器使用网格布局
.grid {
display: grid;
}
正如你可能已经注意到的,我们的网格有 3 行。为了简单起见,让我们使它们相等。
grid-template-rows: repeat(3, 100px);
我们为此使用 `repeat` 函数,它将指定的行重复多次。
我们还有 3 列:第一列和最后一列是固定宽度,而中间列占据所有剩余空间。
grid-template-columns: 150px 1fr 150px;
这里 `fr` 是一个新的单位,表示可用空间的比例。这里,中间列消耗可用空间的一个比例。
我们的完整容器样式如下
.grid {
display: grid;
grid-template-columns: 150px 1fr 150px;
grid-template-rows: repeat(3, 100px);
}
现在我们必须让页头和页脚跨越所有 3 个可用列
header, footer {
grid-column: 1 / 4;
}
这是以下内容的简写
header, footer {
grid-column-start: 1;
grid-column-end: 4;
}
或者
header, footer {
grid-column-start: 1;
grid-column-end: span 3;
}
这意味着页头和页脚跨越 3 列。
现在我们只需要分配网格行
header {
grid-row: 1;
}
.sidebar-left {
grid-column: 1;
grid-row: 2;
}
article {
overflow: hidden;
grid-column: 2;
grid-row: 2;
}
.sidebar-right {
grid-column: 3;
grid-row: 2;
}
footer {
grid-row: 3;
}
Internet Explorer 11 支持
此功能 可用于所有现代浏览器,但如果你仍然需要支持 Internet Explorer 11,则需要一些特殊的浏览器前缀。
.grid {
display: -ms-grid;
display: grid;
-ms-grid-columns: 150px 1fr 150px;
grid-template-columns: 150px 1fr 150px;
-ms-grid-rows: 100px 100px 100px; //repeat does not work
grid-template-rows: repeat(3, 100px);
}
以及对 grid-column
和 grid-row
的一些前缀,如下所示
header, footer {
-ms-grid-column: 1;
grid-column-start: 1;
-ms-grid-column-span: 3; //the way to span columns
grid-column-end: span 3;
}
结论
正如你在本文中看到的,网格布局允许我们以更具语义的简洁方式创建二维布局,而无需使用 CSS 技巧。由于它们受所有现代浏览器支持,因此它们现在已成为创建二维布局的事实标准。