微信小程序通过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 相关文章推荐
top.location.href 没有权限 解决方法
Aug 05 Javascript
关于可运行代码无法正常执行的使用说明
May 13 Javascript
JS调用CS里的带参方法实例
Aug 01 Javascript
js AppendChild与insertBefore用法详细对比
Dec 16 Javascript
jQuery Ajax()方法使用指南
Nov 19 Javascript
jQuery老黄历完整实现方法
Jan 16 Javascript
jQuery控制cookie过期时间的方法
Apr 07 Javascript
谈谈Jquery中的children find 的区别有哪些
Oct 19 Javascript
Jquery给当前页或者跳转后页面的导航栏添加选中后样式的实例
Dec 08 Javascript
AngularJS中重新加载当前路由页面的方法
Mar 09 Javascript
对angularJs中2种自定义服务的实例讲解
Sep 30 Javascript
uin-app+mockjs实现本地数据模拟
Aug 26 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
Zend Framework教程之分发器Zend_Controller_Dispatcher用法详解
2016/03/07 PHP
PHP使用GD库输出汉字的方法【测试可用】
2016/11/10 PHP
40个新鲜出炉的jQuery 插件和免费教程[上]
2012/07/24 Javascript
jquery实现点击TreeView文本父节点展开/折叠子节点
2013/01/10 Javascript
键盘上一张下一张兼容IE/google/firefox等浏览器
2014/01/28 Javascript
javascript实现的一个带下拉框功能的文本框
2014/05/08 Javascript
jQuery中:visible选择器用法实例
2014/12/30 Javascript
jQuery EasyUi实战教程之布局篇
2016/01/26 Javascript
js实现的简单图片浮动效果完整实例
2016/05/10 Javascript
微信小程序-小说阅读小程序实例(demo)
2017/01/12 Javascript
jquery中绑定事件的异同
2017/02/28 Javascript
js判断是否是手机页面
2017/03/17 Javascript
js 监控iframe URL的变化实例代码
2017/07/12 Javascript
JS实现图片手风琴效果
2020/04/17 Javascript
详解Vue路由自动注入实践
2019/04/17 Javascript
基于vue-cli搭建多模块且各模块独立打包的项目
2019/06/12 Javascript
JavaScript中的null和undefined用法解析
2019/09/30 Javascript
使用Webpack提升Vue.js应用程序的4种方法(翻译)
2019/10/09 Javascript
原生javascript制作贪吃蛇小游戏的方法分析
2020/02/26 Javascript
vue或react项目生产环境去掉console.log的操作
2020/09/02 Javascript
关于vue的列表图片选中打钩操作
2020/09/09 Javascript
vue-router定义元信息meta操作
2020/12/07 Vue.js
[06:40]2014DOTA2西雅图国际邀请赛 DK战队巡礼
2014/07/07 DOTA
[49:05]OG vs Newbee 2019DOTA2国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
通过数据库向Django模型添加字段的示例
2015/07/21 Python
pandas groupby 分组取每组的前几行记录方法
2018/04/20 Python
Python 查找list中的某个元素的所有的下标方法
2018/06/27 Python
python os.path.isfile 的使用误区详解
2019/11/29 Python
实现Python与STM32通信方式
2019/12/18 Python
python字符串常用方法及文件简单读写的操作方法
2020/03/04 Python
J2SDK1.5与J2SDK5.0有什么区别
2012/09/19 面试题
大学自主招生自荐信
2013/12/16 职场文书
《桃花心木》教学反思
2014/02/17 职场文书
教师听课学习心得体会
2016/01/15 职场文书
python3实现常见的排序算法(示例代码)
2021/07/04 Python
2022微信温控新功能上线
2022/05/09 数码科技