使用 CSS 列,您可以创建受打印启发的布局,该布局只需添加很少的标记即可适应固定画布之外。支持的浏览器将进行计算以将内容包装并平衡到整齐的列中。如果您已经在使用流体布局,则列会自动重新排列。使用正确的属性组合,CSS 列可以成为一种有趣的布局选项,它既响应式友好,又可以优雅地降级。
在哪里声明列
您可以在任何块级元素上声明列。列可以应用于单个元素,也可以通过定位其父元素来应用于多个元素。
在下图中,左侧描绘了将 CSS 列规则应用于第二个段落以将该内容转换为列。右侧描绘了将规则应用于容器元素,例如 <div></div>
或 <article></article>
以将元素转换为多列布局。
如何声明列
有三种不同的方法来声明列
- 声明
column-count
。 - 声明
column-width
。 - 同时声明两者(推荐)。
让我们探索声明列的不同方法。
1. 声明 column-count
使用 column-count
声明列数。
article {
-webkit-column-count: 2;
-moz-column-count: 2;
column-count: 2;
}
实时演示
查看 Pen [2] CSS 列,count-count 由 Katy DeCorah (@katydecorah) 在 CodePen 上。
即使浏览器宽度发生变化,列数也会保持一致,如下面的 gif 所示。

2. 声明 column-width
使用 column-width
声明列的宽度。
指定的值不是绝对值,而是最小宽度。给定 column-width
,浏览器将决定可以在空间中容纳多少列至少具有该宽度。浏览器还会在此计算中考虑间隙或列之间的间距(稍后将详细介绍)。然后,浏览器将扩展列以均匀分布以填充分配容器的宽度。
例如,如果您检查以下实时演示中的段落,您会发现该列的宽度实际上大于 150px,而 150px 是 column-width
的设置值。
article {
-webkit-column-width: 150px;
-moz-column-width: 150px;
column-width: 150px;
}
实时演示
查看 Pen [3] CSS 列 由 Katy DeCorah (@katydecorah) 在 CodePen 上。
一旦浏览器无法容纳至少两列与 column-width
一样宽,则不会出现任何列,并且布局将恢复为单列布局。
下面的 gif 演示了当浏览器宽度变窄时列如何释放。与 column-count
不同,此属性本质上是响应式的。

3. 同时声明两者(推荐)
将 column-count
和 column-width
结合使用以更好地控制 CSS 列。您可以声明每个属性,也可以使用简写 columns
。
当声明了这两个属性时,column-count
是列的最大数量,而 column-width
是这些列的最小宽度。
article {
-webkit-columns: 2 200px;
-moz-columns: 2 200px;
columns: 2 200px;
}
/* or */
article {
-webkit-column-count: 2;
-moz-column-count: 2;
column-count: 2;
-webkit-column-width: 200px;
-moz-column-width: 200px;
column-width: 200px;
}
实时演示
查看 Pen [4] CSS 列,columns 由 Katy DeCorah (@katydecorah) 在 CodePen 上。
下面的 gif 演示了将 column-count
和 column-width
结合使用时如何随着浏览器宽度变窄而响应。

自定义列
有几个属性可以进一步自定义 CSS 列。
column-gap
要调整间隙或列之间的间距,请声明 column-gap
。
对于大多数浏览器,column-gap
的默认值为 1em。只要它大于或等于 0,您就可以声明一个新值。
article {
-webkit-columns: 2 200px;
-moz-columns: 2 200px;
columns: 2 200px;
-webkit-column-gap: 4em;
-moz-column-gap: 4em;
column-gap: 4em;
}
实时演示
查看 Pen [5] CSS 列,column-gap 由 Katy DeCorah (@katydecorah) 在 CodePen 上。
尽管间隙较大,但浏览器仍会进行必要的计算以均匀地间隔和平衡列。
下面的 gif 演示了当浏览器宽度变窄时浏览器如何释放列并删除间隙。

column-rule
要在每列之间添加一条垂直线,请声明 column-rule
。
此属性是 column-rule-width
、column-rule-style
、column-rule-color
的简写形式。简写形式遵循与 border
相同的样式模式。
article {
-webkit-columns: 2 200px;
-moz-columns: 2 200px;
columns: 2 200px;
-webkit-column-gap: 4em;
-moz-column-gap: 4em;
column-gap: 4em;
-webkit-column-rule: 1px dotted #ddd;
-moz-column-rule: 1px dotted #ddd;
column-rule: 1px dotted #ddd;
}
实时演示
查看 Pen [6] CSS 列,column-rule 由 Katy DeCorah (@katydecorah) 在 CodePen 上。
与 column-gap
一样,垂直线在浏览器宽度过窄时将退出,如下面的 gif 所示。

column-span
要暂时打破列流动,请在子元素上声明 column-span
。目前,Firefox 不支持此功能(但您可以去 Bugzilla 上投票)。
下图包含一个标题,表示故事中新章节的开始,但它继续进行列流动。

