我们会为了 CSS 网格而扁平化我们的 HTML 吗?

Avatar of Chris Coyier
Chris Coyier

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

我昨天在 An Event Apart 观看 Rachel Andrew 谈论 CSS 网格布局。 网格 非常棒,很快就会成为主要的 Web 布局工具。但现在还没有到来,因为没有稳定的浏览器 发布最新版本的规范(充其量它处于隐藏状态)。

好消息是,就在几天前, 规范 已经非常稳定,并进入了“候选推荐”状态。由于所有浏览器都一直在根据规范进行开发,因此所有稳定浏览器很快就会广泛支持未加前缀的网格。

坏消息是,它可能会在没有子网格支持的情况下这样做,Rachel 在她的演讲中很好地强调了这一点。

这是一些典型的“页面布局”HTML

<body>
  <header class="site-header"></header>
  <main class="main-content"></main>
  <aside class="sidebar"></aside>
  <footer class="site-footer"></footer>
</body>

所有这些主要元素都是<body>的直接子元素,因此<body>可以作为网格,四个主要元素在此网格上布局。这有点像 Rachel 在 GridByExample 中的示例之一

但是……

……假设我们想从并非完全处于扁平化 HTML 结构中的元素构建网格。

<body>
  <header class="site-header">
    <h1>I want to use the grid.</h1>
    <nav>Me too!</nav>
  </header>
  <main class="main-content">
    <ul class="schedule">
       <li>Me three!</li>
       <li>Me four!</li>
    </ul>
  </main>
  ...
</body>

我们可以嵌套网格,就像我们可以将 flexbox 嵌套在网格单元格中或将 flexbox 嵌套在 flexbox 中一样,但在上面的示例中,我们无法让这些子元素一起参与同一个网格。

您可以在 Jen Simmons 的 爵士海报示例中看到其中的一些工作原理。在 DOM 中,您可以看到一些元素,如果它们都可以在同一个网格上定位,那就太好了,但实际上它们却放置在不同的网格上。

子网格可能会有点乏味,因为它有点像“一直往下都是子网格”。要使我上面的小示例工作,它将类似于……

body {
  display: grid;
}
.site-header {
  /* current spec way... */
  display: subgrid;

  /* old way... */
  display: grid;
  grid: subgrid;
}
.main-content {
  display: subgrid;
}
.main-content > ul {
  display: subgrid;
}

而且这还没有定义网格的实际工作方式。

Eric Meyer 也强调了对子网格的需求

如果没有子网格,您要么必须使要布局的每个元素都成为 body 元素(或用于创建页面网格的任何元素)的子元素,要么必须在每个嵌套网格中重新创建页面网格的片段,并放弃任何可以根据多个页面部分的内容进行灵活调整的列的希望。这两种解决方案都不理想。

他使用<form>标记 举例说明,其中<label>/<input>对必须在容器元素内分组,这意味着它们不能一起参与同一个网格。

每一行都必须是它自己的网格上下文,这意味着它不如它们可以共享同一个网格时那么有用。

他呼吁在无法处理这种情况之前不要发布网格

子网格是网格布局的主要组成部分,并且在网格布局从开发人员预览状态出现时,应成为任何网格布局实现的一部分。如果这意味着延迟网格的出现,我认为这是值得的。

那艘船可能已经启航了……

……在 CSS 网格“发布”的那天就拥有完整的子网格支持。但可能值得发出一些声音(例如撰写这篇博文)来表明这一点非常重要,并且应该在 CSS 网格的第一轮发布后尽快进行开发和发布。这不是我的想法,而是 Jen Simmons 说她将在 Mozilla 推动的事情。

更大的危险是子网格被认为是“有风险的”并且“可能会在 CR 期间被删除”。

顺便说一句,就“浏览器制造商人员”而言,进行这项工作的不一定是浏览器公司员工,而通常是外部提交者。这是一篇来自其中一位外部提交者的 博文,其中谈到了所有这些内容。

风险……

……是我们太喜欢网格布局了,以至于我们会错误地构建我们的 HTML 以使其工作。我们会使我们的 HTML 可访问性降低以使我们的网格想法起作用。我们会忽略语义并使我们的 HTML 扁平化。

或者也许没有人会这样做。但是,嘿,拥有这些工具会很好,这样它甚至都不会成为问题。