小程序实现无限瀑布流

实现瀑布流

实现效果

有好几种方案

1.用column-count属性把页面元素分为俩列或多列来实现

2.用display flex 分列来展示页面

3.比如说用js实现

我今天介绍的就是第三种,因为前两种都会有局限,实现的效果我们希望是左右左右,而不是分成两列去显示,因为如果功能需要列表按照热度显示,从我们视觉来看就是 左右比较好,而不是一整列 1,2,3,4,5…

当然如果你们希望用column-count 实现的话,也可以 请点击,我随便找了一个网址网上有很多,我自己也试过实现起来确实很简单,纯css3实现。

那么好,现在正式开始:

说一下思路,通过js控制两列数组,分别在这两个数组中插入图片实现列表展示

首先HTML布局

<view class="post-content" wx:if="{{list.length}}">
  <view class="left-view">
    <repeat for="{{leftList}}" key="index" index="index" item="item">
      <PostItem :item.sync="item" imgMode="widthFix" />
    </repeat>
    </view>
    <view class="right-view">
    <repeat for="{{rightList}}" key="index" index="index" item="item">
      <PostItem :item.sync="item" imgMode="widthFix" />
    </repeat>
  </view>
</view>

可以看到就是一个外部大壳子,然后两列 left-view、right-view 之后就是两个数组循环展示,PostItem是我自己封装的组件用来展示单个item

css部分

.post-content {
  padding: 0 24rpx;
  padding-top: 24rpx;
  box-sizing: border-box;
  > view {
    width: 49%;
    display: inline-block;
    vertical-align: top;
  }

  .left-view {
    margin-right: 2%;
  }
}

也很简单两列宽度约等于50%中间有间隔

js部分

loadImages () {
  setTimeout(() => {
    const data = this.list
    let { leftList, rightList } = this
    if (data.length) {
      for (let i = 0; i < data.length; i++) {
        if (data[i].id % 2 == 1) {
          leftList.push(data[i])
        } else {
          rightList.push(data[i])
        }
      }

      this.leftList = leftList
      this.rightList = rightList
      this.$apply()
    }
  }, 1000);
}

data = {
  leftList: [], //左列
  rightList: [], //右列
}

就可以看到下列图

但是如果只是这样实现的话就会有问题,因为它的实现是按照奇偶数实现的,那么如果有几张图片正好很高,那么另外一列就会很难看。

下列有问题的情况

可以看到左列很难看

那么我做一下修改, 在遍历数据的时候做了左右列表的高度检测,如果那边底那么就append到哪边

loadImages (list) {
  const newList = list || this.list
  setTimeout(() => {
    let { leftList, rightList } = this
    if (newList.length) {
      helper.forSetTimeout(newList,async (i) => {
        const isLeft = await this.isPushLeft()
        if (isLeft) {
          leftList.push(newList[i])
        } else {
          rightList.push(newList[i])
        }

        this.leftList = leftList
        this.rightList = rightList
        this.$apply()
      }, 50)
    }
  }, 300);
}

// forSetTimeout 实现
function forSetTimeout (list, callback, time = 1000) {
    for (let i = 0; i < list.length; i++) {
        setTimeout(((num) => {
            return callback.bind(null, num)
        })(i), i * time)
    }
}

isPushLeft () {
  const query = wepy.createSelectorQuery()
  query.select('.left-view').boundingClientRect()
  query.select('.right-view').boundingClientRect()
  return new Promise((resolve, reject) => {
    query.exec((res) => {
      const leftData = res[0]
      const rightData = res[1]
      resolve(leftData.height < rightData.height)
    })
  })
}

最终效果如最上面的图,事实上setTimeout的时间间隔可以改成30毫秒以内,但是我觉得50毫秒已经不影响正常体验了。

原文地址:https://www.cnblogs.com/Mrxiedh/p/10550588.html

时间: 2024-10-15 08:34:31

小程序实现无限瀑布流的相关文章

微信小程序实现无限滚动列表(滚动新闻动态列表)

本文实例为大家分享了微信小程序实现无限滚动列表的具体代码,供大家参考,具体内容如下 实现方式是利用小程序原声组件swiper,方向设置为纵向 :vertical=‘true'设置同时显示的滑块数量:display-multiple-items=‘4'设置自动轮播:autoplay:‘true'. 话不所说,直接上代码: <!-- 底部排名 --> <view class='contentBottom'> <view class='BottomFirst'> <te

js实现无限瀑布流

瀑布流 是一种常见的网页布局方式,在许多网站中我们都能看到“瀑布流”的效果,其特征是有网页视窗有多个高度不同宽度相同的“块”组成.因其样式酷似飞流直下的瀑布, 故将这种布局方式称为瀑布流. 生活中瀑布流实例: 花瓣网 在css中我们学习过使用Multi-columns来实现瀑布流的效果 通过 Multi-columns 相关的属性 column-count.column-gap 配合 break-inside 来实现瀑布流布局. 现在,我来介绍一下如何通过js方式来实现瀑布流 <!DOCTYPE

