瀑布流布局(multi-column多列布局)

news2024/11/26 13:35:19

 效果展示:

 

瀑布流布局是网页设计常见的一种布局,一般用于图片多列展示。列宽固定,图片根据自身高度自适应交错排列。 

 特点:

  • 等宽不等高,多列布局;
  • 随着页面滚动条向下滚动,不断加载数据块并附加至当前尾部;
  • 每行排满后,新的图片添加到后面
  • 窗口尺寸改变,重新计算布局

优点

  • 节省空间:降低页面的复杂
  • 对于 触屏设备非常友好:通过向上滑动浏览,交互方式更符合直觉
  • 良好的视觉体验:浏览时不会被页面整整齐齐的高度影响,参差不齐,降低浏览的疲劳

缺点

  • 内容总长度 无法掌握
  • 数据过多时,容易造成页面 加载的负荷
  • 再次加载时 很难定位上一次浏览的内容

理想效果:

  • 列宽固定,图片根据自身高度自适应交错排列;
  • 排列规则:第一行图片按顺序排满一行,后面的图片按照规则放在高度最小的列下面;
  • 图片触底更新,按需加载;
  • 窗口大小改变,自适应图片的列数;
  • 最底部对齐;

实现方法

一、纯CSS实现(multi-column 多列布局)

用到属性

column-count : 定义列数
column-gap :列与列之间的间隔

特点

顺序只能是 从上到下 再左到右

缺点

由于排列顺序是先 从上到下 再左到右,只能用于数据固定, 无法动态的加载追加,对于滚动到底部加载新数据则无法实现。

4.注意点:

有时候页面会出现在前几列的最后一个元素的内容被自动断开,一部分在当前列尾,一部分在下一列的列头。这时候子元素可以用 break-inside设置为不被截断 avoid来控制,像下面这样

break-inside: avoid; // 不被截断 默认值是auto,会被截断

5、实现思路:

  •  外层盒子定义列数和列间距
  • 每项 item 设置 break-inside: avoid; 让它不被截断

 二、flex布局实现

实现思路:

  • 将最外层元素设置为 display: flex,即横向排列。
  • 设置 flex-flow:column wrap 使其换行。
  • 设置 height: 100vh 填充屏幕的高度,来容纳子元素。
  • 每一列的宽度可用 calc 函数来设置,即 width: calc(100%/3 - 20px)。分成等宽的 3 列减掉左右两边的 margin 距离。

缺点:

不能动态添加数据

三、JS绝对定位实现(不推荐使用)

原理:

精确计算每个子元素绝对定位到瀑布流它应该去的地方,需要后期一些优化,并不推荐使用

缺点:

  • 计算量大,较复杂
  • 会有高度塌陷问题
  • 子元素因为设置了 absolute并不会占高,页面可滚动的话又会产生另外的问题
  • 如果在移动端中会做适配,当前的绝对定位的高度单位在代码实现若为px 并不会自动换算
  • 当视口的窗口resize改变,需要重新计算元素的位置,若会不断触发事件,性能消耗大,加载也慢,这是不可取的

关键数据:

  • 列的数量
  • 图片宽度固定
  • 间隙
  • 容器宽度

实现思路:

1、创建图片容器、元素

2、绝对定位设置每张图片的位置

  • 子元素全部设置成绝对定位
  • 找到所有列中>最小的位置
  • 计算子元素定位时的 top 以及left
  • 修改子元素的样式,设置position为absolute ,以及设置top ,left
  • 每次插入的位置选择所有列高度最小 的位置,依次循环

3、监听窗口改变,重新设置图片位置

定义数据和ui样式

数据设计

imgsArr_c 是 增加height属性后的新图片数组

 

 

图片预处理

列宽 = 整个容器的宽度 / 列数

图片宽度 = 列宽 - (间隔 * 2)

实现图片按原始比例缩放:图片高度 = 图片宽度 * (原始图片高度 / 原始图片宽度)

若加载失败则设置图片高度与宽度一致,加载成功则按原始比例动态计算图片高度

加载图片

懒加载,预加载,压缩图片

这里需要注意的是,vue 中数据的变化到 DOM 的重新渲染是一个异步过程。vue 中当 data 改变后,并不是立即渲染到页面上的,而是先放到事件队列上。然后,在下一个的事件循环中,Vue 刷新事件队列并执行实际 (已去重的) 工作。这就导致了,数据改变后挂载在 dom 上可能会存在一定的延迟,所以数据改变后立刻去获取 dom 元素可能拿到的不是最新的值而是改变前的值。

所以,使用 $nextTick 来对解决这个问题,$nextTick 的作用就是在下次 dom 更新循环结束后执行其 callback。在修改 imgsArr_c 之后使用这个方法,才能保证排列的元素是更新后的。

 设置图片行内样式宽高

