微信小程序瀑布流 先记录一下链接,过段时间在整理一下

暂时总结了两种类型:

一、【实时加载】的瀑布流实现方式:

  • 目的:使用瀑布流的目的是:在视图不卡顿的情况下,源源不断的流畅展示更多图片。
  • 原理:
    1 将视图分为两列、三列或者多列。
    2 随着滚动条的下拉,页面加载更多的图片。
    3 新增加的图片自动添加到高度最小的列当中。

上图 如下
在这里插入图片描述在这里插入图片描述

第一种方式
css 布局如图所示,大体一样就可以,这里不贴代码了。
js:这里以小程序为例:

<!--隐藏列表 1、用于计算的隐藏image的 数据源 -->
<!--
bindload、binderror 
不管图片加载成功还是失败,
都需要触发一下对应的函数:
	1 用来获取当前加载完图片的高度
	2 将高度进行一个累加,然后通过计算得出的高度来判断:这张图片应该加在左列还是右列。
-->
<view class="hide-shop">
	<image 
		wx:for="{{allPic}}" 
		src="{{item.src}}" 
		data-src="{{item.src}}" 
		data-ind="{{index}}" 
		wx:key="*this"
		bindload="imageload"  
		binderror="imageloaderr"
	/>
</view>


<!--展示列表-->
<view>
	<!--左侧列表-->
	<view>
	    <block wx:for="{{leftlist}}">
            <image mode="widthFix" lazy-load="{{true}}" src="{{item}}"/>
		</block>
	</view>
	<!--右侧列表--->
	<view>
	    <block wx:for="{{rightlist}}">
            <image mode="widthFix" lazy-load="{{true}}" src="{{item}}"/>
		</block>
	</view>
</view>

Page({
	data:{
		allPic:[], // 储存全部的图片:1、用于计算的隐藏image的 数据源 2、用来判断图片是否全部加载完。
		
		// 通过两个可以更新的变量来存储左右两侧的图片
	    leftlist:[], // 左侧列表图片
	    rightlist:[], // 右侧列表图片
	},
 	leftHeight: 0,
  	rightHeight: 0,
  	lin_allPic:[],
  	s_leftlist:[],
  	s_rightlist:[],
	onLoad() {
		this.getPhotolist()
	},
	// 1 页面初始化 加载图片列表数据
	getPhotolist(){
	  const that = this;
	  wx.request({
		// ...options
	  	success(res){
	  		const list = []; // list:[ { url:"...", } ]
			if(res.list.length){
				res.list.map(item => list.push({ src:item.url, }))
				that.setData({ 
					allPic:[...that.data.allPic, ...list],
					curPageNum: curPageNum+1
				})
        	} else wx.hideLoading()
		},
	  })
	},
	// 2 图片加载完成
	imageload(e){
	    const that = this;
	    // html 中存储 src 提图片地址,index 渲染序号
	    // 渲染序号用于判断最后一个是否加载完
	    const { height, width } = e.detail;
	    const { src, ind, } = e.currentTarget.dataset;
	    const picHeight = (height * 750) / width;
	    const leftadd = () =>{
	      that.s_leftlist.push(src)
	      that.leftHeight += picHeight;
	    }
	    const rightadd = () =>{
	      that.s_rightlist.push(src)
	      that.rightHeight += picHeight;
	    }
	    // 判断逻辑
	    if( ind%2 ) {
	      if( this.leftHeight < this.rightHeight ) leftadd()
	      else rightadd()
	    } else {
	      if( this.leftHeight < this.rightHeight ) leftadd()
	      else rightadd()
	    }
	    that.lin_allPic.push(src)
	    that.isRender()
	},  
	// 3 图片加载失败 默认添加一个图片
  	imageloaderr(e){
	    const src = "https://img1.baidu.com/it/u=606394262,1008040175&fm=26&fmt=auto&gp=0.jpg"
	    const that = this;
	    const { ind, } = e.currentTarget.dataset;
	    // html 中存储 src 提图片地址,index 渲染序号
	    // 渲染序号用于判断最后一个是否加载完
	    const leftadd = () =>{
	      that.s_leftlist.push(src)
	      that.leftHeight += 400;
	    }
	    const rightadd = () =>{
	      that.s_rightlist.push(src)
	      that.rightHeight += 400;
	    }
	    // 判断逻辑
	    if( ind%2 ) {
	      if( this.leftHeight < this.rightHeight ) leftadd()
	      else rightadd()
	    } else {
	      if( this.leftHeight < this.rightHeight ) leftadd()
	      else rightadd()
	    }
	    that.lin_allPic.push(src)
	    that.isRender()
  	},	 
  	// 4 统一渲染 
  	isRender(){
		const that = this;
		if(that.lin_allPic.length == this.data.allPic.length){
		  // 加载完成...
		  this.setData({ 
		    leftlist: that.s_leftlist,
		    rightlist: that.s_rightlist,
		  },()=>{
		    wx.hideLoading()
		  })
		} else {
		  // 加载中...
		}
	},
	// 页面触底加载新作品
	onReachBottom(){
	  this.getPhotolist()
	  wx.showLoading({ title: '加载中', })
	}
})

