微信小程序通过js实现瀑布流布局详解


Posted in Javascript onAugust 28, 2019

前言

瀑布流 - 小程序中数据列表或者图片展示难免高度不一,而我们一般固定宽度,让其高度自适应,并无缝对接。如下图:

微信小程序通过js实现瀑布流布局详解

瀑布流的两种做法:

css:

在父元素上使用column-count: 2也可以做到两列排版。但column-count: 2是左右两列排版,如果碰巧出现左边累计高度过多大于右边累计高度的话,右边会出现大片空白区域。点击前往

js(推荐):

判断左右两边的累计高度,那边的高度小,便往那边添加(需要动态获取节点元素的高度进行计算)。下面用的就是此种方法:

准备工作

我们需要用到 await ,而使用 await 需要在本地配置中开启增强编译。如下图:

微信小程序通过js实现瀑布流布局详解

实现代码

此方法采用左右两列布局,判断两边高度。如果左<右,填充到左边,否则填充到右边
(list不建议一次请求过多数据,过多的数据可能会造成加载慢,可用图片懒加载优化)

test.wxml

<!--pages/test/test.wxml-->
<view class="container">
 <view id="left">
  <view wx:for="{{leftList}}" wx:key>
   <image src="{{item.url}}" mode='widthFix'></image>
   <text>{{item.title}}</text>
  </view>
 </view>
 <view id="right">
  <view wx:for="{{rightList}}" wx:key>
   <image src="{{item.url}}" mode='widthFix'></image>
   <text>{{item.title}}</text>
  </view>
 </view>
</view>

test.wxss

/* pages/test/test.wxss */
#left, #right{
 width: 48%;
 margin: 0 1%;
 float: left;
}
#left image, #right image{
 width: 100%;
}

test.js

