微信小程序通过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 相关文章推荐
javascript 常用功能总结
Mar 18 Javascript
JavaScript起点(严格模式深度了解)
Jan 28 Javascript
JS小游戏之仙剑翻牌源码详解
Sep 25 Javascript
JavaScript日期时间与时间戳的转换函数分享
Jan 31 Javascript
利用jquery实现瀑布流3种案例
Sep 18 Javascript
微信开发 js实现tabs选项卡效果
Oct 28 Javascript
基于vue实现多引擎搜索及关键字提示
Mar 16 Javascript
JavaScript数据结构之二叉查找树的定义与表示方法
Apr 12 Javascript
详解Vue单元测试Karma+Mocha学习笔记
Jan 31 Javascript
详解如何从零开始搭建Express+Vue开发环境
Jul 17 Javascript
js实现经典贪吃蛇小游戏
Mar 19 Javascript
JavaScript WeakMap使用详解
Feb 05 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版)
2012/08/21 PHP
php全排列递归算法代码
2012/10/09 PHP
几道坑人的PHP面试题 试试看看你会不会也中招
2014/08/19 PHP
浅析php设计模式之数据对象映射模式
2016/03/03 PHP
PHP编写登录验证码功能 附调用方法
2016/05/19 PHP
php实现跨域提交form表单的方法【2种方法】
2016/10/17 PHP
PHP中for循环与foreach的区别
2017/03/06 PHP
JavaScript中的几个关键概念的理解-原型链的构建
2011/05/12 Javascript
15款优秀的jQuery导航菜单插件分享
2011/07/19 Javascript
jQuery中:gt选择器用法实例
2014/12/29 Javascript
Bootstrap树形控件使用方法详解
2016/01/27 Javascript
整理JavaScript对DOM中各种类型的元素的常用操作
2016/05/05 Javascript
微信小程序 获取设备信息 API实例详解
2016/10/02 Javascript
Javascript中click与blur事件的顺序详析
2017/04/25 Javascript
详解Node.js串行化流程控制
2017/05/04 Javascript
JS解析url查询参数的简单代码
2017/08/06 Javascript
vue组件Prop传递数据的实现示例
2017/08/17 Javascript
DVA框架统一处理所有页面的loading状态
2017/08/25 Javascript
非常漂亮的js烟花效果
2020/03/10 Javascript
JavaScript Window浏览器对象模型原理解析
2020/05/30 Javascript
vue 里面的 $forceUpdate() 强制实例重新渲染操作
2020/09/21 Javascript
python处理cookie详解
2014/02/07 Python
Python爬虫框架scrapy实现的文件下载功能示例
2018/08/04 Python
对Python 除法负数取商的取整方式详解
2018/12/12 Python
Opencv实现抠图背景图替换功能
2019/05/21 Python
python3+selenium获取页面加载的所有静态资源文件链接操作
2020/05/04 Python
OnePlus加拿大官网:中国国际化手机品牌
2020/10/13 全球购物
C#笔试题
2015/07/14 面试题
线程同步的方法
2016/11/23 面试题
新闻专业个人自我评价
2013/09/21 职场文书
财务管理专业应届毕业生求职信
2013/09/22 职场文书
房地产管理毕业生自荐信
2013/11/04 职场文书
迟到检讨书500字
2014/02/05 职场文书
领导干部遵守党的政治纪律情况思想汇报
2014/09/14 职场文书
教师岗位说明书
2015/09/30 职场文书
Python万能模板案例之matplotlib绘制甘特图
2022/04/13 Python