欢迎来到258分享网,纯净的网络源码分享基地!

258资源分享网

全部作品
全部作品
网站源码
微信源码
素材特效
源码插件
视频教程
建站学院
热门搜索: 织梦  农业种植  农业  安全设置  官方
258资源分享 > 建站学院 > 微信开发 > 微信小程序瀑布流最好最简单的解决方案

推荐下载

HTML5响应式自适应网咯设计

2020-05-12   浏览:740

高端HTML5响应式企业通用网

2020-05-06   浏览:521

html5响应式外贸网站英文版

2020-05-08   浏览:510

HTML5自适应律师工作室类网

2020-04-04   浏览:504

HTML5影视传媒文化公司类网

2020-05-12   浏览:501

微信小程序瀑布流最好最简单的解决方案

发布时间:2020-10-19  

网上能搜到的小程序瀑布流解决方案,要么代码复杂、逻辑混乱,要么实现不了业务功能,所以把我在项目中的实现方案给大家分享下。

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

这个方案简单的原因是因为仅仅使用了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!! 跟着我的步骤一步一步来,就能轻松实现。

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

建议在项目根目录创建文件夹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 为瀑布流中的卡片,就不介绍了。 
超过两列的瀑布流比较少见,本篇不考虑,但可用本篇的思路来实现。

css样式

.fall-container { width: 100%; display: flex; } .fall-left { display: flex; flex-direction: column; } .fall-right { display: flex; flex-direction: column; margin-left: 20rpx; }

具体实现逻辑

根据上面的 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组件的宽高。所以如果你们的数据没有宽高或宽高比,很难实现瀑布流。虽然可以通过代码获得图片宽高,但会对性能以及用户体验有很大影响,不推荐这么做。可以和后台同学商量下,看如何加上宽高数据。