要将标题从列流动中删除,请在元素上添加 column-span: all
。此声明将暂时停止列流动以允许元素跨越列,但将在下一个元素处重新启动列。
h3 {
-webkit-column-span: all;
column-span: all;
}
实时演示
查看 Pen [7] CSS 列,column-span 由 Katy DeCorah (@katydecorah) 在 CodePen 上。
column-fill
要更改内容填充列的方式,请声明 column-fill
。目前,此属性仅在 Firefox 中可用。
当高度添加到列元素时,Firefox 的行为与其他浏览器不同。Firefox 会自动平衡内容,而其他浏览器会按顺序填充列。
下图演示了当高度添加到列元素时 Firefox 的行为与其他浏览器的行为对比。
在 Firefox 中,您可以通过声明 column-fill: auto
来更改此行为。此规则将使列按顺序填充,如下面的实时演示所示。
article {
-webkit-columns: 2 200px;
-moz-columns: 2 200px;
columns: 2 200px;
-moz-column-fill: auto;
column-fill: auto;
height: 350px;
}
实时演示
查看 Pen [8] CSS Columns, column-fill 由 Katy DeCorah (@katydecorah) 在 CodePen 上创建。
由于 Firefox 必须声明高度才能启用 column-fill
,因此高度约束打破了流体模式。内容会水平扩展,因为它无法像下面 gif 中演示的那样垂直流动。在这种情况下,可以添加媒体查询来管理高度(稍后将详细介绍)。

其他浏览器不支持 column-fill
,并且在对列元素声明高度时会按顺序填充列。值得注意的是,当对任何列元素添加高度时,无论浏览器或是否使用 column-fill
,约束都会打破流体模式。
局限性
只要内容保持可读,列就可以成为一种优雅的传递内容的方式。当内容水平溢出或列的高度超过视窗时,多列布局可能会变得难以阅读。
内容水平溢出
如 column-fill
部分所示,如果对列元素添加高度,则元素会水平扩展以适合内容。溢出会破坏布局并导致用户转向其他方向。
可能的解决方案:创建 min-width
媒体查询来声明高度规则。
在下面的演示中,我缩小了浏览器窗口,以找到列开始溢出时的位置,并记下了该数字。接下来,我使用列溢出时的值编写了一个 min-width
媒体查询,并将高度规则移到了媒体查询中。
article {
-webkit-columns: 2 200px;
-moz-columns: 2 200px;
columns: 2 200px;
-moz-column-fill: auto;
column-fill: auto;
}
@media (min-width: 500px) {
article {
height: 350px;
}
}
实时演示
查看 Pen [11] CSS Columns, column-fill height 由 Katy DeCorah (@katydecorah) 在 CodePen 上创建。
如下面 gif 中演示的那样,当列释放时,高度规则超出了界限,列会垂直流动。

列的高度超过视窗
如果您的列高度超出视窗,则用户需要滚动才能跟随列的流动。
可能的解决方案:创建 min-height
媒体查询以激活列。
在下面的示例中,只有当列元素具有 min-height: 400px;
时,列才会激活。我是通过缩小浏览器宽度,直到列即将释放,然后调整浏览器的高度,找到列开始低于视窗的位置,来得到这个数字的。我将该数字用作 min-height
媒体查询的值。
@media (min-height: 400px) {
article {
-webkit-columns: 2 350px;
-moz-columns: 2 350px;
columns: 2 350px;
}
}
实时演示
查看 Pen [10] CSS Columns, vertical friendly 由 Katy DeCorah (@katydecorah) 在 CodePen 上创建。
下面的 gif 演示了列元素必须至少有 400px 高才能以列显示内容。