//test.js
let leftHeight = 0, rightHeight = 0; //分别定义左右两边的高度
let query;
Page({
 data: {
  list: [{
    title: '1',
    url: 'http://zq.jhcms.cn/attachs/photo/201711/20171130_176CFE51B6710715B1BBBEF2F86ACB0C.jpg',
   }, {
    title: '2',
    url: 'http://img3.imgtn.bdimg.com/it/u=1417732605,3777474040&fm=26&gp=0.jpg',
   },{
    title: '3',
    url: 'http://f10.baidu.com/it/u=121654667,1482133440&fm=72',
   },{
    title: '4',
    url: 'http://img3.imgtn.bdimg.com/it/u=1417732605,3777474040&fm=26&gp=0.jpg',
   },{
    title: '5',
    url: 'http://zq.jhcms.cn/attachs/photo/201711/20171130_9E39DA252E3946BE36218D85876C4AB4.jpg',
   },{
    title: '6',
    url: 'http://img3.imgtn.bdimg.com/it/u=1417732605,3777474040&fm=26&gp=0.jpg',
   },{
    title: '7',
    url: 'http://img3.imgtn.bdimg.com/it/u=1417732605,3777474040&fm=26&gp=0.jpg'
   },{
    title: '8',
    url: 'http://img3.imgtn.bdimg.com/it/u=1417732605,3777474040&fm=26&gp=0.jpg',
   },{
    title: '9',
    url: 'http://f10.baidu.com/it/u=121654667,1482133440&fm=72'
   },{
    title: '7',
    url: 'http://img4.imgtn.bdimg.com/it/u=2748975304,2710656664&fm=26&gp=0.jpg'
   },{
    title: '8',
    url: 'http://img2.imgtn.bdimg.com/it/u=1561660534,130168102&fm=26&gp=0.jpg'
   },{
    title: '9',
    url: 'http://img3.imgtn.bdimg.com/it/u=1417732605,3777474040&fm=26&gp=0.jpg'
   },{
    title: '10',
    url: 'http://zq.jhcms.cn/attachs/photo/201711/20171130_176CFE51B6710715B1BBBEF2F86ACB0C.jpg',
   }],
  leftList: [],
  rightList: []
 },
 onLoad() {
  this.isLeft();
 },
 async isLeft() {
  const { list, leftList, rightList } = this.data;
  query = wx.createSelectorQuery();
  for (const item of list) {
   leftHeight <= rightHeight ? leftList.push(item) : rightList.push(item); //判断两边高度,来觉得添加到那边
   await this.getBoxHeight(leftList, rightList);
  }
 },
 getBoxHeight(leftList, rightList) { //获取左右两边高度
  return new Promise((resolve, reject) => {
   this.setData({ leftList, rightList }, () => {
    query.select('#left').boundingClientRect();
    query.select('#right').boundingClientRect();
    query.exec((res) => {
     leftHeight = res[0].height; //获取左边列表的高度
     rightHeight = res[1].height; //获取右边列表的高度
     resolve();
    });
   });
  })
 }
})

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Extjs4 关于Store的一些操作(加载/回调/添加)
Apr 18 Javascript
基于jquery的文章中所有图片width大小批量设置方法
Aug 01 Javascript
jQuery实现购物车数字加减效果
Mar 14 Javascript
基于jquery实现轮播特效
Apr 22 Javascript
jQuery插件ajaxfileupload.js实现上传文件
Oct 23 Javascript
jQuery如何防止Ajax重复提交
Oct 14 Javascript
原生js实现放大镜效果
Jan 11 Javascript
分析javascript原型及原型链
Mar 18 Javascript
看看“疫苗查询”小程序有温度的代码
Jul 31 Javascript
玩转Koa之核心原理分析
Dec 29 Javascript
jQuery实现手风琴特效
Jan 11 jQuery
JavaScript中展开运算符及应用的实例代码
Jan 14 Javascript
TypeScript类型声明书写详解
Aug 28 #Javascript
vue服务端渲染操作简单入门实例分析
Aug 28 #Javascript
浅谈对于“不用setInterval,用setTimeout”的理解
Aug 28 #Javascript
Vue的编码技巧与规范使用详解
Aug 28 #Javascript
JS开发自己的类库实例分析
Aug 28 #Javascript
详解Vue 换肤方案验证
Aug 28 #Javascript
Vue项目实现换肤功能的一种方案分析
Aug 28 #Javascript
You might like
PHP CKEditor 上传图片实现代码
2009/11/06 PHP
PHP 截取字符串函数整理(支持gb2312和utf-8)
2010/02/16 PHP
php简单对象与数组的转换函数代码(php多层数组和对象的转换)
2011/05/18 PHP
PHP常见错误提示含义解释(实用!值得收藏)
2016/04/25 PHP
php的laravel框架快速集成微信登录的方法
2016/12/12 PHP
PHP自定义函数实现数组比较功能示例
2017/10/19 PHP
php+js实现的无刷新下载文件功能示例
2019/08/23 PHP
通过jquery实现tab标签浏览效果
2007/02/20 Javascript
jQuery 使用手册(一)
2009/09/23 Javascript
treepanel动态加载数据实现代码
2012/12/15 Javascript
js如何获取file控件的完整路径具体实现代码
2013/05/15 Javascript
mvvm双向绑定机制的原理和实现代码(推荐)
2016/06/07 Javascript
漫谈JS引擎的运行机制 你应该知道什么
2016/06/15 Javascript
vue.js+boostrap项目实践(案例详解)
2016/09/21 Javascript
JS实现快速的导航下拉菜单动画效果附源码下载
2016/11/01 Javascript
jQuery实现限制文本框的输入长度
2017/01/11 Javascript
微信小程序tabBar底部导航中文注解api详解
2017/08/16 Javascript
学习使用ExpressJS 4.0中的新Router的用法
2018/11/06 Javascript
详解Js里的for…in和for…of的用法
2019/03/28 Javascript
仿vue-cli搭建属于自己的脚手架的方法步骤
2019/04/17 Javascript
Vue解决移动端弹窗滚动穿透问题
2020/12/15 Vue.js
[02:31]DOTA2帕克 英雄基础教程
2013/11/26 DOTA
python+opencv实现摄像头调用的方法
2019/06/22 Python
Python+Appium实现自动化清理微信僵尸好友的方法
2021/02/04 Python
Zavvi美国:英国娱乐之家
2017/03/19 全球购物
英国最大的美妆产品在线零售商之一:Beauty Bay
2017/09/29 全球购物
以色列的身体护理及家居香薰品牌:Sabon NYC
2018/02/23 全球购物
加拿大时装零售商:Influence U
2018/12/22 全球购物
波兰多品牌运动商店:StreetStyle24.pl
2020/09/22 全球购物
UNIX文件系统分类
2014/11/11 面试题
大学生个人求职信例文
2014/07/07 职场文书
2014年医务科工作总结
2014/12/18 职场文书
五四青年节比赛演讲稿
2015/03/18 职场文书
初中班长竞选稿
2015/11/20 职场文书
教你使用pyinstaller打包Python教程
2021/05/27 Python
MySQL 原理优化之Group By的优化技巧
2022/08/14 MySQL