每次加载图片时都需要计算图片的高度,对左右两侧的高度进行一个累加。
通过左右高度的大小来判断下一张图片应该加载在哪里。

ps 1必要 需要对图片加载失败的情况做处理。
2 必要 对获取的图片高度要做处理,(宽750 的情况下,高度是多少)
3 非必要 不是使用 wx.getImageInfo 获取图片高度和宽度,因为 这个方法每次最多十个请求,超了就报错!

原文如下https://developers.weixin.qq.com/community/develop/article/doc/000a2e9db9ca98a3c379cfa4a5d013

二、【固定图片】的瀑布流图片【展示方式】

一、 需求概述 请基于 “轻算旅行” 小程序设计手册,按照苹果风格的卡片式设计和配色方案,使用微信开发者工具,开发一款旅行账单 AA 小程序,实现新建账单、邀请好友、团队成员共同记账以及展示账单首页等功能,为用户提供便捷的旅行账单管理服务。 二、 功能模块及要求 新建账单 实现用户点击 “新建账单” 按钮后,进入新建账单界面,用户需填写以下信息: 账单名称:用户自定义的账单主题名称。 参与人员:默认包含自己,可通过微信联系人列表选择其他参与人员,被选中的好友将收到加入账单的邀请通知。 点击 “保存” 按钮后,该账单创建完成,计入总花费,并在个人历史账单列表和团队账单列表(若邀请了其他成员)中展示。 邀请微信好友 在账单详情页面,有一个 “邀请好友” 按钮。点击该按钮后,弹出微信好友选择界面,用户可单选或多选好友进行邀请。被邀请的好友会收到一条微信小程序通知,点击通知可直接进入小程序,查看是否加入该账单。若好友同意加入,则自动成为该账单的团队成员,可在记账瀑布中查看和添加记账信息。 团队成员记账 在账单详情页面,所有团队成员均可点击 “记账” 按钮进行新的消费记录添加。记账界面,需填写金额、选择消费类型图标(从预设分类中选择,如餐饮、住宿、交通等)等信息。记账完成后,该记录会实时同步到所有团队成员的账单详情页面中,在记账瀑布中展示。瀑布为长条卡片式,左侧为记账人头像,头像右侧为金额,最右侧是消费类型。 账单首页 进入小程序后,默认展示账单首页。单首页分为三个主要部分: 我已花费和总花费信息:以大号字体突出显示 “我已花费” 的金额,紧随其后显示 “总花费” 金额,并以不同颜色区分两者。下方用较小字体显示 “我已花费” 所占总花费的百分比,以直观体现个人在团队中的消费占比情况。 实时分析卡片:卡片采用简洁的设计风格,以图表(如柱状图、饼图等)形式展示消费类别的分布情况,例如餐饮消费占比、住宿消费占比等;同时,以数字形式展示人均消费金额,若存在个人消费超出或低于人均水平的情况,用不同颜色字体进行提示,如红色表示超出,蓝色表示低于。 记账瀑布:以时间倒序的方式展示所有记账记录,每条记录以卡片形式呈现,包含金额、消费时间、地点、消费类型等信息,瀑布为长条卡片式,左侧为记账人头像,头像右侧为金额,最右侧是消费类型。点击某条记账记录,可其进入详情页面,查看详细信息和编辑(仅记录本人可编辑自己的记账记录,其他成员的记录可查看但不可编辑)。 三、 设计风格 卡片式设计 小程序内各类信息(如实时分析卡片、记账记录卡片等)均采用卡片式布局,卡片具有圆角矩形的外观,边框为浅灰色细线,卡片之间的间距适中,整体界面整齐有序。卡片背景颜色为白色,文字和图标颜色根据信息类型和优级进行选择,如重要信息用黑色加粗字体,次要信息用浅灰色字体。 苹果配色 主色调以苹果产品常用的简洁、清新的颜色为主,如银灰色(用于导航栏背景、卡片边框等)、深空灰色(用于文字、图标等主要元素)、白色(用于卡片背景、部分装饰元素等)。强调色采用苹果绿色(用于突出显示重要信息,如按钮点击状态、部分统计图表的颜色填充等)、蓝色(用于表示链接、可交互元素等),以营造出具有苹果风格的视觉效果。 请根据以上需求,按照微信小程序的文件目录结构,给出代码总体的文件目录。
03-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值