纯 CSS 使用 column 属性实现瀑布流布局

笔记哥 / 05-09 / 43点赞 / 0评论 / 814阅读
什么是瀑布流? 看一张图,以下图片来源于花瓣网截图: ![](https://cdn.res.knowhub.vip/c/2505/09/efb6aaf1.png?G1QAAMTydJz4y0H%2fu406fJsoEpoBiSqCSj3r9Z6z9i3y%2fU4wx2e0Pn1%2f%2bEPr06VYhV1CsKAgeBiMClTNQVmZVE3jGg4%3d) 如上图所示,瀑布流就是让内容按列显示,自动填充空白。 ## 使用 column 实现瀑布流 源码: ```html
``` 效果: 视口宽度大于 1200px 时,显示 5 列: ![](https://cdn.res.knowhub.vip/c/2505/09/9a1e2346.png?G1UAAMTsdJxIPEml26hD2jvFHc1ARRpBpZ71es9Z%2byb6fgejxGe0Pn1%2f%2bEXr00lM2S4CQ1gQAhsbahJoDgliosi1xDUc) 视口宽度在 600px-800px 之间时,显示 3 列: ![](https://cdn.res.knowhub.vip/c/2505/09/52473279.png?G1QAAMTsdJzIi0Sl26hD2jvFHc2ARBVBpZ71es9Z%2byb6fmewxGe0Pn1%2f%2bEPr00mtwC5isEIRPAzGlVOWHAqEi6RqcQ0H) ## column 相关属性 ### column-count `column-count` 声明显示多少列。默认值为 `auto`,由浏览器自己决定。 ![](https://cdn.res.knowhub.vip/c/2505/09/1e5e09d6.png?G1UAAMTsdJzIi4ak26hD2jvFHc1ARRpBpZ71es9Z%2byb6fmfwFZ%2fR%2bvT94RetTyexAqvEYIEgBBiMldWkhKS5ZoUy4hoO) ### column-fill `column-fill` 控制元素内容分成列时的平衡方式。有效值:`auto`(按顺序填充列)、`balance`(仅最后一页内容平均分配到各列)、`balance-all`(全部分页内容平均分配到各列)。 ![](https://cdn.res.knowhub.vip/c/2505/09/5b1b3aa5.png?G1QAAETn9LyUBgTHvtMdbIlTE20GJKoIKvWs13vO2jfR9weDS35G6zP2hz%2b0PoPUDV6JwQpF8nA4X1LYLJmIGSo8rxE%3d) ### column-gap `column-gap` 设置列间隔。默认值 `normal` 表示列间距占用 1em 宽度。 ![](https://cdn.res.knowhub.vip/c/2505/09/fdc661bd.png?G1MAAMT0bJxo0yrONvqh%2f4lHQjMgUUVQqWe93nv3aUTf78KS4jP7WH4%2b%2fKGP5WTIjELCYmwImsGQqhUlBckK1Yq4pwM%3d) ### column-rule `column-rule` 简写属性,包含 column-rule-width、column-rule-style 和 column-rule-color 。 `column-rule-width` 设置线条宽度。 `column-rule-style` 与 border-style 一样,支持值:none 、 hidden 、 dotted 、 dashed 、 solid 、 double 、 groove 、 ridge 、 inset 、 outset。 `column-rule-color` 设置线条颜色。 ![](https://cdn.res.knowhub.vip/c/2505/09/a453d9d2.png?G1UAAMT0bJzoaUrVNvqh%2f4lHQjNQkUZQqWe93nv3aUTf7wyW%2bMw%2blp8Pv%2bhjOWUrMCUGZ2SEAINxFYUiJE1ipkVq3NMB) ### column-span `column-span` 设置**子元素**是否跨列显示。有效值:`none`(不跨列)、`all`(跨列)。 ![](https://cdn.res.knowhub.vip/c/2505/09/30a02ac4.png?G1QAAER17rxgpXHD%2bZ14TBMEEmwGJKoIKvWs1%2fP%2fa18i7xcEj3yP1mfsD39ofYaoG7wKQYUieTicp7KqpQIaKorlNQI%3d) ### column-width `column-width` 设置列的宽度。浏览器会自动调整宽度大小,如果设置的宽度连两列都放不下,会自动变为一列显示(如图三)。 ![](https://cdn.res.knowhub.vip/c/2505/09/143623d6.png?G1UAAMTsdJzIiyak26hD2jvFHc1ARRpBpZ71es9Z%2byb6fmfwFZ%2fR%2bvT94RetTycxhRVisEAQAgzGVdRKCqkac4Zmi2s4) ### columns `columns` 简写属性,可组合设置 column-width 和 column-count 属性。 ![](https://cdn.res.knowhub.vip/c/2505/09/47a60a19.png?G1UAAMTsdJzIC2mk26hD2jvFHc1ARRpBpZ71es9Z%2byb6fmdwic9offr%2b8IvWp5PYBVNisEAQAgzGhqTQkIokzbVmi2s4) ## grid 实现瀑布流 源码: ```html
``` 效果: ![](https://cdn.res.knowhub.vip/c/2505/09/243a7a07.png?G1UAAER17rxgtdmm8zvxQBMEEmgGKtIIKvWs17v3XLfI91eCmp9e2qjrwy9KG1UsHHEKQYMhBQSCgbCL6VCqazg9z14B) ## 写在最后 在多列布局方面 column 属性相比于 flex 和 grid 而言,显得更有优势。 虽说 grid 也能做出瀑布流效果,不过需要指定每个网格单元的占用大小。 column 虽然不用控制每个子项的大小,但它的子元素排列顺序是从上到下排列,并不是从左往右,这种情况如果数据存在分页加载时候,就会出现内容重新排列导致内容闪动。 在瀑布流布局这个需求场景下,CSS 多多少少还是有点弱鸡~~必要时候还是只有祭出 JS 。 **其他相关资料:** `break-*` 控制多列布局如何中断换列: https://developer.mozilla.org/zh-CN/docs/Web/CSS/break-inside