小程序实现无限瀑布流

实现瀑布流

实现效果

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…

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

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

因缺思厅的绕过

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

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

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

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

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

[19/03/16-星期六] 常用类_Date时间类DateFormat类

一、Date时间类 计算机中 以1970 年 1 月 1 日 00:00:00定为基准时间&#xff0c;每个度量单位是毫秒(1秒的千分之一) 用ong类型的变量来表示时间&#xff0c;如当前时刻数值&#xff1a;long now new System.currentTimeMillis(); 【常用方法】 1. Date() 分配一个Date对象&a…

实验一作业

Part1&#xff1a;实验总结体会 1.实验过程对程序编码的使用不熟练&#xff0c;经常在书写代码过程中有停顿与疑惑&#xff0c;但熟能生巧&#xff0c;经过训练还是有不少收获&#xff1b; 2.实验内容不够严谨&#xff0c;容易犯小错误&#xff0c;还是需要勤加练习&#xff1b…

php7引用计数,PHP7 引用计数 读书笔记

PHP7 引用计数 读书笔记每个 PHP 变量存在一个加 "zval" 的变量容器中. 一个 zval 变量容器, 除了包含变量的类型和值, 还包括两个字节的额外信息.1.is_ref : 是一个 bool 值, 用来标识这个变量是否属于引用集合. 通过这个字节, PHP 引擎才能把普通变量和引用变量区分…

焦呼?焦矣!

焦了。做了个香蕉蛋糕。总觉得它还没熟&#xff0c;就让它没完没了地烤着。于是焦了。可里面居然还是湿润的。是蛋糕的问题&#xff0c;还是6寸模的问题&#xff0c;还只是人的问题&#xff1f;烤一半时&#xff0c;爹临出门时&#xff0c;过来往上头按了一大拇指。很好&#x…

AJAX(2),我的第一个AJAX程序

首先&#xff0c;在VS2005中新建一个网站&#xff0c;拖入一个Button和Text,设置Button的客户端事件为userCheck(),<asp:TextBox ID"username"runat"server"></asp:TextBox><input type"button"name"check"value"…

[导入]ASP.NET 2.0中Page事件的执行顺序

文章来源:http://blog.csdn.net/21aspnet/archive/2007/03/20/1535517.aspx 转载于:https://www.cnblogs.com/zhaoxiaoyang2/archive/2007/03/21/816354.html

[导入]C#中TextBox只能输入数字的代码

文章来源:http://blog.csdn.net/21aspnet/archive/2007/03/20/1535640.aspx 转载于:https://www.cnblogs.com/zhaoxiaoyang2/archive/2007/03/21/816242.html

实验1c语言开发环境使用和数据类型、运算符和表达式

实验结论 由于这一次是第一次做实验有很多东西不熟悉 比如忘记加分号&#xff0c;用中文输入法打不对符号等等。总之经过这实验我学到了很多。#include <stdio.h> int main() {int x;printf("输入一个整数: \n");scanf("%d",&x);// 在处填写相应…

Nhibernate学习起步之many-to-one篇(转)

1. 学习目的: 通过进一步学习nhibernate基础知识&#xff0c;在实现单表CRUD的基础上&#xff0c;实现两表之间one-to-many的关系. 2. 开发环境必要准备 开发环境: windows 2003,Visual studio .Net 2005,Sql server 2005 developer edition 必要准备: 学习上篇文章单…

关于如何清除某个特定网站的缓存---基于Chrome浏览器

1、清除浏览器缓存 直接在浏览器设置里面清除浏览器的缓存会清除所有网站的缓存信息&#xff0c;这在某些时候是非常不方便的&#xff0c;毕竟不只有测试网站&#xff0c;还会有一些我们不想清除的信息也会被清除掉&#xff1b; 2、通过F12功能去清除浏览器缓存 转载于:https:/…

php中for循环流程图,PHP for循环

PHP for循环可以用来遍历一组指定的次数的代码。如果迭代次数已知&#xff0c;则应优先考虑使用for循环&#xff0c;否则使用while循环。for循环的语法for(initialization; condition; increment/decrement){ //code to be executed }for循环流程图示例代码-<?php for($n1;…

Spring中AOP切面编程学习笔记

注解方式实现aop我们主要分为如下几个步骤&#xff1a;  1.在切面类&#xff08;为切点服务的类&#xff09;前用Aspect注释修饰&#xff0c;声明为一个切面类。  2.用Pointcut注释声明一个切点&#xff0c;目的是为了告诉切面&#xff0c;谁是它的服务对象。&#xff08;此…

SpringCloud的学习记录(1)

最近一段时间重新学习一边SpringCloud&#xff0c;这里简单记录一下。 我用的是IntelliJ IDEA开发工具, SpringBoot的版本是2.1.3.RELEASE。 1. 构建Maven项目 整个的SpringCloud的项目是在Maven项目中的&#xff0c;这个Maven只做容纳其他项目使用, 比如后面Fegin/Config/Zipk…

html5 拖拽上传文件时,屏蔽浏览器默认打开文件

参考&#xff1a; https://www.cnblogs.com/kingsm/p/9849339.html 转载于:https://www.cnblogs.com/cwxwdm/p/10605529.html

php求数组交集的自定义函数,php数组交集函数

在数学中的交集运算&#xff0c;大家在学习的时候还是比较轻松的。我们在php数组里&#xff0c;可以借助array_intersect()函数对两个数组求交集&#xff0c;最后得到一个想要的交集数据。在正式开始array_intersect()使用前&#xff0c;我们需要先对函数的概念、语法、参数、返…