什么是瀑布流?

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

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

使用 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. DeepSeek本地部署

    一.ollama ollama是一个管理和运行所有大模型.开源大模型的平台.在官网的Models中可以看到deepseek-r1的AI模型 1.在官网中下载对应系统的ollama,下载时需要开墙,或者 ...

  2. 【攻防世界】ez_curl

    ez_curl 题目来源 攻防世界 NO.GFSJ1188 题解 是一个PHP的代码审计 同时还提供了一个附件app.js,打开后内容如下 app.js中: req.query.admin.inclu ...

  3. ubuntu更换国内镜像源备忘

    源的路径: /etc/apt/sources.list 更换前备份一下: sudo cp /etc/apt/sources.list /etc/apt/sources_init.list 打开文档,修 ...

  4. MyCat分库分表-主从

    一.MySQL数据同步 1.主节点配置,log-bin,指定文件名称 2.主节点配置server-id,默认为1 vim /etc/my.cof 在[mysqld]下添加如下配置 log-bin=im ...

  5. 一个生成随机颜色的js函数

    function getRandomColor(){ let rgb = []; for(let i=0;i<3;++i){ let color = Math.floor(Math.random ...

  6. JMeter 获取 response body 的数据

    JMeter 获取 response body 的数据 位置:右键(HTTP Request) - Add - Post Processors - BeanShell PostProcessor im ...

  7. k8s NotReady cni config uninitialized

    前言 k8s node 节点 join master 后,状态报错:NOT READY 查看 kubelet 日志 journalctl -xeu kubelet 报错如下:Container run ...

  8. go generate

    介绍 go generate 命令是go 1.4版本里面新添加的一个命令,当运行 go generate 时,它将扫描与当前包相关的源代码文件,找出所有包含 //go:generate 的特殊注释,提 ...

  9. pagehelper的失效问题

    pagehelper是常用的分页插件,代码中常用到,使用简便且对代码侵入性较小,很多人都喜欢使用.不过有时会遇到分页失败问题,输出结果没有分页,日志输出sql语句没有分页关键字及分页参数,目测是pag ...

  10. UML中的各种关系

    各种关系 UML中的各种关系一览表 名称 英文名称 符号 描述 实现方法 耦合强度 举例 关键词 备注 依赖 dependency 1.当类与类之间有使用关系时就属于依赖关系:2.依赖不具有" ...