微信小程序通过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 获取当前时间戳的代码
Aug 05 Javascript
js focus不起作用的解决方法(主要是因为dom元素是否加载完成)
Nov 05 Javascript
JavaScript基础知识之数据类型
Aug 06 Javascript
有效提高JavaScript执行效率的几点知识
Jan 31 Javascript
JavaScript实现横向滑出的多级菜单效果
Oct 09 Javascript
JavaScript跨域调用基于JSON的RESTful API
Jul 09 Javascript
mpvue中配置vuex并持久化到本地Storage图文教程解析
Mar 15 Javascript
在vue中给列表中的奇数行添加class的实现方法
Sep 05 Javascript
浅谈对于“不用setInterval,用setTimeout”的理解
Aug 28 Javascript
深入浅析vue中cross-env的使用
Sep 12 Javascript
vue项目创建步骤及路由router
Jan 14 Javascript
Vue 封装防刷新考试倒计时组件的实现
Jun 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 判断常量,变量和函数是否存在
2009/04/26 PHP
PHP通过串口实现发送短信
2015/07/08 PHP
php基于Snoopy解析网页html的方法
2015/07/09 PHP
PHP设置images目录不充许http访问的方法
2016/11/01 PHP
Zend Framework入门教程之Zend_Db数据库操作详解
2016/12/08 PHP
Mootools 1.2教程 正则表达式
2009/09/15 Javascript
jQuery在IE下使用未闭合的xml代码创建元素时的Bug介绍
2012/01/10 Javascript
jquery插件制作 自增长输入框实现代码
2012/08/17 jQuery
JS刷新当前页面的几种方法总结
2013/12/24 Javascript
jQuery获取checkboxlist的value值的方法
2015/09/27 Javascript
Javascript缓存API
2016/06/14 Javascript
深入浅析JS Function()构造函数
2016/08/22 Javascript
JScript实现表格的简单操作
2017/08/15 Javascript
Angular移动端页面input无法输入的解决方法
2017/11/14 Javascript
AngularJS select加载数据选中默认值的方法
2018/02/28 Javascript
vue.js层叠轮播效果的实例代码
2018/11/08 Javascript
vue-router实现编程式导航的代码实例
2019/01/19 Javascript
VUE搭建手机商城心得和遇到的坑
2019/02/21 Javascript
wxpython 学习笔记 第一天
2009/02/09 Python
python动态监控日志内容的示例
2014/02/16 Python
python实现监控linux性能及进程消耗性能的方法
2014/07/25 Python
Python学习小技巧之列表项的拼接
2017/05/20 Python
python 递归遍历文件夹,并打印满足条件的文件路径实例
2017/08/30 Python
Python使用pyh生成HTML文档的方法示例
2018/03/10 Python
Django 使用Ajax进行前后台交互的示例讲解
2018/05/28 Python
python中文编码与json中文输出问题详解
2018/08/24 Python
ASP.NET Core中的配置详解
2021/02/05 Python
解决pycharm不能自动保存在远程linux中的问题
2021/02/06 Python
HTML5 Geolocation API的正确使用方法
2018/12/04 HTML / CSS
编程用JAVA解析XML的方式
2013/07/07 面试题
机电一体化专业应届生求职信
2013/11/27 职场文书
大学生就业自我推荐信
2014/05/10 职场文书
民主评议党员登记表自我评价
2014/10/20 职场文书
护士年终个人总结
2015/02/13 职场文书
丧事答谢词大全
2015/09/30 职场文书
2016年三八节红领巾广播稿
2015/12/17 职场文书