位置: 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)

  • 支付宝代办的健康码可以删除吗(支付宝代办的健康码找不到了怎么办)

    支付宝代办的健康码可以删除吗(支付宝代办的健康码找不到了怎么办)

  • 手机换外屏后有小气泡(手机换外屏后有黑影几天能消)

    手机换外屏后有小气泡(手机换外屏后有黑影几天能消)

  • 微信跟随系统在哪设置(微信跟随系统在哪里找)

    微信跟随系统在哪设置(微信跟随系统在哪里找)

  • vivox30怎么分屏(vivox30怎么分屏操作步骤)

    vivox30怎么分屏(vivox30怎么分屏操作步骤)

  • 自动息屏是什么意思

    自动息屏是什么意思

  • 手机qq辨别隐身和离线(手机qq辨别隐身和离线2022)

    手机qq辨别隐身和离线(手机qq辨别隐身和离线2022)

  • 小米应用商店一直加载不出来(小米应用商店一直安装中)

    小米应用商店一直加载不出来(小米应用商店一直安装中)

  • 为什么手机没有声音,但是已经调大了(为什么手机没有显卡)

    为什么手机没有声音,但是已经调大了(为什么手机没有显卡)

  • 惠普打印机每次打印都要按ok(惠普打印机每次都要连无线吗)

    惠普打印机每次打印都要按ok(惠普打印机每次都要连无线吗)

  • 耳机音质怎么调(耳机音质怎么调节)

    耳机音质怎么调(耳机音质怎么调节)

  • 手机腾讯会议共享屏幕播放视频没声音(手机腾讯会议共享ppt还能看到人脸吗)

    手机腾讯会议共享屏幕播放视频没声音(手机腾讯会议共享ppt还能看到人脸吗)

  • 没读卡器sd卡怎么插电脑上(没读卡器sd卡怎么读取)

    没读卡器sd卡怎么插电脑上(没读卡器sd卡怎么读取)

  • 英特网是什么结构的网络(英特网是什么结构的网站)

    英特网是什么结构的网络(英特网是什么结构的网站)

  • 日志数据是什么类型(日志数据存储)

    日志数据是什么类型(日志数据存储)

  • oracle默认用户名和密码(oracle的默认用户名)

    oracle默认用户名和密码(oracle的默认用户名)

  • 怎样解除微信自动清理(怎样解除微信自动扣费功能)

    怎样解除微信自动清理(怎样解除微信自动扣费功能)

  • 手机桌面设置怎么恢复(手机桌面设置怎么关闭)

    手机桌面设置怎么恢复(手机桌面设置怎么关闭)

  • realmex2pro支持NFC吗(realmex2pro支持wifi6吗)

    realmex2pro支持NFC吗(realmex2pro支持wifi6吗)

  • oppok5什么时间上市(oppok5啥时候上市)

    oppok5什么时间上市(oppok5啥时候上市)

  • 手机怎么提高视频画质(手机怎么提高视频帧数)

    手机怎么提高视频画质(手机怎么提高视频帧数)

  • 小米5s屏幕尺寸(y5s屏幕尺寸多大)

    小米5s屏幕尺寸(y5s屏幕尺寸多大)

  • i7 6500u是什么档次(i7 6500什么水平)

    i7 6500u是什么档次(i7 6500什么水平)

  • zar是什么牌子(hm是什么牌子)

    zar是什么牌子(hm是什么牌子)

  • etc重新激活要到哪里(etc重新激活需要开车去吗)

    etc重新激活要到哪里(etc重新激活需要开车去吗)

  • 荣耀20nfc支持那些地方(荣耀20nfc可以刷地铁吗)

    荣耀20nfc支持那些地方(荣耀20nfc可以刷地铁吗)

  • eclipse界面恢复(eclipse界面恢复原始状态)

    eclipse界面恢复(eclipse界面恢复原始状态)

  • 耳机插入电脑没有声音(蓝牙耳机连电脑)

    耳机插入电脑没有声音(蓝牙耳机连电脑)

  • 公司老板有钱吗
  • 个税申报怎样作废
  • 业务活动表本月数和本年累计数
  • 出差的餐饮发票的税率是多少
  • 母子公司无偿划转资产涉税
  • 税控服务费属于什么费用
  • 小企业费用包括哪些
  • 基础设施特许权包括
  • 递延收益没有应列入哪个科目
  • 发出材料计划成本例题
  • 收到发票当月不抵扣怎么做账
  • 单位员工去外地上班
  • 滞留票的原因是什么?
  • 发票上面税率地方为*号代表什么
  • 开票系统维护费必须要交吗
  • 季度保税企业所得税申报的逾期申报怎么办?
  • 电子汇票如何使用
  • 库存与账面不符怎么办
  • 事业单位固定资产盘盈账务处理
  • 融资性售后回租承租方为什么不交税
  • 暂估材料太多怎么办
  • 增值税发票的进项和出项要一致吗
  • 设立全资子公司的风险
  • 公司财务账目不符怎么办
  • 印花税计提与缴税的区别
  • apache安装与配置windows
  • 生产员工福利计什么科目
  • 直接计入当期利润的利得和损失有哪些
  • 房地产公司土地在资产负债表列入
  • 公司股东变更要交税吗可以将股东变更吗
  • 跨年度坏账准备转回账务处理
  • cvpr2017最佳论文
  • PHP:JewishToJD()的用法_日历函数
  • php找出字符串中出现最多的字母
  • php gd gd2
  • 增值税上期留抵税额
  • 与资产相关的政府补助有哪些
  • 推荐最好用的
  • css3两种调整背景图片大小的方式
  • 管理不善造成的货物损失进项税可以抵扣吗
  • 固定资产清理需要交企业所得税吗
  • python中socket怎么用
  • js闭包示例
  • 费用发票可以抵扣进项税吗
  • 固定资产折旧方法一经确定不得随意变更
  • SQL Server Native Client下载 SQL Server Native Client安装方法
  • sql server 查看
  • 创建一个空的学生基本信息表的副本
  • mongotemplate 分页查询
  • 个体工商户是什么意思
  • 企业成本计算的依据是什么
  • 年报资本负债表怎么看
  • 纳税期限与缴库期限不符
  • 房地产结转收入的条件
  • 融资手续费计入什么成本
  • 加班餐补需要发票嘛
  • 收到同业清算互联前置如何入账
  • 一般纳税人月底进项税销项税怎么做分录
  • 小企业成本核算方法怎么填
  • mysql的拼接符号
  • ubuntu文本编辑器怎么打开
  • mac系统怎么删除用户
  • mac命令行窗口怎么打开
  • win8.1死机卡住不动
  • mac在哪看
  • linux在服务器的份额
  • suse linux 12 sp5
  • view组件属性
  • perl ne
  • unity点击按钮没反应
  • node.js中实现同步操作的3种实现方法
  • python的基本数值类型
  • javascript自动化
  • 安卓手机更新时间
  • Android 自定义view
  • bootstrap需要学多久
  • 门诊看病记录怎么查
  • 外经证注销网上操作
  • 国税局官网查询平台
  • 发票挂失费用
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设