如Tobias Ahlin的这篇博文中所述,有一个使用flexbox、:nth-child()和的纯 CSS 解决方案。order
这个想法很简单。flex-flow: columnwithwrap可以精确地做什么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 列布局。如果您使用的列超过三列,请在此处阅读如何进行调整。