什么是瀑布流?

看一张图,以下图片来源于花瓣网截图:

如上图所示,瀑布流就是让内容按列显示,自动填充空白。

使用 column 实现瀑布流

源码:

<div class="masonry">
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
</div>
<style>
:root{
--item-bg-1: #ff4757;
--item-bg-2: #cea442;
--item-bg-3: #18005f;
--counter-bg: #dedede;
} .masonry {
column-count: 1;
column-gap: 20px;
/* 重置计数器 */
counter-reset: item-counter; }
/* 使用媒体查询处理不同视口宽度显示不同列数 */
@media screen and (min-width: 400px) {
.masonry {
column-count: 2;
}
} @media screen and (min-width: 600px) {
.masonry {
column-count: 3;
}
} @media screen and (min-width: 800px) {
.masonry {
column-count: 4;
}
} @media screen and (min-width: 1200px) {
.masonry {
column-count: 5;
}
} .item {
box-sizing: border-box;
break-inside: avoid;
margin: 0 0 20px;
/* css 计数器 */
counter-increment: item-counter;
position: relative;
}
/* 显示计数器 */
.item:before {
position: absolute;
top: 0;
left: 0;
padding: 8px 0;
min-width: 2em;
text-align: center;
background-color: var(--counter-bg);
content: counter(item-counter);
}
/* 给 item 设置不同的高度和背景色 */
.item:nth-child(7n+1) {
height: 151px;
background-color: var(--item-bg-1);
}
.item:nth-child(7n+2) {
height: 187px;
background-color: var(--item-bg-2);
}
.item:nth-child(7n+3) {
height: 289px;
background-color: var(--item-bg-3);
}
.item:nth-child(7n+4) {
height: 123px;
background-color: var(--item-bg-1);
}
.item:nth-child(7n+5) {
height: 234px;
background-color: var(--item-bg-2);
}
.item:nth-child(7n+6) {
height: 188px;
background-color: var(--item-bg-3);
}
.item:nth-child(7n+7) {
height: 149px;
background-color: var(--item-bg-1);
}
</style>

效果:

视口宽度大于 1200px 时,显示 5 列:

视口宽度在 600px-800px 之间时,显示 3 列:

column 相关属性

column-count

column-count 声明显示多少列。默认值为 auto,由浏览器自己决定。

column-fill

column-fill 控制元素内容分成列时的平衡方式。有效值:auto(按顺序填充列)、balance(仅最后一页内容平均分配到各列)、balance-all(全部分页内容平均分配到各列)。

column-gap

column-gap 设置列间隔。默认值 normal 表示列间距占用 1em 宽度。

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 设置线条颜色。

column-span

column-span 设置子元素是否跨列显示。有效值:none(不跨列)、all(跨列)。

column-width

column-width 设置列的宽度。浏览器会自动调整宽度大小,如果设置的宽度连两列都放不下,会自动变为一列显示(如图三)。

columns

columns 简写属性,可组合设置 column-width 和 column-count 属性。

grid 实现瀑布流

源码:

<div class="masonry">
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
<div class="item">
</div>
</div>
<style>
:root{
--item-bg-1: #ff4757;
--item-bg-2: #cea442;
--item-bg-3: #18005f;
--counter-bg: #dedede;
} .masonry {
display: grid;
grid-gap: 20px;
grid-auto-flow: dense row;
grid-template-columns: repeat(9, 1fr);
grid-auto-rows: minmax(50px, auto);
/* 重置计数器 */
counter-reset: item-counter;
} .item {
box-sizing: border-box;
/* css 计数器 */
counter-increment: item-counter;
position: relative;
}
/* 显示计数器 */
.item:before {
position: absolute;
top: 0;
left: 0;
padding: 8px 0;
min-width: 2em;
text-align: center;
background-color: var(--counter-bg);
content: counter(item-counter);
}
/* 给 item 设置不同的高度和背景色 */
.item:nth-child(7n+1) {
grid-row: 1 / 4;
background-color: var(--item-bg-1);
}
.item:nth-child(7n+2) {
grid-row: 1 / 3;
background-color: var(--item-bg-2);
}
.item:nth-child(7n+3) {
grid-row: 1 / 4;
background-color: var(--item-bg-3);
}
.item:nth-child(7n+4) {
grid-row: 4 / 7;
background-color: var(--item-bg-1);
}
.item:nth-child(7n+5) {
grid-row: 3 / 9;
background-color: var(--item-bg-2);
}
.item:nth-child(7n+6) {
grid-row: 4 / 8;
background-color: var(--item-bg-3);
}
.item:nth-child(7n+7) {
grid-row: 7 / 11;
background-color: var(--item-bg-1);
}
</style>

效果:

写在最后

在多列布局方面 column 属性相比于 flex 和 grid 而言,显得更有优势。

虽说 grid 也能做出瀑布流效果,不过需要指定每个网格单元的占用大小。

column 虽然不用控制每个子项的大小,但它的子元素排列顺序是从上到下排列,并不是从左往右,这种情况如果数据存在分页加载时候,就会出现内容重新排列导致内容闪动。

在瀑布流布局这个需求场景下,CSS 多多少少还是有点弱鸡~~必要时候还是只有祭出 JS 。

其他相关资料:

break-* 控制多列布局如何中断换列: https://developer.mozilla.org/zh-CN/docs/Web/CSS/break-inside

