微信小程序通过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 相关文章推荐
Extjs中DisplayField的日期或者数字格式化扩展
Sep 03 Javascript
jQuery搜索框效果实现代码(百度关键词联想)
Feb 25 Javascript
微信小程序 网络API发起请求详解
Nov 09 Javascript
浅谈angularjs $http提交数据探索
Jan 20 Javascript
AngularJS表格样式简单设置方法示例
Mar 03 Javascript
Bootstrap缩略图的创建方法
Mar 22 Javascript
Ionic2调用本地SQlite实例
Apr 22 Javascript
AngularJS 仿微信图片手势缩放的实例
Sep 28 Javascript
axios全局注册,设置token,以及全局设置url请求网段的方法
Sep 25 Javascript
layui 富文本赋值,取值,取纯文本值的实例
Sep 18 Javascript
Vue插件之滑动验证码
Sep 21 Javascript
js操作两个json数组合并、去重,以及删除某一项元素
Sep 22 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 spl_autoload_register实现自动加载研究
2011/12/06 PHP
php检测网页是否被百度收录的函数代码
2013/10/09 PHP
php实现图片文件与下载文件防盗链的方法
2014/11/03 PHP
PHP使用mysql与mysqli连接Mysql数据库用法示例
2016/07/07 PHP
php使用curl伪造来源ip和refer的方法示例
2018/05/08 PHP
js 动态文字滚动的例子
2011/01/17 Javascript
DB.ASP 用Javascript写ASP很灵活很好用很easy
2011/07/31 Javascript
JavaScript中创建类/对象的几种方法总结
2013/11/29 Javascript
Js表格万条数据瞬间加载实现代码
2014/02/20 Javascript
jQuery过滤选择器:not()方法使用介绍
2014/04/20 Javascript
JS生成随机字符串的多种方法
2014/06/10 Javascript
SeaJS 与 RequireJS 的差异对比
2014/12/08 Javascript
有效提高JavaScript执行效率的几点知识
2015/01/31 Javascript
JavaScript iframe数据共享接口实现方法
2016/01/06 Javascript
JavaScript登录验证码的实现
2016/10/27 Javascript
对angularJs中$sce服务安全显示html文本的实例
2018/09/30 Javascript
JS实现简单的文字无缝上下滚动功能示例
2019/06/22 Javascript
从零搭一个自用的前端脚手架的方法步骤
2019/09/23 Javascript
Python 变量类型及命名规则介绍
2013/06/08 Python
Python编写检测数据库SA用户的方法
2014/07/11 Python
Python实现二分查找与bisect模块详解
2017/01/13 Python
python实现二维插值的三维显示
2018/12/17 Python
浅谈keras中的后端backend及其相关函数(K.prod,K.cast)
2020/06/29 Python
Python建造者模式案例运行原理解析
2020/06/29 Python
python如何遍历指定路径下所有文件(按按照时间区间检索)
2020/09/14 Python
python温度转换华氏温度实现代码
2020/12/06 Python
利用CSS3实现文字折纸效果实例代码
2018/07/10 HTML / CSS
中国跨境海淘网站:考拉海购
2016/08/01 全球购物
美国婴儿和儿童家具网上商店:ABaby.com
2018/07/02 全球购物
Notino希腊:购买香水和美容产品
2019/07/25 全球购物
《蓝色的树叶》教学反思
2014/02/24 职场文书
《最大的麦穗》教学反思
2014/04/17 职场文书
十佳好少年事迹材料
2014/08/21 职场文书
六一儿童节新闻稿
2015/07/17 职场文书
获奖感言一句话
2015/07/31 职场文书
opencv读取视频并保存图像的方法
2021/06/04 Python