如Tobias Ahlin的这篇博文中所述,有一个使用flexbox
、:nth-child()
和的纯 CSS 解决方案。order
这个想法很简单。flex-flow: column
withwrap
可以精确地做什么column-count
。你需要两个条件才能让它工作: 1. flexbox 容器需要有一个固定的高度,并且它需要比你最高的列高。2.flex children需要宽度,2列布局50%,3列布局33%等。
.flex-container {
display: flex;
flex-flow: column wrap;
height: 600px; /* You'll need to play with this value to distribute items correctly */
}
.flex-child {
width: 33%; /* Creates 3-column layout */
}
这种方法有同样的问题column-count
:元素按列排序,自上而下。但是由于我们使用的是 flexbox,现在我们可以访问该order
属性。
使用:nth-child()
andorder
我们可以覆盖默认顺序。
.flex-child:nth-child(3n+1) { order: 1; }
.flex-child:nth-child(3n+2) { order: 2; }
.flex-child:nth-child(3n) { order: 3; }
带有的项目order: 1
将进入第一列,order: 2
将进入第二列和order: 3
第三列。
在(an + b)
公式a
中表示一个周期大小,n
是一个计数器(从 0 开始),并且b
是一个偏移值。所以选择从第(3n+1)
一个开始的每第三个项目。选择每第三个项目,但从第二个项目开始。并选择从该项目开始的每第三个项目,因为索引 0 处没有任何内容。(3n+2)
(3n)
third
在某些布局中,列可能会合并。为了解决这个问题,Tobias 在列之间插入了伪元素:
/* Force new columns */
.flex-container::before,
.flex-container::after {
content: "";
flex-basis: 100%;
width: 0;
order: 2;
}
我不会在这里解释它是如何工作的,但是你可以在这里阅读更多关于它的信息。
这是 Tobias 的CodePen,用于 3 列布局。如果您使用的列超过三列,请在此处阅读如何进行调整。