小程序实现无限瀑布流

实现瀑布流

实现效果

http://media.kitebear.cn/ct/2019-03-17-2019-03-17%2013.36.04.gif

有好几种方案

1.用column-count属性把页面元素分为俩列或多列来实现

2.用display flex 分列来展示页面

3.比如说用js实现

我今天介绍的就是第三种,因为前两种都会有局限,实现的效果我们希望是左右左右,而不是分成两列去显示,因为如果功能需要列表按照热度显示,从我们视觉来看就是 左右比较好,而不是一整列 1,2,3,4,5…

当然如果你们希望用column-count 实现的话,也可以 请点击,我随便找了一个网址网上有很多,我自己也试过实现起来确实很简单,纯css3实现。

那么好,现在正式开始:

说一下思路,通过js控制两列数组,分别在这两个数组中插入图片实现列表展示

首先HTML布局

<view class="post-content" wx:if="{{list.length}}"><view class="left-view"><repeat for="{{leftList}}" key="index" index="index" item="item"><PostItem :item.sync="item" imgMode="widthFix" /></repeat></view><view class="right-view"><repeat for="{{rightList}}" key="index" index="index" item="item"><PostItem :item.sync="item" imgMode="widthFix" /></repeat></view>
</view>

可以看到就是一个外部大壳子,然后两列 left-view、right-view 之后就是两个数组循环展示,PostItem是我自己封装的组件用来展示单个item

css部分

.post-content {padding: 0 24rpx;padding-top: 24rpx;box-sizing: border-box;> view {width: 49%;display: inline-block;vertical-align: top;}.left-view {margin-right: 2%;}
}

也很简单两列宽度约等于50%中间有间隔

js部分

loadImages () {setTimeout(() => {const data = this.listlet { leftList, rightList } = thisif (data.length) {for (let i = 0; i < data.length; i++) {if (data[i].id % 2 == 1) {leftList.push(data[i])} else {rightList.push(data[i])}}this.leftList = leftListthis.rightList = rightListthis.$apply()}}, 1000);
}data = {leftList: [], //左列rightList: [], //右列
}

就可以看到下列图

但是如果只是这样实现的话就会有问题,因为它的实现是按照奇偶数实现的,那么如果有几张图片正好很高,那么另外一列就会很难看。

http://media.kitebear.cn/ct/2019-03-17-2019-03-17%2012.28.35.gif

下列有问题的情况

2019-03-17 12.34.53

可以看到左列很难看

那么我做一下修改, 在遍历数据的时候做了左右列表的高度检测,如果哪边低那么就append到哪边

loadImages (list) {const newList = list || this.listsetTimeout(() => {let { leftList, rightList } = thisif (newList.length) {helper.forSetTimeout(newList,async (i) => {const isLeft = await this.isPushLeft()if (isLeft) {leftList.push(newList[i])} else {rightList.push(newList[i])}this.leftList = leftListthis.rightList = rightListthis.$apply()}, 50)}}, 300);
}// forSetTimeout 实现
function forSetTimeout (list, callback, time = 1000) {for (let i = 0; i < list.length; i++) {setTimeout(((num) => {return callback.bind(null, num)})(i), i * time)}
}isPushLeft () {const query = wepy.createSelectorQuery()query.select('.left-view').boundingClientRect()query.select('.right-view').boundingClientRect()return new Promise((resolve, reject) => {query.exec((res) => {const leftData = res[0]const rightData = res[1]resolve(leftData.height < rightData.height)})})
}

最终效果如最上面的图,事实上setTimeout的时间间隔可以改成30毫秒以内,但是我觉得50毫秒已经不影响正常体验了。

转载于:https://www.cnblogs.com/kitebear/p/10550588.html

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

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

相关文章

python canny检测_【数字图像分析】基于Python实现 Canny Edge Detection(Canny 边缘检测算法)...

Canny 边缘检测算法Steps:高斯滤波平滑计算梯度大小和方向非极大值抑制双阈值检测和连接代码结构&#xff1a;Canny Edge Detection|Gaussian_Smoothing||convolution.py|||convolution()||gaussion_smoothing.py|||dnorm()|||gaussian_kernel()|||gaussian_blur()|Sobel_Filte…

目标和执行

信息系统可以给各行各业带来巨大的价值&#xff0c;因为它可以取代很多手工劳动&#xff0c;并且代价很低&#xff0c;另外很多原来无法做到的事情都可以借助信息系统完成。因此&#xff0c;在IT业里&#xff0c;可以说机会很多&#xff0c;各种行业都需要开发信息系统&#xf…

[vue] 你了解vue的diff算法吗?

[vue] 你了解vue的diff算法吗&#xff1f; 我的理解:计算出虚拟 DOM 中真正变化的部分,并且只针对该部分进行 DOM 更新,而非重新渲染整个页面个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 …

java 拖放文字_myeclipse2014如何实现jsp中的html代码的文字拖放

本帖最后由 liyihongcug 于 2015-3-5 16:53 编辑把 jsp打开 (visual jsp editor)之后上班区 单击右键 show --- pallette就可以了感叹myeclipse确实强大的 标签技术强于.net mvc强。vs2013能实现iis无需安装的情况下 动态指定 某个页面为首选 启动 --------------------希望2…

leetcode 二叉树的层次遍历 II(Binary Tree Level Order Traversal II)

目录 题目描述&#xff1a;示例&#xff1a;解法&#xff1a;题目描述&#xff1a; 给定一个二叉树&#xff0c;返回其节点值自底向上的层次遍历。 &#xff08;即按从叶子节点所在层到根节点所在的层&#xff0c;逐层从左向右遍历&#xff09; 示例&#xff1a; 给定二叉树 [3…

[vue] vue首页白屏是什么问题引起的?如何解决呢?

