小程序瀑布流布局(通用方法)

问题

小程序开发受到一些限制,故使用H5和APP的开发思路容易出现问题,做毕业设计需要用到瀑布流布局,看了网上的方法主要有以下三种,但基本都存在问题。

1、使用纯css样式排列出瀑布流布局

核心代码:

  • 父元素:column-count: 2
  • 子元素:break-inside: avoid

局限:只能一次性展示全部数据,不能做动态数据加载,数据显示位置会随数据加载而错位。

案例
https://blog.csdn.net/yuf0812/article/details/80255921
见第一条

2、分成左右两列 根据单条数据索引的奇偶排列出瀑布流布局

核心代码:

  • wx-if="{{index%2==0}}"

局限:当奇数列的元素高度大于或小于偶数列的元素高度时,数据累计过多时会出现较大的高度差,容易出现只有一侧显示数据的情况。

案例
https://blog.csdn.net/yuf0812/article/details/80255921
见第二条

3、分成左右两列 根据图片高度排列出瀑布流布局

核心代码:

  • 略(获取图片高度,依次累计排列)

局限:适用于近有图片或者文字高度固定的情况,当文字高度不固定,数据累积到一定程度时也会出现错位的情况。
注:在仅展示图片或展示文字叠在在图片上时力推该方法。

案例
点击此处查看案例

新方法

利用节点选择器计算出左右栏整体高度,依次插入数据。
适用范围:任何场景均可完美使用。
缺点:对性能有要求,不建议单次加载数据超过20条。

上效果

ewe

html

<view class="left">
  <block wx:for="{{leftList}}" wx:key="index">
    <view class="box" style="background:{{item[0]}};height:{{item[1]*2}}rpx">
      {{item[2]}}
    </view>
  </block>
</view>
<view class="right">
  <block wx:for="{{rightList}}" wx:key="index">
    <view class="box" style="background:{{item[0]}};height:{{item[1]*2}}rpx">
      {{item[2]}}
    </view>
  </block>
</view>

css

.left, .right {
  width: 340rpx;
  margin-left: 24rpx;
  float: left;
  /* background: greenyellow; */
}

/* .right{
  background: palevioletred;
} */

.box {
  margin-bottom: 24rpx;
  border-radius: 20rpx;
  color: #fff;
  font-size: 70px;
  display: flex;
  justify-content: center;
  align-items: center;
}

js

Page({

  //页面的初始数据
  data: {
    total: [], //全部数据
    leftList: [], //左侧数据
    rightList: [], //右侧数据
  },

  // 生命周期函数--监听页面加载
  onLoad: function(options) {
    this.data.total = this.getArr(500) //生成并返回500条数据
    this.getData() //调用加载数据函数
  },

  // 页面上拉触底事件的处理函数
  onReachBottom: function() {
    if (this.data.leftList.length + this.data.rightList.length == this.data.total.length) { //左侧已显示数据 + 右侧已显示数据 == 已生成的所有数据
      wx.showToast({
        title: '已加载完闭' //提示数据加载完毕
      })
    } else {
      wx.showLoading({
        title: '加载数据' //提示加载数据
      })
      setTimeout(() => {
        wx.hideLoading() //隐藏加载框
        this.getData() //调用加载数据函数
      }, 800)
    }
  },

  // 生成数据数组 参数Len 返回 [[color, height, index],[...],[...]]
  getArr(Len) {
    // 生成单条数据
    function getData() {
      let color = new String() //随机颜色
      for (let i = 0; i < 6; i++) {
        color += (Math.floor(Math.random() * 16)).toString(16)
      } //生成6位随机16进制数字
      let num = Math.floor(Math.random() * 150 + 150) //生成随机高度
      return ['#' + color, num] //返回[color, height]
    }
    // 生成数据数组
    let arr = new Array()
    for (let i = 0; i < Len; i++) {
      arr.push(getData().concat(i))
    }
    return arr
  },

  // 加载数据
  getData() {
    let len = this.data.leftList.length + this.data.rightList.length //获取已显示数组长度
    let con = this.data.total.slice(len, len + 20) //获取添加20条数组数据
    let leftData = this.data.leftList
    let rightData = this.data.rightList
    function selector(Class) { //Promise封装节点查询方法
      return new Promise(resolve => {
        wx.createSelectorQuery().select(Class)
          .boundingClientRect(res => {
            resolve(res.height)
          }).exec()
      })
    }
    let _this = this
    async function example() {
      let listHeight = [] //定义一个数组 存放左右两侧高度
      for (let i = 0; i < con.length; i++) { //遍历瀑布流元素
        await selector('.left').then(res => {
          listHeight[0] = res
        })
        await selector('.right').then(res => {
          listHeight[1] = res
        })
        console.log('左右高度', listHeight)
        if (listHeight[0] > listHeight[1]) { //根据左右高度判断渲染至哪一列
          rightData.push(con[i])
        } else {
          leftData.push(con[i])
        }
        _this.setData({ //注意:使用的是this.setData 不建议单次加载超过20条
          leftList: leftData,
          rightList: rightData
        })
      }
    }
    example()
  }

})

有用支持一下吧

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
微信小程序瀑布流布局可以使用 `scroll-view` 组件,结合 CSS 样式实现。具体步骤如下: 1. 在 `.wxml` 文件中定义一个 `scroll-view` 组件,设置 `scroll-y` 属性为 true,表示垂直方向可以滚动。 2. 在该组件内部,定义多个子元素,每个子元素都代表一个瀑布流布局的单元格。 3. 在 `.wxss` 样式中,设置子元素的宽度、高度、margin 等属性,实现瀑布流布局的效果。同时,为了使瀑布流布局更加美观,建议使用 Flex 布局。 4. 当用户向下滚动时,需要动态地加载更多数据。可以使用微信小程序提供的下拉刷新和上拉加载更多组件,或自己实现相关逻辑。 下面是一个简单的示例代码: ``` <scroll-view scroll-y="true"> <view class="cell">单元格1</view> <view class="cell">单元格2</view> <view class="cell">单元格3</view> <view class="cell">单元格4</view> <view class="cell">单元格5</view> <view class="cell">单元格6</view> ... </scroll-view> /* CSS样式 */ .cell { width: 48%; height: 200px; margin: 1%; display: flex; flex-direction: column; justify-content: center; align-items: center; } ``` 以上代码中,`scroll-view` 组件设置了 `scroll-y` 属性为 true,表示垂直方向可以滚动。每个子元素都是一个瀑布流布局的单元格,使用 `view` 组件实现。在 CSS 样式中,设置了每个单元格的宽度、高度、margin等属性,并使用 Flex 布局使其居中显示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值