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


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 相关文章推荐
jQuery 自动增长的文本输入框实现代码
Apr 02 Javascript
JavaScript控制Session操作方法
Jan 17 Javascript
js验证IP及子网掩码的合法性有效性示例
Apr 30 Javascript
JavaScript生成的动态下雨背景效果实现方法
Feb 25 Javascript
怎样判断jQuery当前元素是隐藏还是显示
Nov 23 Javascript
JS跳转手机站url的若干注意事项
Oct 18 Javascript
基于BootStrap的文本编辑器组件Summernote
Oct 27 Javascript
jquery的 filter()方法使用教程
Mar 22 jQuery
Jquery遍历筛选数组的几种方法和遍历解析json对象,Map()方法详解以及数组中查询某值是否存在
Jan 18 jQuery
Vue框架下引入ActiveX控件的问题解决
Mar 25 Javascript
js实现列表向上无限滚动
Jan 13 Javascript
深入了解JS之作用域和闭包
Jun 16 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
dedecms系统的广告设置代码 基础版本
2010/04/09 PHP
PHP+Ajax验证码验证用户登录
2016/07/20 PHP
PDO::errorCode讲解
2019/01/28 PHP
类似GMAIL的Ajax信息反馈显示
2010/02/16 Javascript
jQuery的12招常用技巧分享
2011/08/08 Javascript
对setInterval在火狐和chrome切换标签产生奇怪的效果之探索,与解决方案!
2011/10/29 Javascript
Javascript图片上传前的本地预览实例
2014/06/16 Javascript
ichart.js绘制虚线、平均分虚线效果的实现代码
2016/05/05 Javascript
Javascript获取随机数的实现方法
2016/06/22 Javascript
纯js实现页面返回顶部的动画(超简单)
2017/08/10 Javascript
Webpack 4.x搭建react开发环境的方法步骤
2018/08/15 Javascript
Vue中mintui的field实现blur和focus事件的方法
2018/08/25 Javascript
Nodejs异步流程框架async的方法
2019/06/07 NodeJs
使用react context 实现vue插槽slot功能
2019/07/18 Javascript
layui多iframe页面控制定时器运行的方法
2019/09/05 Javascript
js中的面向对象之对象常见创建方法详解
2019/12/16 Javascript
Js参数RSA加密传输之jsencrypt.js的使用
2020/02/07 Javascript
Node.js API详解之 readline模块用法详解
2020/05/22 Javascript
JS实现京东商品分类侧边栏
2020/12/11 Javascript
使用python编写udp协议的ping程序方法
2018/04/22 Python
python模拟菜刀反弹shell绕过限制【推荐】
2019/06/25 Python
python基于gevent实现并发下载器代码实例
2019/11/01 Python
python中的itertools的使用详解
2020/01/13 Python
python3连接MySQL8.0的两种方式
2020/02/17 Python
python实现简单颜色识别程序
2020/02/19 Python
基于Python爬取51cto博客页面信息过程解析
2020/08/25 Python
澳大利亚宠物商店:Petbarn
2017/11/18 全球购物
世界上第一个水枕头:Mediflow
2018/12/06 全球购物
PatPat德国:妈妈的每日优惠
2019/10/02 全球购物
linux面试相关问题
2012/08/11 面试题
计算机专业个人求职自荐信
2013/09/21 职场文书
保卫科工作岗位职责
2014/03/01 职场文书
服务承诺书范文
2014/05/19 职场文书
单位授权委托书范本
2014/09/26 职场文书
英语教师个人总结
2015/02/09 职场文书
管理失职检讨书范文
2015/05/05 职场文书