背景
朋友们好!我是西瓜皮
,一个立志写出 200 个小程序特效的创作者。新岁已至,2025
年开工之际,我特意为大家制作了一个微信红包动画特效,希望借这个小小的特效,给大家送上新春的祝福,愿大家在新的一年里万事顺遂,喜乐安康!
效果
1. 视觉设计
红包页面主要包含以下视觉元素:
<!-- /pages/redpacket/redpacket.wxml -->
<view class="container">
<view class="redpacket {{isOpening ? 'opening' : ''}} {{isOpened ? 'opened' : ''}}">
<!-- 关闭按钮 -->
<view class="close-btn" bindtap="closeRedPacket">
<text class="close-icon">×</text>
</view>
<!-- 红包头部 -->
<view class="packet-header">
<image class="packet-icon" src="/assets/redpacket-icon.png" mode="aspectFit"></image>
<text class="packet-title">微信红包</text>
<text class="packet-subtitle">给你发了一个红包</text>
</view>
<!-- 红包祝福语 -->
<view class="blessing-text">恭喜发财,大吉大利!</view>
<!-- 开红包按钮 -->
<view class="packet-button" bindtap="openRedPacket">
<text class="open-text">開</text>
</view>
<!-- 打开后的红包内容 -->
<view class="packet-opened" wx:if="{{isOpened}}">
<view class="money">
<text class="symbol">¥</text>
<text class="amount">{{amount}}</text>
</view>
<view class="detail-button" bindtap="goToDetail">查看详情</view>
</view>
</view>
</view>
- 半透明遮罩背景
- 红包主体
- 关闭按钮
- 头部图标和标题
- 祝福语文本
- 开红包按钮
- 打开后的金额展示
2. 动画效果
2.1 摇晃动画
当用户点击开红包按钮时,红包会有轻微的摇晃效果:
/** /pages/redpacket/redpacket.wxss **/
.opening {
animation: shake 0.2s ease-in-out infinite;
}
.opened .packet-opened {
opacity: 1;
transform: scale(1);
transition: all 0.3s ease-out;
}
@keyframes shake {
0%, 100% {
transform: rotate(0deg);
}
25% {
transform: rotate(-1deg);
}
75% {
transform: rotate(1deg);
}
}
使用 CSS @keyframes
实现左右摇摆,通过 transform: rotate()
控制摆动角度。
2.2 打开动画
红包打开时的过渡效果:
/** /pages/redpacket/redpacket.wxss **/
.packet-opened {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: #FA5151;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
opacity: 0;
transform: scale(0.8);
}
使用 CSS transform
和 opacity
实现缩放淡入效果。
2.3 按钮阴影
开红包按钮的视觉层次:
/** /pages/redpacket/redpacket.wxss **/
.packet-button {
width: 140rpx;
height: 140rpx;
background: #FFE2B1;
border-radius: 50%;
display: flex;
justify-content: center;
align-items: center;
margin-top: 120rpx;
box-shadow: 0 4rpx 8rpx rgba(0, 0, 0, 0.2);
position: relative;
}
.packet-button::after {
content: '';
position: absolute;
top: -100rpx;
left: 50%;
width: 600rpx;
height: 100rpx;
background: radial-gradient(ellipse at center, rgba(0,0,0,0.1) 0%, rgba(0,0,0,0) 70%);
transform: translateX(-50%);
}
- 使用
box-shadow
制造按钮立体感 - 使用
radial-gradient
创建投影效果
3. 微信小程序特性运用
- 自定义组件封装
- 将红包封装为独立组件,方便复用
- 使用 Component 构造器注册组件
- 事件处理
- bindtap 处理点击事件
- 自定义事件通知页面层
- 状态管理
- 使用 data 管理红包状态
- setData 触发视图更新
- 动画管理
- CSS3 动画实现视觉效果
- wx.createAnimation 处理复杂动画
- 条件渲染
- 使用 wx:if 控制红包开启状态
- 使用 class 绑定控制动画状态
4. 性能优化
- 动画性能
- 使用 transform 代替位置属性
- 避免频繁的 setData 调用
- 资源加载
- 图片资源适当压缩
- 使用 CDN 加速资源加载
- 渲染优化
- 合理使用 wx:if 和 hidden
- 避免频繁的条件切换
5. 交互优化
- 反馈及时性
- 点击时立即显示动画效果
- 状态变化有明确的视觉提示
- 容错处理
- 处理异常状态展示
- 添加加载中状态
- 无障碍支持
- 适当的颜色对比度
- 合理的点击区域大小
这个红包组件综合运用了微信小程序的多个特性,通过精心设计的动画效果提升了用户体验,是一个很好的动画交互案例。