微信小程序设置超出隐藏,点击加载更多实现动画效果

本文介绍如何在微信小程序中实现商品列表的加载更多动画效果,通过动态调整max-height属性实现商品列表的渐变展开,适用于商品数量不确定的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

微信小程序设置超出隐藏,点击加载更多实现动画效果

问题描述

业务开发中经常会有一些场景,以商品订单场景为例,少于两个商品,不显示更多按钮,超过两个显示更多,点击展开,商品全部展示,并且有渐变动画效果

解决方案

Tips:先说下自己当时的误区的纠正:
动画的发生需要满足以下条件:

  1. 实现动画的元素 css 属性写上了 transition 属性,并且值设置正确(具体值代表什么,自行百度)
  2. 元素需要实现动画的属性需要有具体的值的变化,如果不是具体的值则,不会实现动画(比如:max-height 的值由 100px => 200px 会有动画,但是由 100px => none/inherit 则不会有动画)

实现效果如下图:

image

根据 Tips 的两点条件,遇到的瓶颈如下:

  1. 产生动画的元素必须要有 css 属性值的具体变化;
  2. 商品的数量是不一定的,难以设置属性值的具体变化

解决上述两点,其实就是实现的思路:

  1. css 属性值得具体变化,可以使用 max-height 属性来控制;
  2. 动态获取商品列表容器的高度,然后设置给 max-height 属性,这样,max-height 属性会由两个商品的高度和多个商品的高度来切换;

主要代码如下:

<!--视图层:
    ware-list 为最外层,由 max-height 控制动画,并且设置 overflow:hidden;
    list-box 为包裹商品的盒子,max-height 的最大值为此盒子的高度,
    list 为每一商品项
    此处 278rpx 是商品为两个时的商品列表盒子的大概高度
-->
<view class="wares-lists" style="max-height:{{showAllWares?listBoxHeight:'278rpx'}};">
    <view id="list-box">
        <view class="list" wx:for="{{moduleData.wares}}" wx:key="index">
            
        </view>
    </view>
</view>
<!-- 设置需要动画元素的样式 -->
.wares-lists {
	overflow: hidden;
	transition: all 0.2s linear;
}

部分 js 代码如下:

const app = getApp();
Component({
	/**
	 * 组件的属性列表
	 */
	properties: {
		moduleData: {
			type: Object
		},
	},

	/**
	 * 组件的初始数据
	 */
	data: {
		showAllWares: false,
		listBoxHeight: '278rpx',
	},
	ready: function () {
		this.setListHeight();
	},
	/**
	 * 组件的方法列表
	 */
	methods: {
		toggleShow: function (e) {
			this.setData({
				showAllWares: !this.data.showAllWares
			});
		},

		// 设置商品列表高度
		setListHeight () {
			this._getElementHeight('#list-box').then( height => {
				this.setData({
					listBoxHeight:`${height}px`,
				});
			});
		},

		// 获取指定元素实际宽度
		_getElementHeight(id = "") {
			const _query = this.createSelectorQuery();
			return new Promise(resolve => {
				_query.select(id).fields({
					size: true,
				}, (res) => {
					resolve(res.height);
				}).exec();
			});
		},
	}
});

总结:
在这里只是个抛砖引玉提供一个思路,小程序中可以这样实现,在 H5 中也可以这样实现。

### 微信小程序实现序列帧动画 #### 创建动画容器 为了在微信小程序实现序列帧动画,首先需要创建一个用于显示动画的容器。这通常是在`wxml`文件中完成的: ```html <view class="frame-container"> <image class="frame-image" src="{{currentFrameSrc}}"></image> </view> ``` 这里的`class="frame-container"`定义了一个容纳图像的区域,而`src="{{currentFrameSrc}}"`则绑定到当前要展示的帧。 #### 准备帧图片 准备好一系列构成动画效果的静态图片资源,并将其放置于项目目录下合适的位置。这些图片应当按照顺序命名以便程序能够依次读取并播放形成连贯的动作[^2]。 #### 设置样式与布局 对于上述提到的`.frame-container`和`.frame-image`类,在对应的`wxss`文件里设定尺寸和其他必要的CSS属性以确保它们能正确渲染出来: ```css .frame-container { width: 100px; height: 100px; overflow: hidden; /* 防止超出部分被看到 */ } .frame-image { position: absolute; } ``` 此段代码设置了容器大小为100x100像素,并隐藏任何溢出的内容;同时让每张图像是绝对定位从而可以在同一位置上层叠切换而不改变其坐标系。 #### 编写逻辑脚本 最后一步就是在JavaScript端编写控制逻辑来定时更换所显示的图片源(`currentFrameSrc`),以此模拟连续的画面流动感。这里给出一段简单的示例代码片段说明这一过程: ```javascript Page({ data: { frameImages: [ '/images/frame_0.png', '/images/frame_1.png', '/images/frame_2.png' // 添加更多帧... ], currentIndex: 0, intervalId: null }, onLoad() { const that = this; // 开始循环播放帧动画 let intervalId = setInterval(() => { let newIndex = (that.data.currentIndex + 1) % that.data.frameImages.length; that.setData({ currentFrameSrc: that.data.frameImages[newIndex], currentIndex: newIndex }); }, 100); // 假设每一帧持续时间为100ms this.setData({intervalId}); }, onUnload(){ clearInterval(this.data.intervalId); } }) ``` 这段代码实现了当页面加载时启动计时器每隔一定时间更新一次`currentFrameSrc`变量指向下一帧直至最后一帧再返回首帧如此往复直到页面卸载为止停止计时器防止内存泄漏等问题发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值