设置瀑布流

设置图片的高度,top,left

第一行:
  • top = 0
  • left = 索引 * 列宽
第二行往后的 n 行:
  • 拿到当前高度最低的列高 minHeight,返回其索引 minIndex
  • Math.min.apply(null,  arr),表示获取数组中最小的值
  • top = 最小列的高度值
  • left = 最小列的索引 * 列宽
  • 更新最小列高度 = 原来的高度 + 新加的图片高度

 

 增加图片间隔在 top 和 列高 都要加

 调用预加载图片函数

拿到视口大小

 到此,JS实现瀑布流实现完成。

以下是优化部分:

触底更新图片

图片懒加载

在Vue中JS定位实现瀑布流

注意点:axios获取数据,不可在其他方法中拿到,但模板可以使用

四、CSS瓦片布局实现

基于Grid 布局实现的,除了火狐浏览器其他都不支持,兼容性差,Pass掉了。

Vue中瀑布流布局与图片加载优化的实现_vue.js_脚本之家

用 vue 实现瀑布流_vue 瀑布流_hhhqzh的博客-CSDN博客

实现瀑布流布局的四种方法_Smile_zxx的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/773682.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浅谈一下企业IT运维痛点以及好用的运维软件推荐

随着IT建设的不断深入和完善,IT资产越来越多,IT运维管理越发显得重要。但不少企业不知道如何有效进行IT运维,不知道如何更好进行IT运维,今天我们就来一起浅谈一下企业IT运维痛点,以及给大家推荐一款好用的运维管理软件…

国内外接口文档工具哪家强?ApiManager-在线接口文档管理工具

下面是关于接口文档工具-在线接口文档管理工具 接口文档是贯穿整个开发项目流程中的规范,前后端开发需要在开发前期进行接口定义并形成文档,测试人员在功能测试和接口测试的环节也需要对这些接口文档进行测试。 然而随着开发版本迭代,很多接…

Hadoop——Windows系统下Hadoop单机环境搭建

为了便于开发,我在本地Windows系统进行Hadoop搭建。 我使用的版本:hadoop-2.7.0。其他版本也可,搭建流程基本一样,所以参考这个教程一般不会有错。 1、下载安装包和插件 安装包hadoop-2.7.0.tar.gz 必要插件winutils-master 2、…

JAVA15个常见面试题

下面是一些常见的Java面试题及答案: Java中的值传递和引用传递有什么区别? Java中的参数传递方式都是值传递,但是对于引用类型的参数,传递的是对象的引用副本。 什么是Java中的面向对象编程? 面向对象编程是一种编程范…

【产品设计】微信小程序如何做好“授权”设计?

授权登录降低了用户注册账号时的操作成本,减少了产品的获客门槛。在本文中,作者结合案例,盘点了微信小程序授权登录设计中需要注意的几点问题,并对功能设计背后的设计思路与原理进行了简要的分析 01 openID 这是微信生态圈中&…

# Linux下用mailx发送邮件,邮件内容在用户端变成了以为.bin为扩展名的邮件附件的问题解决

