微信小程序实现红包雨功能


Posted in Javascript onJuly 11, 2018

本文为大家分享了微信小程序实现红包雨的具体代码,供大家参考,具体内容如下

今天有个小师妹来问我怎样用微信小程序实现红包雨效果,如果用web很好实现,但是小程序不是那么容易,整合自己也有一年没摸过小程序了,决定试一试。

首先明确“红包雨”的需求:

  • 随机位置掉落
  • 随机红包样式
  • 同一时间掉落个数随机
  • 每个红包的掉落速度随机,但不能太快也不能太慢

首先看看我做的效果吧

微信小程序实现红包雨功能

    首先明确小程序实现红包雨和web网页实现红包雨难点上有什么不同:

  • 小程序不能直接操作dom,web网页可以操作
  • 小程序循环渲染wx:for内无法执行animation,web网页中animation执行无条件约束
  • 小程序修改样式属性需要通过数据绑定无法直接修改,web网页可以直接取dom元素进行修改

    好了那么问题来了怎样实现生成红包雨呢?小程序无法直接操作dom也就意味着不能向dom内添加元素,这里我的解决办法是先生成预设个数的红包在视窗外部(用户看不到),然后修改每个红包的样式来实现动画(当然用css keyframes帧动画也可以,我这里使用的是js修改属性)

话不多说直接上代码吧,代码内有注释

wxml:

<view wx:for="{{packetList}}" wx:for-index="index" wx:for-item="items">
 <image class="red-packet" src="{{items.src}}" style="position:fixed;top:{{items.top}}px;left:{{items.left}}px;-webkit-transition:{{items.speed}}ms linear 0ms;transition:{{items.speed}}ms linear 0ms">
 </image>
</view>

wxss:

.red-packet{
 width: 20px;
 height: 25px;
 z-index: 100;
 transition-property:transform,top;
 transform-origin:50% 50% 0;
 -webkit-transition-property:transform,top;
 -webkit-transform-origin:50% 50% 0;
}

js:

Page({
 
 /**
 * 页面的初始数据
 */
 data: {
 windowWidth:"",//窗口宽度
 windowHeigh:"",//窗口高度
 packetList:[{}],//红包队列
 packetNum:200,//总共红包的数量
 showInter:''// 循环动画定时器
 },
 
 /**
 * 生命周期函数--监听页面加载
 */
 onLoad: function (options) {
 var that = this;
 
 // 获取手机屏幕宽高
 wx.getSystemInfo({
  success: function (res) {
  that.setData({
   windowWidth: res.windowWidth,
   windowHeigh: res.windowHeight,
   top: res.windowHeight-100 //设置红包初始位置
  })
  }
 })
 
 //建立临时红包列表
 var packetList=[];
 //建立临时红包图片数组
 var srcList = ["../images/packet-one.png", "../images/packet-two.png"];
 //生成初始化红包
 for(var i=0;i<that.data.packetNum;i++){
  // 生成随机位置(水平位置)
  var left = Math.random() * that.data.windowWidth-20;
  // 优化位置,防止红包越界现象,保证每个红包都在屏幕之内
  if(left<0){
  left+=20;
  } else if (left > that.data.windowWidth){
  left-=20;
  }
  // 建立临时单个红包
  var packet = {
  src: srcList[Math.ceil(Math.random() * 2) - 1],
  top: -30,
  left:left,
  speed:Math.random() * 2500+3000  //生成随机掉落时间,保证每个掉落时间保持在3秒到5.5秒之间
  }
  // 将单个红包装入临时红包列表
  packetList.push(packet);
  // 将生成的临时红包列表更新至页面数据,页面内进行渲染
  that.setData({
  packetList: packetList
  })
 }
 
 // 初始化动画执行当前索引
 var tempIndex=0;
 // 开始定时器,每隔1秒掉落一次红包
 that.data.showInter=setInterval(function(){
  // 生成当前掉落红包的个数,1-3个
  var showNum = Math.ceil(Math.random() * 3);
  // 防止数组越界
  if (tempIndex * showNum>=that.data.packetNum){
  // 如果所有预生成的红包已经掉落完,清除定时器
  clearInterval(that.data.showInter);
  }else{
  switch (showNum){
   case 1:
   //设置临时红包列表当前索引下的top值,此处top值为动画运动的最终top值 
   packetList[tempIndex].top = that.data.windowHeigh;
   // 当前次掉落几个红包,索引值就加几
   tempIndex+=1;
   break;
   case 2:
   packetList[tempIndex].top = that.data.windowHeigh;
   packetList[tempIndex + 1].top = that.data.windowHeigh;
   tempIndex+=2;
   break;
   case 3:
   packetList[tempIndex].top = that.data.windowHeigh;
   packetList[tempIndex + 1].top = that.data.windowHeigh;
   packetList[tempIndex + 2].top = that.data.windowHeigh;
   tempIndex += 3;
   break;
   default:
   console.log();
  }
  // 更新红包列表数据
  that.setData({
   packetList: packetList
  })
  }
 },1000)
 }
})

