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


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 相关文章推荐
js模拟类继承小例子
Jul 17 Javascript
Extjs的FileUploadField文件上传出现了两个上传按钮
Apr 29 Javascript
JS折半插入排序算法实例
Dec 02 Javascript
JavaScript+html5 canvas绘制渐变区域完整实例
Jan 26 Javascript
JS实现图片局部放大或缩小的方法
Aug 20 Javascript
JS实现兼容火狐及IE iframe onload属性的遮罩层隐藏及显示效果
Aug 23 Javascript
js图片上传前预览功能(兼容所有浏览器)
Aug 24 Javascript
angular 动态组件类型详解(四种组件类型)
Feb 22 Javascript
浅谈Angular4中常用管道
Sep 27 Javascript
JavaScript Array对象使用方法解析
Sep 24 Javascript
javascript数组的定义及操作实例
Nov 10 Javascript
Vue组件化(ref,props, mixin,.插件)详解
May 15 Vue.js
小程序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闭包(Closure)使用详解
2013/05/02 PHP
jquery实现的元素的left增加N像素 鼠标移开会慢慢的移动到原来的位置
2010/03/21 Javascript
在JQuery dialog里的服务器控件 事件失效问题
2010/12/08 Javascript
输入框的字数时时统计—关于 onpropertychange 和 oninput 使用
2011/10/21 Javascript
js判断是否为数组的函数: isArray()
2011/10/30 Javascript
在jQuery ajax中按钮button和submit的区别分析
2012/10/07 Javascript
Extjs4 GridPanel的主要配置参数详细介绍
2013/04/18 Javascript
倒记时60刷新网页的js代码
2014/02/18 Javascript
jQuery后代选择器用法实例
2014/12/23 Javascript
jQuery编程中的一些核心方法简介
2015/08/14 Javascript
JavaScript制作简单的日历效果
2016/03/10 Javascript
jQuery的图片轮播插件PgwSlideshow使用详解
2016/08/11 Javascript
轻松掌握JavaScript策略模式
2016/08/25 Javascript
Angular.js自定义指令学习笔记实例
2017/02/24 Javascript
配置nodejs环境的方法
2017/05/13 NodeJs
解决vue无法设置滚动位置的问题
2018/10/07 Javascript
微信小程序实现选项卡效果
2018/11/06 Javascript
jQuery实现的自定义轮播图功能详解
2018/12/28 jQuery
layer弹出层自适应高度,垂直水平居中的实现
2019/09/16 Javascript
浅谈layui 表单元素的选中问题
2019/10/25 Javascript
vue仿携程轮播图效果(滑动轮播,下方高度自适应)
2021/02/11 Vue.js
python base64 decode incorrect padding错误解决方法
2015/01/08 Python
使用Python求解最大公约数的实现方法
2015/08/20 Python
详谈Python2.6和Python3.0中对除法操作的异同
2017/04/28 Python
修复 Django migration 时遇到的问题解决
2018/06/14 Python
python使用turtle库绘制树
2018/06/25 Python
Python Matplotlib库安装与基本作图示例
2019/01/09 Python
python 获得任意路径下的文件及其根目录的方法
2019/02/16 Python
pandas数据筛选和csv操作的实现方法
2019/07/02 Python
python中取绝对值简单方法总结
2020/07/24 Python
canvas环形倒计时组件的示例代码
2018/06/14 HTML / CSS
FirstCry阿联酋儿童和婴儿产品网上购物:FirstCry.ae
2021/02/22 全球购物
巡警年度自我鉴定
2014/02/21 职场文书
python自动化之如何利用allure生成测试报告
2021/05/02 Python
Python使用scapy模块发包收包
2021/05/07 Python
mysql 乱码 字符集latin1转UTF8
2022/04/19 MySQL