Linux下用mailx发送邮件,邮件内容在用户端变成了以为.bin为扩展名的邮件附件的问题解决 文章目录 Linux下用mailx发送邮件,邮件内容在用户端变成了以为.bin为扩展名的邮件附件的问题解决1 发送邮件范例:2 文件范例参考(/root/loll…

Microsoft Outlook如何自动归类邮件

右键点击 Inbox→New Folder 填写文件夹名称 temp Move→Rules→Create Rule Select Folder 点击temp→OK

Linux 内核概念和学习详解

1、前言 本文主要讲解什么是Linux内核,以及通过多张图片展示Linux内核的作用与功能,以便于读者能快速理解什么是Linux内核,能看懂Linux内核。 拥有超过1300万行的代码,Linux内核是世界上最大的开源项目之一,但是内核…

css 3个元素行排列,前2个元素靠左,第三个元素靠右

上效果&#xff1a; 实现方式&#xff1a; display:flex &#xff0c; 行排列&#xff0c;默认靠左对齐&#xff0c; 然后让第三个元素自动占满剩余的空间&#xff1a;flex-grow:1&#xff0c;text-align:end // wxml <!-- 支付方式--><view class"payment_…

尚无忧多门店自助宠物洗护系统美容宠物寄养系统小程序

技术框架&#xff1a;thinkphpmysql跨平台uniapp 完全开源无需授权 支持&#xff1a; 多门店商家入驻&#xff0c;管理 门店自助设备预约 电子门锁扫码开门 会员开购买&#xff0c;会员余额充值 自助订单和宠物预约订单管理 宠物添加管理 洗护知识文章设置 <templa…

套餐管理模块开发 -- 手把手教你做ssm+springboot入门后端项目黑马程序员瑞吉外卖(六)

文章目录 前言一、新增套餐1. 需求分析2. 数据模型3. 代码开发4. 功能测试 二、套餐信息分页查询1. 需求分析2. 代码开发3. 功能测试 三、删除套餐1. 需求分析2. 代码开发3. 功能测试 总结 前言 为了巩固所学的知识&#xff0c;作者尝试着开始发布一些学习笔记类的博客&#x…

推荐模型——逻辑回归

文章目录 1. 逻辑回归特点2. 基于逻辑回归的推荐流程3. 逻辑回归模型的数学形式4. 逻辑回归模型的训练方法5. 逻辑回归模型的优势5.1 数学含义上的支撑5.2 可解释性强5.3 工程化的需要 6. 逻辑回归的局限性 1. 逻辑回归特点 逻辑回归是融合多种特征的推荐模型。 相比于协同过…

J Roulette(“范式杯”2023牛客暑期多校训练营1)

目录 题目描述&#xff1a; 解题思路&#xff1a; 解题代码&#xff1a; 题目描述&#xff1a; 解题思路&#xff1a; 注&#xff1a;其中对于取模过程中用到了费马小定理&#xff0c;可参考如下博客&#xff1a; (3条消息) 费马小定理及其应用_CTGU-Yoghurt的博客-CSDN博客 …

LiveGBS流媒体平台国标GB/T28181功能-国标级联到海康大华宇视华为等第三方国标平台上级不支持H265/HEVC支持强制推送H264编码

LiveGBS国标级联到海康大华宇视华为等第三方国标平台上级不支持H265/HEVC支持强制推送H264编码 1、背景2、什么是GB/T28181级联3、获取上级接入配置信息3.1、接入第三方国标平台3.2、接入LiveGBS示例 4、配置国标级联4.1、国标级联菜单4.2、添加上级平台4.3、编辑上级平台级联4…

微服务保护---Sentinel(雪崩问题/流量控制/隔离和降级)

目录 1.雪崩问题 1.1.解决雪崩问题的常见方式有四种 2.什么是Sentinel 2.1.安装Sentinel控制台 2.2.微服务整合Sentinel 3.流量控制 3.1.簇点链路 3.2.快速入门 3.2.1.示例 3.2.2.利用jmeter测试 3.3.流控模式 3.3.1.关联模式 3.3.2.链路模式 3.3.3.总结 3.4.流控…

如何在 Ubuntu 20.04 桌面上启用/禁用 wayland

Wayland 是一种通信协议&#xff0c;指定显示服务器与其客户端之间的通信。 默认情况下&#xff0c;Ubuntu 20.04 桌面不会启动 Wayland&#xff0c;而是加载 Xorg 显示服务器X11。 在本教程中您将学习&#xff1a; 如何启用 Wayland如何禁用 Wayland 类别要求、约定或使用的…

途乐证券-股票退市股民如何索赔?

股票退市股民能够经过以下途径来索赔&#xff1a; 1、团体诉讼 团体诉讼允许多个股民联合起来作为原告&#xff0c;以代表整个群体进行索赔。这种方式一般需求证明公司或其管理层存在违法行为或虚假陈说等&#xff0c;导致股民的丢失。 2、单个诉讼 在这种状况下&#xff0c…

el-table 鼠标悬浮时背景色改变

案例&#xff1a; /* css 鼠标悬浮时 */ ::v-deep .el-table tbody tr:hover > td {background-color: rgb(65, 111, 180) !important;color: #ffffff; } 表格背景色透明 ::v-deep .el-table tr {/* background-color: #10274c; */background-color: transparent;color: #f…

【gis插件】arcgis插件界址点编号工具、C#实现思路(附插件下载链接)

数据&#xff1a;界址点图层、宗地图层 要求&#xff1a;找出宗地对应的所有界址点号&#xff0c;对这些界址点号以J1开始按顺序排列 要找出宗地所对应的所有界址点号&#xff0c;这里只要执行一个标识 即可得到这样得到的结果。 难点在于对界址点的编号&#xff0c;经过检查…

【linux】\r 和 \n 的区别、缓冲区的刷新情况、实例:进度条(用 Makefile 自动化构建)

目录 1. \r 和 \n2. 通过一个小程序观察现象3. 进度条 1. \r 和 \n 回车和换行符在 linux 系统下的 gcc 编辑器中&#xff0c;是能观测出有明显区别的。 \n&#xff1a;换行 --> 光标去往下一行的相同位置 \r&#xff1a;回车 --> 光标回到该行最左侧 &#xff08;两步之…