微信小程序通过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 CSS修改学习第五章 给“上传”添加样式
Feb 19 Javascript
javascript学习(一)构建自己的JS库
Jan 02 Javascript
当前页禁止复制粘贴截屏代码小集
Jul 24 Javascript
js document.write()使用介绍
Feb 21 Javascript
浅谈JavaScript数据类型及转换
Feb 28 Javascript
javascript js 操作数组 增删改查的简单实现
Jun 20 Javascript
微信小程序 Canvas增强组件实例详解及源码分享
Jan 04 Javascript
ionic grid(栅格)九宫格制作详解
Jun 30 Javascript
微信小程序MUI侧滑导航菜单示例(Popup弹出式,左侧不动,右侧滑动)
Jan 23 Javascript
angular6根据environments配置文件更改开发所需要的环境的方法
Mar 06 Javascript
Js和VUE实现跑马灯效果
May 25 Javascript
TS 类型兼容教程示例详解
Sep 23 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
用Socket发送电子邮件
2006/10/09 PHP
php 字符转义 注意事项
2009/05/27 PHP
php smarty模版引擎中的缓存应用
2009/12/11 PHP
php防止sql注入示例分析和几种常见攻击正则表达式
2014/01/12 PHP
php 获取文件行数的方法总结
2016/10/11 PHP
laravel框架数据库配置及操作数据库示例
2019/10/10 PHP
Javascript 调试利器 Firebug使用详解六
2009/07/05 Javascript
JavaScript 三种不同位置代码的写法
2009/10/25 Javascript
JavaScript toFixed() 方法
2010/04/15 Javascript
Colortip基于jquery的信息提示框插件在IE6下面的显示问题修正方法
2010/12/06 Javascript
火狐下table中创建form导致两个table之间出现空白
2013/09/02 Javascript
关于JavaScript作用域你想知道的一切
2016/02/04 Javascript
详解JavaScript权威指南之对象
2016/09/27 Javascript
基于JS实现仿百度百家主页的轮播图效果
2017/03/06 Javascript
微信小程序switch开关选择器使用详解
2018/01/31 Javascript
vue.js获得当前元素的文字信息方法
2018/03/09 Javascript
简单学习5种处理Vue.js异常的方法
2019/06/17 Javascript
element-ui封装一个Table模板组件的示例
2021/01/04 Javascript
Python批量按比例缩小图片脚本分享
2015/05/21 Python
2018年Python值得关注的开源库、工具和开发者(总结篇)
2018/01/04 Python
Python内置函数locals和globals对比
2020/04/28 Python
python线程池如何使用
2020/05/28 Python
戴森美国官网:Dyson美国
2016/09/11 全球购物
联想韩国官网:Lenovo Korea
2018/05/10 全球购物
Servlet如何得到客户端机器的信息
2014/10/17 面试题
国际商务系学生个人的自我评价
2013/11/26 职场文书
电子商务专员岗位职责
2013/12/11 职场文书
财务负责人任命书
2014/06/06 职场文书
群众路线教育实践活动个人对照检查材料思想汇报(社区班子)
2014/10/06 职场文书
预备党员半年考察意见
2015/06/01 职场文书
高中班主任培训心得体会
2016/01/07 职场文书
2016优秀班主任个人先进事迹材料
2016/02/26 职场文书
CSS 实现Chrome标签栏的技巧
2021/08/04 HTML / CSS
一起来学习Python的元组和列表
2022/03/13 Python
docker-compose部署Yapi的方法
2022/04/08 Servers
Django框架模板用法详解
2022/06/10 Python