使用边到边网格创建全宽元素

Avatar of Chris Coyier
Chris Coyier

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

如果您有一个有限宽度的容器,比如居中的文本列,“突破”该容器以创建全宽元素需要一些技巧。也许 最好的技巧 是使用左相对定位和基于视窗的负左边距。虽然它有一些弊端(例如,需要在 body 上隐藏溢出,容器需要居中等等),但至少它很容易实现,而且容器中的所有其他内容都可以正常运行。

关于另一种实现方法的文章有很多,涉及 CSS 网格

所有这些方法的共同点是,它们都假设您有一个边到边的网格。我一直想,人们真的会用 CSS 网格来布局整个页面吗?比如,本质上是 body { display: grid; }¹?文章本身倾向于使用一个类名,但假设该父元素是一个全浏览器宽度的容器。

我四处打听了一下,有些人低声说,“是的,我经常这样做”。所以,很酷,这是人们做的事情。我的第一个想法是,出于以下几个原因,这似乎很麻烦

  1. 典型的“页眉”和“页脚”都是全宽的,因此,与将页眉设置为位于站点顶部(或底部)的块级 <header> 相比,必须在网格上显式地放置它们并将其拉伸到正确的列数,并在调整列时保持最新,这似乎有很多工作要做。您仍然可以在中间使用边到边的网格,并在其上方和下方使用块级元素。
  2. 必须将“文章”中的所有项目显式地放置到中间列中(例如 article > * { grid-columns: 2 / 3; } 这样您才能偶尔通过跨越更多列来“拉伸”某些内容,这对我来说感觉很奇怪。就像,如果 95% 的内容都位于居中的列中,那么将这些内容放到一个处理布局的父元素中,感觉更稳健也更轻松,而不是让每个单独的元素都需要将自己放置到网格中,最终结果是它们看起来好像都在一个共享的父元素中。

我并不是在批评这项技术,只是注意到它让我感到奇怪。但我可能只是老了。

  1. 我建议不要直接在 body 元素上使用 display: grid;。一个常见问题是:浏览器扩展可能会将内容放置到 body 中的 DOM 中,这会导致这些内容被放置到您的网格中,并可能破坏您的布局。我见过这种情况。我认为这就像 React 的最佳实践,不要绑定整个 body,而是使用一个 div 子元素,它实际上是一样的,只是作用域限定在一个选择器中。