好了红包雨就这样实现了,其实还是蛮有意思的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Java 正则表达式学习总结和一些小例子
Sep 13 Javascript
js 手机号码合法性验证代码集合
Sep 29 Javascript
jQuery层级选择器用法分析
Feb 10 Javascript
javascript生成大小写字母
Jul 03 Javascript
javascript实现瀑布流加载图片原理
Feb 02 Javascript
Node.js查找当前目录下文件夹实例代码
Mar 07 Javascript
解决vue里碰到 $refs 的问题的方法
Jul 13 Javascript
Vue中如何实现轮播图的示例代码
Jul 27 Javascript
angular4 JavaScript内存溢出问题
Mar 06 Javascript
vue.js 添加 fastclick的支持方法
Aug 28 Javascript
js中call()和apply()改变指针问题的讲解
Jan 17 Javascript
浅析JavaScript中的变量提升
Jun 01 Javascript
小程序ios音频播放没声音问题的解决
Jul 11 #Javascript
vue 1.0 结合animate.css定义动画效果
Jul 11 #Javascript
微信小程序实现发红包功能
Jul 11 #Javascript
vue框架搭建之axios使用教程
Jul 11 #Javascript
vue中动态设置meta标签和title标签的方法
Jul 11 #Javascript
Vue项目添加动态浏览器头部title的方法
Jul 11 #Javascript
node.js到底要不要加分号浅析
Jul 11 #Javascript
You might like
PHP邮件发送类PHPMailer用法实例详解
2014/09/22 PHP
WordPress中用于获取文章信息以及分类链接的函数用法
2015/12/18 PHP
Laravel框架源码解析之反射的使用详解
2020/05/14 PHP
通过JAVASCRIPT读取ASP设定的COOKIE
2006/11/24 Javascript
js日期相关函数总结分享
2013/10/15 Javascript
jquery创建表格(自动增加表格)代码分享
2013/12/25 Javascript
JavaScript验证图片类型(扩展名)的函数分享
2014/05/05 Javascript
jquery比较简洁的软键盘特效实现方法
2015/03/19 Javascript
将页面table内容与样式另存成excel文件的方法
2015/08/05 Javascript
javascript数组去重的六种方法汇总
2015/08/16 Javascript
详解JavaScript中常用的函数类型
2015/11/18 Javascript
AngularJS基础 ng-if 指令用法
2016/08/01 Javascript
js HTML5多图片上传及预览实例解析(不含前端的文件分割)
2016/08/26 Javascript
PHP获取当前页面完整URL的方法
2016/12/02 Javascript
angularjs中回车键触发某一事件的方法
2017/04/24 Javascript
Angularjs按需查询实例代码
2017/10/30 Javascript
vue将对象新增的属性添加到检测序列的方法
2018/02/24 Javascript
通过vue-cli3构建一个SSR应用程序的方法
2018/09/13 Javascript
javascript 设计模式之享元模式原理与应用详解
2020/04/08 Javascript
微信小程序pinker组件使用实现自动相减日期
2020/05/07 Javascript
[07:47]DOTA2国际邀请赛采访专栏:探访Valve总部
2013/08/08 DOTA
[02:12]2019完美世界全国高校联赛(春季赛)报名开启
2019/03/01 DOTA
python目录操作之python遍历文件夹后将结果存储为xml
2014/01/27 Python
python多重继承实例
2014/10/11 Python
Python2.x和3.x下maketrans与translate函数使用上的不同
2015/04/13 Python
python编写简单爬虫资料汇总
2016/03/22 Python
Windows中使用wxPython和py2exe开发Python的GUI程序的实例教程
2016/07/11 Python
Python列表删除元素del、pop()和remove()的区别小结
2019/09/11 Python
Python实现一个简单的毕业生信息管理系统的示例代码
2020/06/08 Python
小学校长竞聘演讲稿
2014/05/16 职场文书
学校清明节活动总结
2014/07/04 职场文书
课程设计的心得体会
2014/09/03 职场文书
承诺书范本
2015/01/21 职场文书
春风化雨观后感
2015/06/11 职场文书
Python制作动态字符画的源码
2021/08/04 Python
2022新作动画《福星小子》释出宣传影片 加入内田真礼&宫野真守配音演出
2022/04/08 日漫