支持
CSS 列具有良好的支持(IE10+),但所有属性仍然需要前缀。在 Can I Use… 上了解有关多列属性的更多详细信息。
即使您最喜欢的浏览器不支持多列布局,请记住它们会优雅地降级为单列布局。CSS 列就像内容传递的自动扶梯(正如米奇·赫德伯格所言)
多列布局不会中断,它只会变成单列布局。
这是一份很棒的指南,谢谢。
列溢出视窗一直是我很担心的事情,直到您展示了它可以多么容易地解决。在大多数情况下,一旦屏幕宽度太小,它也几乎肯定会太矮,您的媒体查询是完美的补充。
很棒的文章!信息丰富,讲解清晰。谢谢。
您也可以使用 Flexbox 做同样的事情,例如:http://codepen.io/tjacobdesign/blog/building-flexible-layouts/
我对这些技术超级兴奋。不用再依赖媒体查询来做所有事情真是太棒了!:)
太棒了!该死的 IE 用户!我无法使用这些好功能,因为人们坚持使用那个垃圾浏览器。
嘿 Fernando,您可以考虑使用 Modernizr 或 CSS3PIE 来在旧版本的 IE 中实现 CSS3 支持。不要为了兼容旧版本的 IE 而避免使用现代标准,它们最终会淘汰的!
我以前很喜欢米奇·赫德伯格。我现在也喜欢,但我以前也喜欢。
如果这是一个相当无知的评论,请原谅我……我一直没有担心 IE,而“IE10+ 支持可以接受”这个想法让我感到困惑。Internet Explorer 10 仅限于安装了 Windows 8 的用户……低于 8 的用户只能使用 9 或更低版本,具体取决于他们的特定版本,对吧?
Windows 7 仍然占 Windows 用户的很大一部分(我上次查看时大约是 50%)。
当然,所有这些用法都取决于您的网站的特定用户统计数据……但平均而言,似乎将 IE10 视为“良好支持”对什么是可以接受的范围相当狭窄。
嘿 Robert,我认为我可能在“良好支持”方面用词不当。我知道这是一个相对的术语。我在那一部分的目的是暗示,即使没有支持,那些用户仍然能够访问内容。
我完全同意。
我工作的代理机构、我过去的工作以及我自由职业时都会关注 IE。
至少在巴西,IE 占用户群的很大一部分。我仍然支持 IE7。它正在结束。现在我在考虑 IE8-9,但我总是不得不检查 IE7 至少是可读的,并具有良好的导航。
当我读到 IE10 被视为良好支持时,我也会生气。=(
我的一些客户甚至使用 IE9,但不知情地使用兼容模式。
Internet Explorer 10 和 11 也可以在 Windows 7 上安装。也许 IE12 也会。
问题是 Windows Vista——它无法升级到 IE9 以上——最重要的是 Windows XP,它只能使用 IE8。
对于安装了 IE9 的 Windows 7 用户,IE10 和 11 现在是 Windows 7 上的自动更新。由于它是自动更新,因此大多数 IE8 以上的用户现在都使用 IE11(Vista 被困在 IE9 上——但 IE10 的使用现在与其他自动更新浏览器的使用非常相似:它足够低,可以被视为异常,而不是可靠的用户群)。
由于 Vista 不受欢迎,IE8 仍然是更令人担忧的因素——但对 XP 的支持现已结束,许多企业用户现在终于开始迁移到 Windows 7——在那里,现代浏览器是最低要求。
这绝对是一个开始使用 IE8 和 9 一直阻碍的技术的良好时期。您自己的特定受众是定义您的支持的决定因素——但现在没有理由避免使用最新的 CSS 和 HTML 功能,只要您为使用旧技术的落后用户提供优雅的降级支持即可。如果您已经构建了移动优先网站,那么您已经很大程度上为在旧 IE 上提供基本但可用的体验做好了准备。
Robert,IE10 不仅限于 Windows 8,IE10 和 11 都可以在 Windows 7 上使用,前提是您安装了 Service Pack。我在 Win7 上运行着最新版本的 IE11。IE 的唯一操作系统限制是:XP 用户只能使用 IE8,Vista 用户只能使用 IE9。
我喜欢网络的发展方向——每天都能学到一些新奇的东西。感谢您深入的示例,Katy :)
IE10+ 并不是“不错”的支持。我希望我的受众是使用尖端浏览器的用户。在公司里(我向你保证这是一个很受欢迎的地方),IE10 是个梦。
我将立即开始使用 CSS 列,大约 8 年后。
上面有一个 IE-10 线程,所以我要把它埋起来,以保持内容的整合。
很棒的文章。似乎这样的东西可以用来创建很棒的 HTML 邮件,假设大多数客户端可以正确地渲染它……
这适用于旧版浏览器吗?如果不行,是否有合理的 CSS 备份?
如果浏览器不支持列,则元素将以普通列的形式显示。
我相信这里有一个错误。它说
下面没有 GIF。图片是之前 PNG 文件的重复。
你说得对!图片现在已经修复了。感谢你发现并评论!
感谢这个很棒的教程。我认为你应该创建一个 WordPress 主题或其他东西,里面包含所有这些功能。
现在我们只需要这个
-webkit-columns-flow: row;
-moz-columns-flow: row;
columns-flow: row;
以水平方式流动不同高度的对象。
这是我之前做的一款响应式、水平滚动、基于打印列的网站模型。
http://ghostmounta.in/cols/
顶部附近有些问题,在我这里它显示为
“右侧显示了应用于容器元素(例如
或
将元素转换为多列布局的规则。”
我认为一些 HTML 元素丢失了 - 没有正确转义?
我认为这个 polyfill 至少可以修复 IE8-9 的问题
http://welcome.totheinter.net/columnizer-jquery-plugin/
非常好,而且很完整,所以很有用。
谢谢,Katy 😉
吸引了很棒的扩展评论,正如应该的那样!
很棒的文章
你彻底革新了所有面向像我这样的开发人员的 UI 设计秘诀,我们可以在服务器上完成所有企业业务逻辑,但是谈到 CSS,我们大多数人,糟糕透顶了……这篇文章在这方面意义重大……谢谢