“旧” Flexbox 和 “新” Flexbox

Avatar of Chris Coyier
Chris Coyier

DigitalOcean 提供适用于您旅程各个阶段的云产品。立即开始使用 $200 免费赠送额度!

为了让大家清楚了解这一点:“Flexbox”(更准确地说:CSS Flexible Box Layout Module)在过去三年中经历了很多变化。变化既体现在 规范 上,也体现在浏览器实施方面。

如何区分

如果您在 Google 上搜索 Flexbox,您会发现很多过时的信息。以下是如何快速区分它们

如果您看到一篇关于 Flexbox 的博客文章(或其他内容),其中包含 display: box;box-{*} 的属性,那么您看到的是 2009 年的旧版本 Flexbox。

如果您看到一篇关于 Flexbox 的博客文章(或其他内容),其中包含 display: flexbox;flex() 函数,那么您看到的是 2011 年的尴尬过渡阶段。

如果您看到一篇关于 Flexbox 的博客文章(或其他内容),其中包含 display: flex;flex-{*} 属性,那么您看到的是当前(截至本文撰写时)的规范。

过时内容示例

所有这些内容在创建时都很棒,但现在已经过时了

Flexie – Flexbox 的 JavaScript polyfill,使用 2009 年的旧语法

这篇文章 由 Richard Shepard 在尴尬的 2011 年阶段于 Smashing Magazine 上发表。它顺便提到了 2011 年的语法,但更多地关注 2009 年的语法。

Stephen Hay 一直在写关于 Flexbox 的文章。他的 介绍性文章 使用了 2009 年的旧语法,然后他做了 后续文章 来介绍 2011 年的语法,不幸的是,这篇文章是在当前语法发布前一个月发布的。

我最初对 Flexbox 感兴趣是受 这篇文章 的启发,这篇文章由 Paul Irish 撰写,使用的是 2009 年的语法。文章顶部有一个警告,但链接到 Stephen 的文章,该文章使用的是 2011 年的语法。

支持

浏览器支持 方面,事情变得更加复杂。

2009 年的旧语法拥有令人惊讶的良好浏览器“支持”:Chrome、Firefox 2+、Safari 3.1+… 几乎所有浏览器都支持,除了 IE 9- 和 Opera 的任何版本。我之所以说“支持”,是因为实际的实施是部分的,并且略有不同(因此需要重写)。

尽管有更多支持,但使用旧语法并不明智。旧规范已经成为过去。浏览器将来可能会放弃对旧语法的支持。至少,新的语法更容易理解,并且会被更深入、更一致地实施。不支持 Flexbox 的浏览器将实施新的规范,该规范处于“CR”(候选推荐)状态。

新的语法支持情况如下:Chrome 21+、Safari 6.1+、Firefox 22+、Opera(和 Opera Mobile)12.1+、IE 11+ 和 Blackberry 10+。

即将发布的 IE 10 似乎将附带尴尬的过渡阶段的 Flexbox(display: flexbox;)。

演示

我最近帮助某人解决了创建流体-固定-流体列布局的问题。两种语法都可以轻松实现这一点(否则相当困难)。它们将成为测试浏览器支持(和浏览器弃用)的良好参考。

旧语法的示例

新语法的示例