我的编程空间,编程开发者的网络收藏夹
学习永远不晚

微信小程序瀑布流如何实现

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

微信小程序瀑布流如何实现

本篇内容介绍了“微信小程序瀑布流如何实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

最简单的实现方案,不适用有分页的场景。

这个方案简单的原因是因为仅仅使用了css的属性。 
使用column-count 属性可以指定页面显示的列数,一般瀑布流都是2列,所以可以定义class

.list-masonry {  column-count: 2; //2列  column-gap: 20rpx; //列间距}

界面定义也很简单

<view class='list-masonry'> <block wx:for="{{goodsList}}" wx:key="{{item.id}}"> <template is='goodsCard' data="{{data:item}}" /> </block></view>

其中,goodsList为页面展示的数据,goodsCard为瀑布流的卡片,这个很容易理解。

注意,瀑布流的卡片需要css属性 display: inline-block; 将卡片设置为 内联元素。image 组件设置缩放模式 mode="widthFix" 来保持图片宽高比。

column-count 属性默认是以列的形式来填充数据的。比如我们有20条数据,1 ~ 10 条数据会展示在左边第一列,11 ~ 20 条数据会展示在第二列。 
如果有分页,再往数组中增加20条数据后,就会变成 1 ~ 20 条数据会在左边,21 ~ 40 条数据会展示在右边。用户体验非常差。 
由于 column-fill: balance; 填充属性无效,无法指定填充顺序为行的形式。 
所以这种实现方案只能一下加载完所有数据,不适用于分页。 
Component实现瀑布流,功能强大,滑动流畅

通过自定义组件,用自己的思路实现瀑布流。然后在需要瀑布流的地方直接调用,方便复用。

没有Demo!! 跟着我的步骤一步一步来,就能轻松实现。

  1. 首先创建瀑布流自定义组件文件。

建议在项目根目录创建文件夹component,然后在该目录下创建文件夹WaterFallView,最后在WaterFallView下创建component。(鼠标右键->新建->Component)。


2. 设计瀑布流的wxml。

瀑布流的结构简单,只有左右2列。所以在设计UI的时候,布局很简单。

<view class='fall-container'> <!-- 左边一列 --> <view class='fall-left'> <block wx:for="{{leftList}}" wx:key="{{item.id}}"> <!--瀑布流内容卡片--> <template is='goodsCard' data="{{data:item}}" /> </block> </view> <!--右边一列 --> <view class='fall-right'> <block wx:for="{{rightList}}" wx:key="{{item.id}}"> <!--瀑布流内容卡片--> <template is='goodsCard' data="{{data:item}}" /> </block> </view></view>

左右两边,一边一个View。通过这两个View 来展示瀑布流的两列。每个View对应一个数据源,由此可见,这套思路的重点是这个两个数据源的处理。每个View中的template 为瀑布流中的卡片,就不介绍了。 
超过两列的瀑布流比较少见,本篇不考虑,但可用本篇的思路来实现。

  1. css样式

.fall-container {  width: 100%;  display: flex;}.fall-left {  display: flex;  flex-direction: column;}.fall-right {  display: flex;  flex-direction: column;  margin-left: 20rpx;}
  1. 具体实现逻辑

根据上面的 wxml 结构,这个组件的核心逻辑就是如何把要展示的数据item 放入leftList、rightList这两个数组中。

如何分配数据item?这个简单,我们可以定义2个变量 leftHight、rightHight,来分别记录leftList、rightList数组中图片的高度(可以理解为左边View、右边View的高度,其实只是图片的高度,但已满足瀑布流的的需求)。当leftHight 大于 rightHight时,把数据放入rightList,并让rightHight叠加数据中图片的高度。当rightHight大于 leftHight 时,把数据放入leftList,并让leftHight 叠加数据中图片的高度。

if (leftHight == rightHight) { //第1个item放左边  leftList.push(tmp);  leftHight = leftHight + tmp.itemHeight;} else if (leftHight < rightHight) {  leftList.push(tmp);  leftHight = leftHight + tmp.itemHeight;} else {  rightList.push(tmp);  rightHight = rightHight + tmp.itemHeight;}

瀑布流展示图片的时候,需要知道图片的宽高,然后根据图片的宽高比来设置 image组件的宽高。所以如果你们的数据没有宽高或宽高比,很难实现瀑布流。虽然可以通过代码获得图片宽高,但会对性能以及用户体验有很大影响,不推荐这么做。可以和后台同学商量下,看如何加上宽高数据。

Component有自己生命周期方法,甚至可以象Page一样,当做一个单独的页面使用。可以在他的生命周期方法中获得到瀑布流的宽度,以及图片的最大高度。

attached: function () { //第一个生命周期方法    wx.getSystemInfo({      success: (res) => { let percentage = 750 / res.windowWidth; //750rpx/屏幕宽度 let margin = 20 / percentage; //计算瀑布流间距        itemWidth = (res.windowWidth - margin) / 2; //计算 瀑布流展示的宽度        maxHeight = itemWidth / 0.8 //计算瀑布流的最大高度,防止长图霸屏 } }); },

拿到瀑布流的宽度后,就可以根据图片的宽高比,计算出 image 组件的宽高。

let tmp = listData[i]; //单条数据tmp.width = parseInt(tmp.width); //图片宽度tmp.height = parseInt(tmp.height); //图片高度tmp.itemWidth = itemWidth    //image 宽度let per = tmp.width / tmp.itemWidth; //图片宽高比tmp.itemHeight = tmp.height / per; //image 高度if (tmp.itemHeight > maxHeight) {    tmp.itemHeight = maxHeight; //image 高度,不超过最大高度}

在template中,image的宽高需要声明下。单位是px,不是rpx

 <image  class='card-img'  mode='aspectFill'  style='width:{{data.itemWidth}}px;height:{{data.itemHeight}}px;'  class="lazy" data-src='{{data.img}}'  lazy-load></image>
  1. 所有JS代码

var leftList = new Array();//左侧集合var rightList = new Array();//右侧集合var leftHight = 0, rightHight = 0, itemWidth = 0, maxHeight = 0;Component({  properties: {},  data: {    leftList: [],//左侧集合    rightList: [],//右侧集合 },  attached: function () {    wx.getSystemInfo({      success: (res) => { let percentage = 750 / res.windowWidth; let margin = 20 / percentage;        itemWidth = (res.windowWidth - margin) / 2;        maxHeight = itemWidth / 0.8 } }); },  methods: {     fillData: function (isPull, listData) { if (isPull) { //是否下拉刷新,是的话清除之前的数据        leftList.length = 0;        rightList.length = 0;        leftHight = 0;        rightHight = 0; } for (let i = 0, len = listData.length; i < len; i++) { let tmp = listData[i];        tmp.width = parseInt(tmp.width);        tmp.height = parseInt(tmp.height);        tmp.itemWidth = itemWidth let per = tmp.width / tmp.itemWidth;        tmp.itemHeight = tmp.height / per; if (tmp.itemHeight > maxHeight) {          tmp.itemHeight = maxHeight; } if (leftHight == rightHight) {          leftList.push(tmp);          leftHight = leftHight + tmp.itemHeight; } else if (leftHight < rightHight) {          leftList.push(tmp);          leftHight = leftHight + tmp.itemHeight; } else {          rightList.push(tmp);          rightHight = rightHight + tmp.itemHeight; } } this.setData({        leftList: leftList,        rightList: rightList, }); }, }})
  1. 使用瀑布流

a. 注册自定义组件 
在使用自定义组件的Page的json文件中声明要使用的组件

{ .... "usingComponents": { "waterFallView": "../../component/WaterFallView/WaterFallView" }}

b. 在 wxml 中添加组件,并加上 id

<waterFallView id='waterFallView'></waterFallView>c. 在JS中找到组件,并调用fillData() 方法。下拉刷新时 isFull 传 true。  fillData: function (isFull,goods){    let view = this.selectComponent('#waterFallView');    view.fillData(isFull, goods);  },

“微信小程序瀑布流如何实现”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

微信小程序瀑布流如何实现

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

微信小程序瀑布流如何实现

本篇内容介绍了“微信小程序瀑布流如何实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!最简单的实现方案,不适用有分页的场景。这个方案简单的原
2023-06-26

小程序中怎么实现瀑布流布局

这篇文章将为大家详细讲解有关小程序中怎么实现瀑布流布局,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。widthFix:宽度不变,高度自动变化,保持原图宽高比不变。配合column-count
2023-06-19

Django瀑布流如何实现

这篇文章主要介绍“Django瀑布流如何实现”,在日常操作中,相信很多人在Django瀑布流如何实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Django瀑布流如何实现”的疑惑有所帮助!接下来,请跟着小编
2023-07-05

如何发布微信小程序

今天小编给大家分享一下如何发布微信小程序的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。小程序的功能实现之后,经过一段时间地测
2023-06-19

微信小程序如何发布

这篇文章给大家分享的是有关微信小程序如何发布的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。  一、微信小程序发布需要准备哪些材料资质工具?  【注意】目前个人和组织都可以注册微信小程序了,如何不明白个人怎么注册小
2023-06-26

如何用js实现瀑布流布局

这篇“如何用js实现瀑布流布局”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何用js实现瀑布流布局”文章吧。一、前端代码编
2023-07-05

纯css如何实现瀑布流

这篇文章主要介绍了纯css如何实现瀑布流,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.multi-column多列布局实现瀑布流先简单的讲下multi-column相关的
2023-06-08

微信小程序中如何实现微信支付

微信支付是微信公众平台提供的一种在线支付服务,可以为用户提供快速、方便、安全的支付体验。而在微信小程序中实现微信支付,则可以为应用程序提供更多的功能和服务,提高用户体验和商业价值。因此,在本文中,我们将介绍如何在微信小程序中实现微信支付。
2023-08-16

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录