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


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 相关文章推荐
预加载css或javascript的js代码
Apr 23 Javascript
跟我学习javascript的函数调用和构造函数调用
Nov 16 Javascript
JavaScript获取对象在页面中位置坐标的方法
Feb 03 Javascript
Javascript实现图片不间断滚动的代码
Jun 22 Javascript
jQuery基于函数重载实现自定义Alert函数样式的方法
Jul 27 Javascript
jQuery使用getJSON方法获取json数据完整示例
Sep 13 Javascript
js鼠标移动时禁止选中文字
Feb 19 Javascript
layui导航栏实现代码
May 19 Javascript
JavaScript数据结构之双向链表和双向循环链表的实现
Nov 28 Javascript
vue移动端html5页面根据屏幕适配的四种解决方法
Oct 19 Javascript
vue改变循环遍历后的数据实例
Nov 07 Javascript
jQuery实现简单飞机大战
Jul 05 jQuery
小程序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运行速度的一些小技巧分享
2012/07/03 PHP
深入解析Session是否必须依赖Cookie
2013/08/02 PHP
js中获取事件对象的方法小结
2011/03/13 Javascript
jquery插件validate验证的小例子
2013/05/08 Javascript
jquery遍历select元素(实例讲解)
2013/12/31 Javascript
jquery原创弹出层折叠效果点击折叠弹出一个层
2014/03/12 Javascript
javascript模拟C#格式化字符串
2015/08/26 Javascript
基于jQuery实现多层次的手风琴效果附源码
2015/09/21 Javascript
详解Webwork中Action 调用的方法
2016/02/02 Javascript
详解JavaScript中的自定义事件编写
2016/05/10 Javascript
jQuery中使用animate自定义动画的方法
2016/05/29 Javascript
AngularJS实现一次监听多个值发生的变化
2016/08/31 Javascript
微信小程序实现滴滴导航tab切换效果
2018/07/24 Javascript
Vue中使用ElementUI使用第三方图标库iconfont的示例
2018/10/11 Javascript
vue组件从开发到发布的实现步骤
2018/11/11 Javascript
JavaScript判断对象和数组的两种方法
2019/05/31 Javascript
vue 中 elment-ui table合并上下两行相同数据单元格
2019/12/26 Javascript
python解决js文件utf-8编码乱码问题(推荐)
2018/05/02 Python
Flask框架响应、调度方法和蓝图操作实例分析
2018/07/24 Python
10分钟用python搭建一个超好用的CMDB系统
2019/07/17 Python
Python整数与Numpy数据溢出问题解决
2019/09/11 Python
tensorflow实现读取模型中保存的值 tf.train.NewCheckpointReader
2020/02/10 Python
Python数据可视化实现多种图例代码详解
2020/07/14 Python
澳大利亚家具和家居用品在线商店:Interiors Online
2018/03/05 全球购物
复古服装:RetroStage
2019/05/10 全球购物
公司同意接收函
2014/01/13 职场文书
银行见习期自我鉴定
2014/01/29 职场文书
致全体运动员广播稿
2014/02/01 职场文书
学生请假条
2014/04/11 职场文书
行政部经理助理岗位职责
2014/06/15 职场文书
国庆节促销广告语2014
2014/09/19 职场文书
防汛通知
2015/04/25 职场文书
2016年青少年禁毒宣传教育活动总结(学校)
2016/04/05 职场文书
爱心捐款倡议书:点燃希望,传递温暖
2019/11/04 职场文书
励志语录:只有自己足够强大,才能不被别人践踏
2020/01/09 职场文书
解决Redis启动警告问题
2022/02/24 Redis