Firefox 71 中的多列布局和列跨度

对于任何关心 CSS 布局的人来说,Firefox 71 都是一个激动人心的版本。虽然我对 Firefox 中的 subgrid 非常兴奋,但我一直在关注另一个属性。Firefox 71 实施了来自多列布局的 column-span。在这篇文章中,我将解释它是什么以及多列布局规范的进展情况。

多列布局,通常被称为多列,是一种布局方法,它与 flexbox 和 grid 等布局方法有很大的不同。如果你有一些标记并显示在普通流中,然后使用 column-widthcolumn-count 属性将其转换为多列容器,它将显示为一组列。然而,与 Flexbox 或 Grid 不同,列中的内容流与普通流中的方式相同。不同之处在于它现在流入多个匿名列框,很像报纸中的内容。

查看 CodePen
使用多列的列
by rachelandrew (@rachelandrew)
CodePen 上。

多列被描述为在创建这些匿名列框以显示内容时分割内容。它不会以 flex 或 grid 类似的方式对多列容器的直接子元素进行操作。从这个意义上讲,它与我们在打印网页文档时发生的分割最相似,并且内容被分割到不同的页面之间。列框本质上与页面相同。

什么是 column-span?

我们可以使用 column-span 属性来获取出现在列中的元素,并使其跨越所有列。这是一种常见的印刷设计模式。在下面的 CodePen 中,我有两个这样的跨度元素

  • h1 在文章内部作为第一个子元素,并且跨越所有列。
  • h2 在第二个部分内部,也跨越所有列。

查看 CodePen
使用多列和 column-span 的列
by rachelandrew (@rachelandrew)
CodePen 上。

此示例突出了关于 column-span 的一些要点。首先,只能跨越所有列,或者跨越任何列。column-span 的允许值是 all 或 none。

其次,当跨度中断列框时,我们最终得到两行列。列是在跨度元素上面的内联方向上创建的,然后它们在下面重新开始。列中的内容不会“跳过”跨度元素并继续。

此外,h1 是多列容器的直接子元素,但 h2 不是。h2 嵌套在 section 内部。这表明,项目不需要是直接子元素才能对其应用 column-span

Firefox 现在加入了其他浏览器,开始实施 column-span 属性。这意味着我们对所有主要浏览器都有良好的属性支持,正如 column-span 的兼容性数据 所示。

The compat data for column-span on MDN

多列规范

我对 column-span 实施的兴趣部分是因为我是 多列规范 的编辑之一。我自愿编辑多列规范,因为它已经停滞了一段时间,WG 过去的决议还没有被编辑到规范中。还有一些未解决的问题,其中许多与 column-span 功能有关。我首先通过挖掘邮件列表档案来查找这些问题和决议,我们已经有了它们。然后,我开始逐一解决它们并将它们编辑到规范中。

当我开始处理规范时,它处于候选推荐 (CR) 状态,这意味着该规范被认为已经相当完整。鉴于问题数量众多,WG 决定将其恢复到工作草案 (WD) 状态,以便解决这些问题。

CSS 开发需要浏览器和规范编辑之间的团队合作

作为规范编辑,当功能被实施时,这令人兴奋,因为它有助于规范的进展。CSS 是通过迭代和协作过程创建的;CSS WG 不会创建完整的规范,然后将其抛给浏览器工程师。这个过程包括在 WG 中处理一项功能,浏览器工程师尝试实施它。在实施阶段发现的问题和问题将反馈给工作组。然后,WG 必须决定如何处理这些问题,规范编辑然后负责根据决议来澄清规范。这个过程重复进行——每次我们都会发现问题。任何缺乏清晰度都可能导致互操作性问题,如果两个浏览器以不同的方式解释功能的描述。

基于 Mozilla 在实施 column-span 方面所做的工作,一些问题被提交给 CSS WG,并在我们的电话会议和面对面会议中进行了讨论。我们已经能够在 column-span 和相关问题的许多问题上使规范更加清晰。因此,我很高兴看到一项新属性在浏览器中得到实施,同时也高兴地看到规范更加健壮!我们最近发布了多列的更新版 WD,其中包括 Mozilla 在 Firefox 中实施多列期间所做的许多更改。

其他与多列相关的问题

随着 column-span 的实施,多列将在不同浏览器中的工作方式几乎相同。关于 column-fill 属性,我们确实有一个未解决的问题,它控制列的填充方式。多列填充列的默认方式是尝试平衡内容,以便每列中最终包含相同数量的内容。

通过使用 column-fill 属性,可以更改此行为以顺序填充列。这意味着具有高度的多列容器可以将列填充到指定的高度,如果内容不足,可能会留下空列。

查看 CodePen
使用多列和 column-fill 的列
by rachelandrew (@rachelandrew)
CodePen 上。

由于规范的模糊性,如果多列容器没有高度,Firefox 和 Chrome 会做不同的事情。Chrome 会忽略 column-fill 属性并进行平衡,而 Firefox 会用所有内容填充第一列。当规范模糊不清时,就会出现这类问题。这不是浏览器“做错了”,也不是试图让网页开发人员的生活更困难。这是规范不够清晰时发生的事情!对于任何感兴趣的人来说,试图解决这个问题的比较长的 issue 在 这里。大多数开发者在实践中不会遇到这个问题。但是,如果你在使用 column-fill 时看到差异,那么值得了解它。

column-span 的实施是使多列在网络上变得健壮和有用的一个步骤。要了解更多关于多列的信息以及可能的用例,请参阅 MDN 上的 多列指南,以及我的文章 何时以及如何使用多列布局

关于 Rachel Andrew

Rachel Andrew 是一名前端和后端网页开发者,Perch CMS 背后公司的成员之一,也是 Smashing Magazine 的主编。她是谷歌网页技术专家,并代表 Fronteers 参加 CSS 工作组,她在该组织中是多列布局规范的联合编辑。她撰写了 22 本书籍,并且是全球各地会议上的常客,你可以在 https://rachelandrew.co.uk 了解她的最新动态。

更多 Rachel Andrew 的文章…


一条评论

  1. Max Battcher

    作为一名已经使用多列几年来构建个人博客的人,因为我想这么做,而且这是我的个人博客,我一直都在上面做让我开心的事情(一直到 90 年代的一些对 MARQUEE 等内容的 questionable 使用),看到多列规范还在继续发展真是太好了。感觉它在 Windows 8 停止鼓励许多应用程序使用它之后就停滞不前了。我仍然有一份很小的愿望清单,希望某些内容能更好地工作(多列内部的网格布局主要在 EdgeHTML 和 Webkit 中工作,但在 Firefox 中不工作),我并不秘密地希望类似于 -ms-scroll-translation 的内容能够回到某个标准轨道上,因为我喜欢水平滚动多列布局。但我只是很高兴多列不像它有时看起来那样死气沉沉。

    (我的奇怪博客 CSS 选择可以从 http://blog.worldmaker.net 中查看)

    2019 年 11 月 20 日 13:51

本文的评论已关闭。