Web前端入门第 48 问:纯 CSS 使用 column 属性实现瀑布流布局的更多相关文章

  1. web前端入坑第五篇:秒懂Vuejs、Angular、React原理和前端发展历史

    秒懂Vuejs.Angular.React原理和前端发展历史 2017-04-07 小北哥哥 前端你别闹 今天来说说 "前端发展历史和框架" 「前端程序发展的历史」 「 不学自知, ...

  2. Android零基础入门第48节:可折叠列表ExpandableListView

    原文:Android零基础入门第48节:可折叠列表ExpandableListView 上一期学习了AutoCompleteTextView和MultiAutoCompleteTextView,你已经 ...

  3. web前端入坑第二篇:web前端到底怎么学?干货资料! 【转】

    http://blog.csdn.net/xllily_11/article/details/52145172 版权声明:本文为博主[小北]原创文章,如要转载请评论回复.个人前端公众号:前端你别闹,J ...

  4. 给 Web 前端开发人员推荐20款 CSS 编辑器

    CSS 和 HTML,JavaScript 是网页的基础,作为前端开发人员,对这三者都要很熟悉.特别是未来流行全栈开发的时代,每项技术都是你知识结构中必要的一个节点. 在开发中,选择好工具是非常重要的 ...

  5. web前端知识大纲:系列二 css篇

    web前端庞大而复杂的知识体系的组成:html.css和 javascript 二.css 1.CSS选择器 CSS选择器即通过某种规则来匹配相应的标签,并为其设置CSS样式,常用的有类选择器.标签选 ...

  6. Web前端开发规范【HTML/JavaScript/CSS】

    前言 这是一份旨在增强团队的开发协作,提高代码质量和打造开发基石的编码风格规范,其中包含了 HTML, JavaScript 和 CSS/SCSS 这几个部分.我们知道,当一个团队开始指定并实行编码规 ...

  7. web前端基础知识-(二)CSS基本操作

    1. 概述 css是英文Cascading Style Sheets的缩写,称为层叠样式表,用于对页面进行美化. 存在方式有三种:元素内联.页面嵌入和外部引入,比较三种方式的优缺点. 语法:style ...

  8. Web前端面试指导(十九):CSS样式-如何清除元素浮动?

    题目点评 本题属于比较常问的题目,也是在网页设计中经常遇到的问题,面试官希望通过这样的面试题来了解你对网页设计的基本功底,如果这样的题目答不出来,必会让面试官大失所望,面试成功的概率是非常小的. 答题 ...

  9. 【WEB前端开发最佳实践系列】CSS篇

    一.有效组织CSS代码 规划组织CSS代码:组织CSS代码文件,所有的CSS都可以分为2类,通用类和业务类.代码的组织应该把通用类和业务类的代码放在不同的目录中. 模块内部的另一样式规则:样式声明的顺 ...

  10. Web前端面试指导(十五):CSS样式-display有哪些作用?

    题目点评 其实就是要你说清楚该属性有哪些值,每个值都有什么作用,这个题目可以答得很简单,但要答全也并非是一件容易的事情. 元素默认的display值的情况如下(这个一般很少人注意这一点) block( ...

随机推荐

  1. P3092 [USACO13NOV] No Change G 题解

    传送门 题解 思路 看到 \(1\le k\le16\),我们想到状压DP. 以每枚硬币是否被使用为状态,对其进行枚举. 令 \(dp_i\) 表示状态 \(i\) 下最多能支付到第 \(dp_i\) ...

  2. Qt项目下pro文件设置库路径

    问题 正常情况下我们会将工程的路径用一个变量来储存 例如: PROJECT_DIR=/home/$$(USER)/svn/embd_linux/app 然后后面的变量引用这个变量,例如: INCLUD ...

  3. Python类型提示完全指南:用类型安全重构你的代码,提升10倍开发效率

    title: Python类型提示完全指南:用类型安全重构你的代码,提升10倍开发效率 date: 2025/2/23 updated: 2025/2/23 author: cmdragon exce ...

  4. ABC393F题解

    大概评级:绿. 一看到这种题目,就知道肯定是数据结构题,我们首先用一个众所周知的二分来求出 \(pos\) 数组,\(pos_i\) 表示以 \(i\) 结尾的最长上升子序列的大小,然后将询问离线,弄 ...

  5. 分布式锁—2.Redisson的可重入锁

    大纲 1.Redisson可重入锁RedissonLock概述 2.可重入锁源码之创建RedissonClient实例 3.可重入锁源码之lua脚本加锁逻辑 4.可重入锁源码之WatchDog维持加锁 ...

  6. Socket通信-Linux系统中C语言实现TCP/UDP图片和文件传输

    TCP实现 传输控制协议(TCP,Transmission Control Protocol) 是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议.TCP是因特网中的传输层协议, ...

  7. 【Abaqus】Composite Layup建模

    abaqus 的3个复合材料建模途径: 传统的material->section->orientation->step->job的建模方式 Composite Layup建模方 ...

  8. wxformbuilder 如何生成python 代码

    ?问题 正常通过F8->F6 ,我执行这两步操作后如下图,以.fbp格式显示,没生成文件 解决方案 object properties 下勾选python 效果图:

  9. mac 源码编译安装php8.3.9

    前提条件 确保你已经安装了 Homebrew 和 Xcode Command Line Tools.你可以通过以下命令安装它们: /bin/zsh -c "$(curl -fsSL http ...

  10. Django实战项目-学习任务系统-任务完成率统计

    接着上期代码内容,继续完善优化系统功能. 本次增加任务完成率统计功能,为更好的了解哪些任务完成率高,哪些任务完成率低. 该功能完成后,学习任务系统1.0版本就基本完成了. 1,编辑urls配置文件:. ...