位置: IT常识 - 正文

vue+uniapp瀑布流布局多种实现方式(vue实现瀑布流布局)

编辑:rootadmin
vue+uniapp瀑布流布局多种实现方式 文章目录前言一、实现原理二、代码实现1.方式1(图片高度累加比较法)2.方式2(父元素高度比较法)三.uniapp实现代码实现四、多列实现代码实现前言

推荐整理分享vue+uniapp瀑布流布局多种实现方式(vue实现瀑布流布局),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:vue瀑布流式页面布局,uicollectionview 瀑布流,uniapp实现瀑布流,vue瀑布流实现,vue实现瀑布流及无限加载,vue瀑布流插件最好用的,uniapp实现瀑布流,vue瀑布流实现,内容如对您有帮助,希望把文章链接给更多的朋友!

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

一、实现原理

通过动态计算哪一列高度最低,就把图片放置该列下显示,直至所有图片分列完毕

计算哪一列高度最低具体实现过程又分2种方式:

vue+uniapp瀑布流布局多种实现方式(vue实现瀑布流布局)

方式1:通过计算每一列每张图片渲染后高度进行累加就是该列的高度,记录每列累加高度比较大小 方式2:直接通过图片父级元素高度(列div)来判断哪一列最低

区别:方式1无需等待图片真实渲染完成在比较高度,方式2需要等待图片真实渲染完成在获取高度

二、代码实现

以左右2列为例

