使用 CSS Grid 实现圣杯布局

Avatar of Chris Coyier
Chris Coyier

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

一位读者来信专门询问如何在 CSS Flexbox 中构建此布局

我的答案:这并不是 CSS Flexbox 的布局。如果您必须这样做,您可以 实现它,但您需要某种策略,例如将导航和文章组合到父元素中(如果不是更多组合)。CSS Grid 就是为了描述这种布局而诞生的,它将更容易使用,更不用说这两者的浏览器支持如今基本相同了。

“圣杯”是什么意思?

看,孩子们,网络上的布局曾经是 *非常糟糕的*,以至于上面这个难以置信的简单图表相对难以实现,特别是如果您需要那里的“列”具有相同的的高度。我知道,很荒谬,但事实就是这样。我们使用了超级奇怪的黑客手段来完成它(例如巨大的负边距与正填充配对),随着时间的推移,这些方法演变成更简洁的技巧(例如 模仿列 的背景图像)。能够成功实现这些技巧的技术将其称为 圣杯。(为了更加清楚起见,*通常*,圣杯指的是中间有内容的三列布局,但要点是列的高度相等)。

CSS 现在更加强大,因此我们可以使用它在不求助于黑客手段的情况下完成合理的事情,例如实现此基本布局。

以下是 CSS Grid 中的实现

此网格使用 grid-template-columnsgrid-template-rows 进行设置。这样,我们就可以非常具体地指定希望这些主要站点部分落在哪里。

我添加了一些额外内容

  • 前几天有人问我另一个问题,关于如何在网格区域之间创建 1px 的线条。诀窍很简单,让父元素具有背景颜色并使用 gap: 1px;,因此我在上面的演示中进行了此操作。
  • 小屏幕可能会切换到单列布局。我在上面的媒体查询中进行了设置。有时我会在父元素上使用 display: block; 关闭网格,但在这里我保留了 grid 并重置了列和行。这样,我们仍然可以获得间隙,并且可以根据需要重新排列内容。
  • 最近有人问我的另一个问题是,您可以在上面的演示中看到的微妙的“主体边框”效果。我尽可能地简单地实现了它,在主体和网格包装器之间添加了一点填充。我最初是在主体和 HTML 元素之间执行此操作的,但是对于全页面网格,我认为使用包装器 div 而不是主体作为网格更明智。这样,注入到主体中的第三方内容就不会导致布局异常。