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


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学习2 选择器的使用说明
Feb 07 Javascript
js 自定义的联动下拉框
Feb 07 Javascript
Javascript 检测键盘按键信息及键码值对应介绍
Jan 03 Javascript
JavaScript基于setTimeout实现计数的方法
May 08 Javascript
基于jQuery实现网页打印功能
Dec 01 Javascript
详解JavaScript 中的 replace 方法
Jan 01 Javascript
javascript表单事件处理方法详解
May 15 Javascript
jQuery的Each比JS原生for循环性能慢很多的原因
Jul 05 Javascript
详解js中的apply与call的用法
Jul 30 Javascript
JavaScript正则表达式实例详解
Oct 16 Javascript
基于jQuery实现左侧菜单栏可折叠功能
Dec 27 Javascript
vue中v-text / v-html使用实例代码详解
Apr 02 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多维数组去掉重复值示例分享
2014/03/02 PHP
thinkphp实现like模糊查询实例
2014/10/29 PHP
Zend Framework实现自定义过滤器的方法
2016/12/09 PHP
php获取是星期几的的一些常用姿势
2019/12/15 PHP
分析了一下JQuery中的extend方法实现原理
2015/02/27 Javascript
jQuery中(function($){})(jQuery)详解
2015/07/15 Javascript
详解javascript实现瀑布流绝对式布局
2016/01/29 Javascript
jquery 判断selection range 是否在容器中的简单实例
2016/08/02 Javascript
JavaScript中boolean类型之三种情景实例代码
2016/11/21 Javascript
Java中int与integer的区别(基本数据类型与引用数据类型)
2017/02/19 Javascript
用Vue-cli搭建的项目中引入css报错的原因分析
2017/07/20 Javascript
JavaScript输入分钟、秒倒计时技巧总结(附代码)
2017/08/17 Javascript
JavaScript实现JSON合并操作示例【递归深度合并】
2018/09/07 Javascript
Node.js npm命令运行node.js脚本的方法
2018/10/10 Javascript
vue cli 3.x 项目部署到 github pages的方法
2019/04/17 Javascript
vue实现固定位置显示功能
2019/05/30 Javascript
基于Vue.js与WordPress Rest API构建单页应用详解
2019/09/16 Javascript
[01:17]炒鸡美酒第四天TA暴走
2018/06/05 DOTA
[36:05]完美世界DOTA2联赛循环赛 Forest vs DM 第一场 11.06
2020/11/06 DOTA
python编写分类决策树的代码
2017/12/21 Python
使用python生成目录树
2018/03/29 Python
python3+PyQt5实现自定义分数滑块部件
2018/04/24 Python
python+os根据文件名自动生成文本
2019/03/21 Python
Python中__repr__和__str__区别详解
2019/11/07 Python
pandas将list数据拆分成行或列的实现
2020/12/13 Python
美国的Eastbay旗下的运动款子品牌:Final-Score
2018/01/01 全球购物
贝斯特韦斯特酒店集团官网:Best Western
2019/01/03 全球购物
中文系师范生自荐信
2013/10/01 职场文书
电大学习个人自我评价范文
2013/10/04 职场文书
护士见习期自我鉴定
2014/02/08 职场文书
学雷锋月活动总结
2014/04/25 职场文书
2015教师见习期工作总结
2014/12/12 职场文书
开展警示教育活动总结
2015/05/09 职场文书
有关骆驼祥子的读书笔记
2015/06/26 职场文书
运动会致辞稿
2015/07/29 职场文书
海弦WR-800F
2022/04/05 无线电