python小程序:无限求和平均

编写一个程序,重复读取数据,直到用户输入‘done’.一旦输入‘done’,打印总和.个数与平均值.如果用户输入的不是数字,使用try和except捕获异常,打印错误信息,然后跳过继续执行循环. 1 arr = [] 2 num = 0 3 sum = 0 4 while 1: 5 val = input('请输入一个数:') 6 try: 7 if val == 'done': 8 for i in arr: 9 sum = sum + float(i) 10 print('总和为:' + s

马化腾IT领袖峰会力推,微信小程序即将迎来爆发拐点

3月25日,马化腾在2018中国(深圳)IT领袖峰会上发表了题为"数字中国的机遇与探索"的演讲.从"一纵"."一横"."一新"这三个角度解释了他对数字中国发展的理解. 马化腾认为,一纵就是技术和互联网.从互联网+或者+互联网,每个行业都在利用互联网信息技术进行改造和升级.新经济跟传统行业并不冲突,而是互补的,可以深度融合的:一横就是数字化从经济扩展到民生.政务等领域,横向发展到一定程度,就成为整个数字中国.比如交通.医疗.教育

门店小程序开发模式系统详解

门店小程序开发(李想.185.6504.8478)门店是一种极具发展前景的新型业态,在门店购物已成为现代人快节奏生活的方式之一.门店的投资发展是一种见效比较快,但风险及投资成本较高的一种行业. 微信小程序从张小龙提出这一概念后到现在一直都非常的火,微信小程序从上线后就不断的完善,功能逐渐的增加,很多人都已经争先开始抢占微信小程序的红利,那么对于线下门店来说要如何抢占小程序的红利呢?这就需要赢在移动开发的门店微信小程序了. 一.门店微信小程序是什么? 门店微信小程序就像是门店在微信上的「名片」,它

“小程序+直播”怎样搅动音视频技术生态?

责编 / 王宇豪 策划 / LiveVideoStack 12月26日晚间,微信小程序开放了直播能力,并首先向社交.教育.医疗.政务民生.金融等五大应用场景开放.与原生App应用和基于浏览器的H5应用相比,小程序直播会对音视频技术生态带来哪些影响?微信天生的流量优势会给开发者和运营带来机会还是陷阱?LiveVideoStack邀请了若干位有代表性的技术人,分享各自的观点与思考. LiveVideoStack:对于小程序提供的这种实时音视频功能,它是否能满足我们一般的直播需求呢?比如它的延迟大致能

微信小程序赚钱方法大全|都是谁适合利用小程序进行商业盈利?

微信小程序上线已经一年多的时间,小程序的入口也在不断的增加,功能也不断你的进行着迭代,很多创业者都看到了其中的创业商机,希望能抓住小程序这样的一波红利.但是如何能抓住小程序这波红利呢,如何切入微信小程序呢,现在小编和大家进行总结一下,进行全面分析,希望能给到大家想要的答案. 小程序商店 也就是"小程序聚合平台".前期收录所有小程序,进行免费展示.待知名度.访问量和转化量做起来后,转为收费模式(摊位费.推广费),如 速成应用. 本地服务 针对提供本地服务的商家或有众有品牌连锁加盟门店,利

干货|微信小程序线上线下推广的方法和销售话术小技巧分享

一款小程序在被开发后,若想获得广泛的用户群体,就得靠一些巧妙地话术宣传和推广措施.那么问题来了,微信小程序推广和话术有哪些呢?具体要怎么操作?别着急,请听小编来跟大家一一道来. 小程序推销话术小技巧 1.有自信,说话有底气 销售人员在宣传小程序时,一定在客户面前要很自信地说话.不自信的话是缺乏说服力量的.有了自信以后,销售人员在讲话的尾语可以作清楚的.强劲的结束,由此给对方确实的信息.如"一定可以使您满意的".这样的话会让客户对你宣传的小程序产生一定的信心. 2.重复重要语句,加深在顾

微信小程序推广技巧、营销方案

小程序已经成功上线了!那么,小程序线下如何推广?线下门店如何玩转小程序呢? 1.附近的小程序,让商家曝光率更高 小 程序自带"附近的小程序"功能,利用LBS定位功能提高商家专属微信小程序的曝光度,用户走进某一个点位时,就能在附近的小程序中显示出商家的小程序信 息,对于增加商业机会有一定的帮助.可以直观地在小程序界面展示门店商家的地理位置.门店信息.联系电话.经营时间等信息. 2.小程序做内容营销,让信息传播更方便 小程序本身可以作为一个内容推送平台,可以向用户发送消息.通过这种方式,可