微信小程序通过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 相关文章推荐
简单的JS多重继承示例
Mar 13 Javascript
Google排名中的10个最著名的 JavaScript库
Apr 27 Javascript
JQuery里面的几种选择器 查找满足条件的元素$(&quot;#控件ID&quot;)
Aug 23 Javascript
JS跨域请求外部服务器的资源
Feb 06 Javascript
详解vue.js+UEditor集成 [前后端分离项目]
Jul 07 Javascript
canvas+gif.js打造自己的数字雨头像的示例代码
Oct 26 Javascript
jquery写出PC端轮播图实例
Jan 26 jQuery
Vue render深入开发讲解
Apr 13 Javascript
vue webpack打包后图片路径错误的完美解决方法
Dec 07 Javascript
JavaScript两种计时器的实例讲解
Jan 31 Javascript
深入了解JavaScript 私有化
May 30 Javascript
微信小程序如何通过用户授权获取手机号(getPhoneNumber)
Jan 21 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来写记数器(详细介绍)
2006/10/09 PHP
ThinkPHP框架实现session跨域问题的解决方法
2014/07/01 PHP
使用纯php代码实现页面伪静态的方法
2015/07/25 PHP
Document 对象的常用方法
2009/07/31 Javascript
Extjs EditorGridPanel中ComboBox列的显示问题
2011/07/04 Javascript
使用Js让Html中特殊字符不被转义
2013/11/05 Javascript
javascript简单性能问题及学习笔记
2014/02/04 Javascript
nodejs中操作mysql数据库示例
2014/12/20 NodeJs
JQuery DIV 动态隐藏和显示的方法
2016/06/23 Javascript
正则表达式,替换所有HTML标签的简单实例
2016/11/28 Javascript
Webpack打包慢问题的完美解决方法
2017/03/16 Javascript
Angular2 之 路由与导航详细介绍
2017/05/26 Javascript
vue.js移动端tab组件的封装实践实例
2017/06/30 Javascript
Vue组件全局注册实现警告框的实例详解
2018/06/11 Javascript
使用Vue.js中的过滤器实现幂方求值的方法
2019/08/27 Javascript
vue框架制作购物车小球动画效果实例代码
2019/09/26 Javascript
Python的ORM框架SQLAlchemy入门教程
2014/04/28 Python
Python网络爬虫与信息提取(实例讲解)
2017/08/29 Python
Python实现的选择排序算法原理与用法实例分析
2017/11/22 Python
使用Python爬取最好大学网大学排名
2018/02/24 Python
Python抽象和自定义类定义与用法示例
2018/08/23 Python
python实现将文件夹内的每张图片批量分割成多张
2019/07/22 Python
浅谈pycharm使用及设置方法
2019/09/09 Python
Html5调用手机摄像头并实现人脸识别的实现
2018/12/21 HTML / CSS
性能服装:HYLETE
2018/08/14 全球购物
英国书籍、CD、DVD和游戏的第一道德零售商:Awesome Books
2020/02/22 全球购物
捷克多品牌在线时尚商店:ANSWEAR.cz
2020/10/03 全球购物
ORACLE第二个十问
2013/12/14 面试题
建龙钢铁面试总结
2014/04/15 面试题
《纸船和风筝》教学反思
2014/02/15 职场文书
给校长的建议书400字
2014/05/15 职场文书
2015政治思想表现评语
2015/03/25 职场文书
2015年度高中教师工作总结
2015/05/26 职场文书
春节慰问简报
2015/07/21 职场文书
python 解决微分方程的操作(数值解法)
2021/05/26 Python
MySQL 主从复制数据不一致的解决方法
2022/03/18 MySQL