美文网首页mpvue
微信小程序实现瀑布流布局

微信小程序实现瀑布流布局

作者: 没有故事的男童鞋 | 来源:发表于2019-03-18 11:33 被阅读0次

小程序实现瀑布流

近期在做APP转成小程序的相关开发,需将APP里面的部分页面抽离出来,做成小程序。
其中有个页面是瀑布流(参差不齐的多栏布局)的形式。
Android客户端一般是通过RecyclerView的方式来进行实现,但在小程序中并没有类似的控件,所以我们只有通过自己的改编来进行实现。特此记录!

  • 实现效果如图
index.png

一:需求分析

  • 页面主要分成两列,每个条目的高度不固定,条目主要由封面图+标题+头像+发布者昵称组成

  • 多列排列要求,第一条在左侧,第二条在右侧,后续的根据左右两栏的高度,依次放置在高度较低的一侧。

二:技术实现思路

  • 1、将整个页面分成左右两栏,两侧各对应一个数据集。

  • 2、定义变量,记录左右两侧的累计高度,然后依次将条目放置在高度较低的一侧。从而我们可以得到左右两侧的数据集,后续只需要进行页面的渲染就行了;

  • 3、图片高度的确定,单个条目中图片宽度=(单列条目宽度/图片的原始宽度)*图片原始高度;

三:思路有了,接下来就是开始编写代码了

  • 1、编写布局,将整个页面分成两栏xml代码如下

    <view class='content'>
    <view class='left'>
      <block wx:for="{{leftList}}" wx:key="index">
        <image class='pic' style='height:{{item.CoverHeight}}' src='{{item.Cover}}'></image>
      </block>
    </view>
    <view class='right'>
      <block wx:for="{{rightList}}" wx:key="index">
        <image class='pic' style='height:{{item.CoverHeight}}' src='{{item.Cover}}'></image>
      </block>
    </view>
    </view>
    
  • 2、编写样式代码如下

    page{
      width: 100%;
      margin: 0;
      background: #F2F2F2;
    }
    .content{
      display: flex;
      flex-direction: row;
      margin: 20rpx;
      overflow: hidden;
    }
    
    .left{
      width: 345rpx;
    }
    
    .right{
      width: 345rpx;
      margin-left: 20rpx;
    }
    
    .pic{
      border-radius: 10rpx;
      width: 345rpx;
    }
    
  • js代码如下:

    Page({
    
    /**
     * 页面的初始数据
     */
    data: {
    
      noramalData: [{
          "Cover": "http://dashus.oss-cn-shenzhen.aliyuncs.com/DefaultImage/Game/20190306144842/1001.png",
          "CoverHeight": 467,
          "CoverWidth": 350
        },
        {
          "Cover": "http://dashus.oss-cn-shenzhen.aliyuncs.com/DefaultImage/Game/20190313090409/完美9.png",
          "CoverHeight": 871,
          "CoverWidth": 672
        }
      ],
    
      leftList: [],
      rightList: [],
      leftHight: 0,
      rightHight: 0
    },
      //以本地数据为例,实际开发中数据整理以及加载更多等实现逻辑可根据实际需求进行实现   
    onLoad: function(options) {
      var that = this;
      var allData = that.data.noramalData;
      //定义两个临时的变量来记录左右两栏的高度,避免频繁调用setData方法
      var leftH = that.data.leftHight;
      var rightH = that.data.rightHight;
      var leftData = [];
      var rightData = [];
      for (let i = 0; i < allData.length; i++) {
        var currentItemHeight = parseInt(Math.round(allData[i].CoverHeight * 345 / allData[i].CoverWidth));
        allData[i].CoverHeight = currentItemHeight + "rpx";//因为xml文件中直接引用的该值作为高度,所以添加对应单位
        if (leftH == rightH || leftH < rightH) {//判断左右两侧当前的累计高度,来确定item应该放置在左边还是右边
          leftData.push(allData[i]);
          leftH += currentItemHeight;
        } else {
          rightData.push(allData[i]);
          rightH += currentItemHeight;
        }
      }
    
      //更新左右两栏的数据以及累计高度
      that.setData({
        leftHight: leftH,
        rightHight: rightH,
        leftList: leftData,
        rightList: rightData
      })
    },})
    

四:实现该效果需要注意的点。

  • 1.左右两栏布局的确定
  • 2.每张图片高度的计算
  • 3.根据左右两栏的高度,确定每个item的摆放位置。

相关文章

  • 微信小程序实现瀑布流布局

    微信小程序实现瀑布流布局,效果如下: index.js index.wxml index.wxss waterFl...

  • 瀑布流布局 的学习

    1- 实现瀑布流布局效果 瀑布流效果瀑布流代码木桶布局效果木桶布局代码瀑布流布局 2- 实现一个新闻瀑布流新闻...

  • 微信小程序实现瀑布流布局

    小程序实现瀑布流 近期在做APP转成小程序的相关开发,需将APP里面的部分页面抽离出来,做成小程序。其中有个页面是...

  • 瀑布流布局_木桶布局

    题目1: 实现一个瀑布流布局效果 瀑布流 题目2:实现木桶布局效果 木桶布局 题目3:**实现一个新闻瀑布流新闻网...

  • 微信原生组件|基于小程序实现音视频通话

    1 微信小程序原生推拉流组件功能简介 本文将介绍如何使用微信小程序原生推拉流组件 和 进行推拉流,快速实现...

  • 瀑布流布局

    题目1: 实现一个瀑布流布局效果瀑布流代码题目2:实现木桶布局效果木桶布局代码题目3:实现一个新闻瀑布流新闻网站,...

  • 微信小程序实现瀑布流布局(一)

    京东微信小程序瀑布流的效果: 分析结构 瀑布流可以看成是由一个个的小卡片左右分布组成 1.图片 2.标签(有些有)...

  • 瀑布流和懒加载结合

    实现一个瀑布流布局效果 瀑布流

  • 小程序的Flex弹性布局

    参考:微信小程序页面布局微信小程序开发详解(九)---微信小程序布局基础 1.Flex布局的特点 1.任意方向的伸...

  • 微信小程序瀑布流列表

    小程序的瀑布流列表,如果是两列,把屏幕分为2列,左边一列,右边一列。 在wxss里面,定义各个view的位置。

网友评论

    本文标题:微信小程序实现瀑布流布局

    本文链接:https://www.haomeiwen.com/subject/smlcmqtx.html