[vue] vue首页白屏是什么问题引起的&#xff1f;如何解决呢&#xff1f; 1.打包后文件引用路径不对&#xff0c;导致找不到文件报错白屏 2.路由模式mode设置影响个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家…

一篇极好的 CSS 教程

这是我codeproject上面看到的极好的css教程&#xff0c;今日放上让大家看看&#xff0c;待我明日青岛归来翻译给大家看看。CSS stands for Cascading Style Sheets. This is a simple styling language which allows attaching style to HTML elements. Every element type as …

python增强对比度_python增加图像对比度的方法

python增加图像对比度的方法来源&#xff1a;中文源码网 浏览&#xff1a; 次 日期&#xff1a;2019年11月5日【下载文档: python增加图像对比度的方法.txt 】(友情提示:右键点上行txt文档名->目标另存为)python增加图像对比度的方法本代码实现的是&#xff0c;在旋转…

因缺思厅的绕过

看一下页面源码&#xff0c;看到source.txt。所以进入同目录下的source.txt 代码审计下&#xff0c;并且百度了一些函数。过滤了很多关键字&#xff0c;因此常规的SQL注入没有头绪。想了挺久&#xff0c;因为要满足三个条件。1&#xff1a;不能输入过滤的关键字2&#xff1a;只…

[vue] vue能监听到数组变化的方法有哪些?为什么这些方法能监听到呢?

[vue] vue能监听到数组变化的方法有哪些&#xff1f;为什么这些方法能监听到呢&#xff1f; 你说的是vue内部的源码对Array数据的中转代理嘛 好像对push, shift等通用方法都做了代理吧! 因为它对中转的数据都做了监听个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知…

Python自制微信机器人:群发消息、自动接收好友

运营公众号也有半年了&#xff0c;今年5月份开始的&#xff0c;之前一直用一款windows工具来运营自动接受好友请求、群发文章、自动回复等操作&#xff0c;但颇有不便。 举几个场景&#xff1a; 突然在外面看到一篇文章很好&#xff0c;临时写了一篇&#xff0c;想群发一下。好…

61条面向对象设计的经验原则

你不必严格遵守这些原则&#xff0c;违背它们也不会被处以宗教刑罚。但你应当把这些原则看成警铃&#xff0c;若违背了其中的一条&#xff0c;那么警铃就会响起。 -----Arthur J.Riel (1)所有数据都应该隐藏在所在的类的内部。p13 (2)类的使用者必须依赖类的共有接口&#xff0…

gesturedetector.java_我的flutter代码中的GestureDetector不起作用

我正在玩flip_card package(这个软件包会创建一张卡片&#xff0c;当你点击它时&#xff0c;它会翻转卡片并显示卡片的正面或背面) . 我想要做的是&#xff0c;每次点击卡片时显示不同的图像&#xff0c;并且卡片翻转到正面 .为此&#xff0c;我将flip_card example修改为有状态…

[vue] vue打包成最终的文件有哪些?

[vue] vue打包成最终的文件有哪些&#xff1f; vendor.js, app.js, app.css, 1.xxx.js 2.xxx.js如果有设置到单独提取css的话 还有 1.xxx.css ......个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 …

IronPython资料

Python文档&#xff1a;http://blog.csdn.net/ccat/category/9998.aspx A bit more on IronPython&#xff1a;http://blogs.msdn.com/aaronmar/archive/2006/02/16/a-bit-more-on-ironpython.aspx Python 2.5 中文Tutorial http://wiki.woodpecker.org.cn/moin/March_Liu/PyT…

记一次webpack4+react+antd项目优化打包文件体积的过程

背景 最近自己整了一个基于webpack4和react开发的博客demo项目&#xff0c;一路整下来磕磕碰碰但也实现了功能&#xff0c;就准备发到阿里云上面去看看&#xff0c;借用了同事的阿里云小水管服务器&#xff0c;配置完成之后首页加载花了十几秒&#xff0c;打开控制台network查看…

java hashedmap_Java基础 - Map接口的实现类 : HashedMap / LinkedHashMap /TreeMap 的构造/修改/遍历/ 集合视图方法/双向迭代输出...

import java.util.*;/**一:Collection接口的* Map接口: HashMap(主要实现类) : HashedMap / LinkedHashMap /TreeMap* Map接口:对, 重复的键会进行值得覆盖 ,输出顺序和放入顺序是不一定可以保持顺序的!* 修改查询操作: 1.put(key, value), 2.remove(key) 3.putAll(其他map), 复…

[vue] vue如何优化首页的加载速度?

[vue] vue如何优化首页的加载速度&#xff1f; 补充下2楼&#xff1a; ssr直出&#xff0c; webpack压缩HTML/CSS/JS&#xff0c; 首屏css单独提取内联&#xff0c; 关键资源Proload&#xff0c; 图片&#xff1a;不缩放&#xff0c;使用webp、小图片base64&#xff0c;iconfo…

25岁了

忙了一天&#xff0c;在下午收到kk的email才想起来今天是自己的生日&#xff0c;应该请大家吃蛋糕的。想想这一年过得真快&#xff0c;2006这几个数字我还没有写惯&#xff0c;就要开始写2007了。时光如梭&#xff0c;一点都不假。 25岁啰&#xff0c;转眼间自己怎么就这把年纪…

java同时满足语句_关于控制语句,下列哪些说法符合《阿里巴巴Java开发手册》:...

案例分析一&#xff1a;假定CPU的主频是500MHz。硬盘采用DMA方式进行数据传送&#xff0c;其数据传输率为4MB/s, 每次DMA传输的数据量为8KB, 要求没有任何数据传输被错过。如果CPU在DMA初始化设置和启动硬盘操作等方面用了1000个时钟周期&#xff0c;并且在DMA传送完成后的中断…