<template> <div class="page"> <!-- 左图片列表 --> <div class="left" ref="left"> <img class="img" v-for="(item, index) in leftList" :key="index" :src="item" /> </div> <!-- 右图片列表 --> <div class="right" ref="right"> <img class="img" v-for="(item, index) in rightList" :key="index" :src="item" /> </div> </div></template><style scoped>.page { width: 100%; display: flex; align-items: flex-start; padding: 0 1%; box-sizing: border-box;}.left,.right { margin: 0 auto; width: 48%;}.img { width: 100%; height: auto; margin-bottom: 10px;}</style>1.方式1(图片高度累加比较法)<script>export default { data() { return { imgList: [ "https://img0.baidu.com/it/u=1345303087,1528317222&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=1082", "https://img2.baidu.com/it/u=1893470775,4143435497&fm=253&fmt=auto&app=138&f=JPEG?w=889&h=500", "https://img0.baidu.com/it/u=1088754973,1390499664&fm=253&fmt=auto&app=138&f=JPEG?w=335&h=500", "https://img1.baidu.com/it/u=3866290852,3566512524&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=500", "https://img2.baidu.com/it/u=1114729443,1120710416&fm=253&fmt=auto&app=138&f=JPEG?w=667&h=500", "https://img0.baidu.com/it/u=1345303087,1528317222&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=1082", "https://img2.baidu.com/it/u=1893470775,4143435497&fm=253&fmt=auto&app=138&f=JPEG?w=889&h=500", "https://img2.baidu.com/it/u=1088754973,1390499664&fm=253&fmt=auto&app=138&f=JPEG?w=335&h=500", ], //所有图片 leftList: [], //左边列图片 rightList: [], //右边列图片 leftHeight: 0, //左边列高度 rightHeight: 0, //右边列高度 columnWidth: 0, //列宽度 }; }, mounted() { this.$nextTick(() => { this.columnWidth = this.$refs.left.clientWidth; this.setWaterFallLayout(); }); }, methods: { //方法1 async setWaterFallLayout() { for (let item of this.imgList) { let img = new Image(); img.src = item; try{ let h = await this.getImgHeight(img);//图片渲染后高度 if (this.leftHeight <= this.rightHeight) {//左边列比右边低,图片放入左边 this.leftList.push(item); this.leftHeight += h; } else {//否则,图片放入右边 this.rightList.push(item); this.rightHeight += h; } }catch(e){ console.log(e) } } }, //获取图片高度 getImgHeight(img) { return new Promise((resolve,reject) => { //图片加载完成 img.onload = () => { let h = (img.height / img.width) * this.columnWidth;//计算图片渲染后高度 resolve(h); }; //加载出错 img.onerror=()=>{ reject('error') } }); }, },};</script>2.方式2(父元素高度比较法)

每次放入图片需要等待渲染后再重新计算父元素高度,关键代码 await this.$nextTick()

<script>export default { data() { return { imgList: [ "https://img0.baidu.com/it/u=1345303087,1528317222&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=1082", "https://img2.baidu.com/it/u=1893470775,4143435497&fm=253&fmt=auto&app=138&f=JPEG?w=889&h=500", "https://img0.baidu.com/it/u=1088754973,1390499664&fm=253&fmt=auto&app=138&f=JPEG?w=335&h=500", "https://img1.baidu.com/it/u=3866290852,3566512524&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=500", "https://img2.baidu.com/it/u=1114729443,1120710416&fm=253&fmt=auto&app=138&f=JPEG?w=667&h=500", "https://img0.baidu.com/it/u=1345303087,1528317222&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=1082", "https://img2.baidu.com/it/u=1893470775,4143435497&fm=253&fmt=auto&app=138&f=JPEG?w=889&h=500", "https://img2.baidu.com/it/u=1088754973,1390499664&fm=253&fmt=auto&app=138&f=JPEG?w=335&h=500", ], //所有图片 leftList: [], //左边列表图片 rightList: [], //右边列表图片 }; }, mounted() { this.$nextTick(() => { this.setWaterFallLayout2(); }); }, methods: { //方法2 async setWaterFallLayout2() { for (let item of this.imgList) { if (this.$refs.left.clientHeight <= this.$refs.right.clientHeight) {//左边列比右边低,图片放入左边 this.leftList.push(item); } else {//否则图片放入右边 this.rightList.push(item); } await this.$nextTick();//等待渲染完成后重新比较左右高度 } }, },};</script>三.uniapp实现

由于uniapp获取元素高度和vue有所区别,造成实现瀑布流方式也需要调整。我们知道uniapp不能通过this.$ref.xx.clientHeight获取元素高度,而需要通过uni.createSelectorQuery().in(this).select(‘.xxxx’).boundingClientRect().exec()来获取,且经过实测当图片动态加入列后通过该api计算出父元素真实高度是不准确的,所以uniapp瀑布流布局实现方式只能通过方法1(也即图片高度累加法)进行实现,除了上面方法1通过img.onload来获取图片高度外,uniapp还提供uni.getImageInfo方法来更方便获取图片高度。

代码实现<template><view class="page"><view class="left" ref="left"><image class="image" v-for="(item,i) in leftList" :key="i" :src="item" mode="widthFix"></image></view><view class="right" ref="right"><image class="image" v-for="(item,i) in rightList" :key="i" :src="item" mode="widthFix"></image></view></view></template><style lang="scss">.page {width: 100%;display: flex;align-items: flex-start;padding: 0 1%;box-sizing: border-box;}.left,.right {margin: 0 auto;width: 48%;}.image {width: 100%;height: auto;margin-bottom: 10px;}</style><script>export default {data() {return {imageList: ["https://img0.baidu.com/it/u=1345303087,1528317222&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=1082","https://img2.baidu.com/it/u=1893470775,4143435497&fm=253&fmt=auto&app=138&f=JPEG?w=889&h=500","https://img0.baidu.com/it/u=1088754973,1390499664&fm=253&fmt=auto&app=138&f=JPEG?w=335&h=500","https://img1.baidu.com/it/u=3866290852,3566512524&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=500","https://img2.baidu.com/it/u=1114729443,1120710416&fm=253&fmt=auto&app=138&f=JPEG?w=667&h=500","https://img0.baidu.com/it/u=1345303087,1528317222&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=1082","https://img2.baidu.com/it/u=1893470775,4143435497&fm=253&fmt=auto&app=138&f=JPEG?w=889&h=500","https://img0.baidu.com/it/u=1088754973,1390499664&fm=253&fmt=auto&app=138&f=JPEG?w=335&h=500",], //所有图片leftList: [], //左边列图片rightList: [], //右边列图片leftHeight: 0, //左边列高度rightHeight: 0, //右边列高度columnWidth: 0 //列宽度}},mounted() {this.$nextTick(() => {uni.createSelectorQuery().in(this).select('.left').boundingClientRect(res => {this.columnWidth = res.width//方法1this.setWaterFallLayout()//方法2// this.setWaterFallLayout2()}).exec()})},methods: {//方法1通过img.onloadasync setWaterFallLayout() {for (let item of this.imageList) {let img = new Image()img.src = itemtry {let h = await this.getImgHeight(img)if (this.leftHeight <= this.rightHeight) {this.leftList.push(item)this.leftHeight += h} else {this.rightList.push(item)this.rightHeight += h}} catch (e) {console.log(e)}}},//获取图片高度getImgHeight(img) {return new Promise((resolve, reject) => {img.onload = () => {let h = img.height / img.width * this.columnWidthresolve(h)}//加载出错img.onerror = () => {reject('error')}})},//方法2通过uni.getImageInfoasync setWaterFallLayout2() {for (let item of this.imageList) {uni.getImageInfo({src: item,success: e => {if (this.leftHeight <= this.rightHeight) {this.leftList.push(item)this.leftHeight += e.height} else {this.rightList.push(item)this.rightHeight += e.height}}})}}},}</script>

四、多列实现

多列实现和2列一样,动态生成每列图片数据和记录每列高度

代码实现

以最简单的父元素高度比较法(方式2)为例实现,图片高度累加比较法(方式1)自行类比实现

<template> <div class="page"> <div class="column" ref="column" v-for="(item, index) in columnList" :key="index" > <img class="img" v-for="(n, i) in item" :key="i" :src="n" /> </div> </div></template><style scoped>.page { width: 100%; display: flex; align-items: flex-start; padding: 0 1%; box-sizing: border-box;}.column { flex: 1; padding: 0 10px; box-sizing: border-box; width: 0;}.img { width: 100%; height: auto; margin-bottom: 10px;}</style><script>export default { data() { return { imgList: [ "https://img0.baidu.com/it/u=1345303087,1528317222&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=1082","https://img2.baidu.com/it/u=1893470775,4143435497&fm=253&fmt=auto&app=138&f=JPEG?w=889&h=500","https://img0.baidu.com/it/u=1088754973,1390499664&fm=253&fmt=auto&app=138&f=JPEG?w=335&h=500","https://img1.baidu.com/it/u=3866290852,3566512524&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=500","https://img2.baidu.com/it/u=1114729443,1120710416&fm=253&fmt=auto&app=138&f=JPEG?w=667&h=500","https://img0.baidu.com/it/u=1345303087,1528317222&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=1082","https://img2.baidu.com/it/u=1893470775,4143435497&fm=253&fmt=auto&app=138&f=JPEG?w=889&h=500","https://img0.baidu.com/it/u=1088754973,1390499664&fm=253&fmt=auto&app=138&f=JPEG?w=335&h=500","https://img0.baidu.com/it/u=1345303087,1528317222&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=1082","https://img2.baidu.com/it/u=1893470775,4143435497&fm=253&fmt=auto&app=138&f=JPEG?w=889&h=500", ], //所有图片 columnList: [], //分配后的每列图片 columWidth: 0, //每列宽度 columnCount: 5, //显示几列 }; }, created() { //初始化数据 for (let i = 0; i < this.columnCount; i++) { this.columnList.push([]);//生成每列图片数组 } }, mounted() { this.$nextTick(()=>{ this.setWaterFallLayout(); }) }, methods: { //瀑布布局 async setWaterFallLayout() { for (let item of this.imgList) { let columnHeight = this.$refs.column.map((item) => item.clientHeight); //每列高度数组 let min = Math.min(...columnHeight); //找出最小高度值 let index = columnHeight.findIndex((item) => item === min); //找出最小高度列的索引 this.columnList[index].push(item);//放入图片 await this.$nextTick(); //等待渲染完成后重新比较高度 } }, },};</script>
本文链接地址:https://www.jiuchutong.com/zhishi/294547.html 转载请保留说明!

上一篇:Video.js 使用教程 - 手把手教你基于 Vue 搭建 HTML 5 视频播放器(video.js能播放什么格式)

下一篇:什么是WebRTC?(什么是webrip)

  • dg分区工具怎么用(dg分区工具怎么把c盘调大)

    dg分区工具怎么用(dg分区工具怎么把c盘调大)

  • hoco蓝牙耳机怎么配对(hoco蓝牙耳机怎么样)

    hoco蓝牙耳机怎么配对(hoco蓝牙耳机怎么样)

  • 华为智能助手在哪打开(华为智能手机智能助手)

    华为智能助手在哪打开(华为智能手机智能助手)

  • 淘宝怎么设置不看某个店铺(淘宝怎么设置不支持7天无理由退货)

    淘宝怎么设置不看某个店铺(淘宝怎么设置不支持7天无理由退货)

  • 苹果8蓝牙自动开启怎么关(苹果蓝牙自动打开是咋回事)

    苹果8蓝牙自动开启怎么关(苹果蓝牙自动打开是咋回事)

  • iqooz1是什么屏幕(iqooz1屏幕是什么屏)

    iqooz1是什么屏幕(iqooz1屏幕是什么屏)

  • 塞班系统是什么手机(什么叫塞班系统)

    塞班系统是什么手机(什么叫塞班系统)

  • svmsung是什么牌子电脑(svmsung是什么牌子电视)

    svmsung是什么牌子电脑(svmsung是什么牌子电视)

  • 微信视频不清晰怎么调(苹果微信视频不清晰)

    微信视频不清晰怎么调(苹果微信视频不清晰)

  • 华为用户体验计划开还是关(华为用户体验计划上传数据可以删除吗)

    华为用户体验计划开还是关(华为用户体验计划上传数据可以删除吗)

  • matlab怎么调用函数(matlab怎么样调用函数)

    matlab怎么调用函数(matlab怎么样调用函数)

  • 滴滴顺风车怎么看不到乘客(滴滴顺风车怎么接单啊)

    滴滴顺风车怎么看不到乘客(滴滴顺风车怎么接单啊)

  • 苹果电脑装windows系统会有什么影响(苹果电脑装windows发烫)

    苹果电脑装windows系统会有什么影响(苹果电脑装windows发烫)

  • 技嘉大雕和小雕的区别(技嘉大雕小雕超级雕)

    技嘉大雕和小雕的区别(技嘉大雕小雕超级雕)

  • 锐龙5 2500u核显相当于(锐龙5000h核显)

    锐龙5 2500u核显相当于(锐龙5000h核显)

  • 智行和12306是一家吗(智行和12306是一个账号吗)

    智行和12306是一家吗(智行和12306是一个账号吗)

  • ps渐变工具在哪里(2023ps渐变工具在哪)

    ps渐变工具在哪里(2023ps渐变工具在哪)

  • ipad4怎么设置手写(ipadair4怎么设置手势)

    ipad4怎么设置手写(ipadair4怎么设置手势)

  • 华为手环4和荣耀手环5的区别(华为手环4和荣耀手环6哪个好)

    华为手环4和荣耀手环5的区别(华为手环4和荣耀手环6哪个好)

  • 华为p30如何关闭抬起唤醒(华为p30如何关闭后后运行程序)

    华为p30如何关闭抬起唤醒(华为p30如何关闭后后运行程序)

  • 电脑cpu温度多少正常(电脑cpu温度多少是正常范围)

    电脑cpu温度多少正常(电脑cpu温度多少是正常范围)

  • vivo三个按键设置方法(vivo三个按键在哪设置)

    vivo三个按键设置方法(vivo三个按键在哪设置)

  • vivox20美颜怎么设置(vivo手机美颜功能设置)

    vivox20美颜怎么设置(vivo手机美颜功能设置)

  • 怎么找到没保存的ppt(怎么找到没保存的群)

    怎么找到没保存的ppt(怎么找到没保存的群)

  • 小米6插电脑无法识别(小米插电脑无法识别)

    小米6插电脑无法识别(小米插电脑无法识别)

  • oppo手机通话记录不显示怎么回事(oppo手机通话记录怎么恢复)

    oppo手机通话记录不显示怎么回事(oppo手机通话记录怎么恢复)

  • 苹果手机断触解决步骤(苹果手机断触失灵)

    苹果手机断触解决步骤(苹果手机断触失灵)

  • iphonexr怎么定时开关机(苹果xr怎么定时开机)

    iphonexr怎么定时开关机(苹果xr怎么定时开机)

  • 探探共同联系人是什么(探探共同联系人打开朋友会发现吗)

    探探共同联系人是什么(探探共同联系人打开朋友会发现吗)

  • vivoz3i闪充在哪设置(vivoz3闪充和慢充的标志)

    vivoz3i闪充在哪设置(vivoz3闪充和慢充的标志)

  • 如何修改电脑默认用户名Administrator?(如何修改电脑默认打印机)

    如何修改电脑默认用户名Administrator?(如何修改电脑默认打印机)

  • 车辆购置税征收管理
  • 已申报税额是什么意思可以退吗
  • 发行股票支付给承销商的发行费用计入
  • 每月企业所得税申报截止到几号
  • 自然人扣缴是什么意思
  • 企业收到投资款怎么处理
  • 融资租赁的服务费的标准
  • 公司购车购置税怎么交款
  • 公司向贷款公司贷款做账分录
  • 保安公司怎样上保险
  • 工资分两次发为什么分两次扣税?
  • 公司团建活动奖状模板
  • 农产品所得税扣除比例
  • 进销项税额的会计分录
  • 代收水电费如何开票商品分类编码
  • 当期净资产收益率怎么算
  • 整体购买企业资产涉及哪些税
  • 子公司评估增值 出售股权
  • 进项税额转出会计分录月末如何结转
  • 分公司是否需要章程
  • 交换房产土地如何交税
  • 无偿使用固定资产如何缴税
  • 1697509550
  • 购买原材料的运输费计入什么科目
  • 补缴以前年度附加税
  • 建筑行业预交增值税什么时候预交
  • 会计科目暂存款是什么意思
  • 生产型出口企业免抵退
  • ssms注释
  • vuecli websocket
  • 教案的近义词是什么
  • 委托加工业务要交税吗
  • 所得税减免要做账吗
  • 微信小程序项目中app.js文件是全局样式文件
  • 深度学习知识点简单概述【更新中】
  • 数据分析利器:pandas库的应用课后答案
  • php递归算法经典题目
  • 计提本月财务费用会计分录
  • 国有资产无偿划转的会计处理
  • 资产总额不超过5000万是指全年平均收入吗
  • 织梦标签工具
  • 中华人民共和国企业所得税年度纳税申报表
  • 新公司开基本户需要带什么材料
  • 高并发数据库解决方案
  • 实收资本变化
  • 收到银行开具的利息发票怎么做账
  • 销售设备提供安装服务
  • 公司被仲裁后怎么补救
  • 融资租赁会计处理中,承租人与出租人之间有哪些联系?
  • 应收账款和应付账款属于什么科目
  • 水电费的会计分录
  • 新准则对企业的影响
  • 收到银行手续费已做后期收到发票怎么做
  • 工程施工的保险费的账务处理
  • 期末结转生产成本的账户
  • 银行收到工伤保险费怎么做分录
  • 购买柴油预付卡怎么入账
  • etc发票当天可以打印吗
  • 固定资产折旧的会计凭证
  • 企业支付宝问题解决
  • 日记账怎么设置
  • centos rpc
  • macbookair切换桌面
  • 新买的苹果电脑没有电
  • OS X Yosemite系统怎么样 OS X Yosemite功能介绍
  • culauncherexe是什么进程
  • win7组合键失效
  • window10软件搜索
  • linux a
  • Linux系统配置IP地址
  • linux运行级别有几种
  • windowsxp命令行窗口怎么打开
  • jquery插件库怎么导入
  • 类似愤怒小鸟的小游戏
  • ug10避让怎么设置
  • jquery命名空间
  • 税务局通知自查该怎么办理
  • 临沂市国家税务局人员名单
  • 收到虚开增值税专用发票怎么处理
  • 重庆税务自助取票地点
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设