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


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 兼容多浏览器的回车和鼠标焦点事件代码(IE6/7/8,firefox,chrome)
Apr 14 Javascript
javascript 学习笔记(八)javascript对象
Apr 12 Javascript
Jquery 实现弹出层插件
Jan 28 Javascript
javascript实现的右下角弹窗实例
Apr 24 Javascript
如何解决ligerUI布局时Center中的Tab高度大小
Nov 24 Javascript
jquery实现简单文字提示效果
Dec 02 Javascript
AngularJS入门教程之Scope(作用域)
Jul 27 Javascript
Angular中封装fancyBox(图片预览)遇到问题小结
Sep 01 Javascript
vue+axios+element ui 实现全局loading加载示例
Sep 11 Javascript
JS通过ajax + 多列布局 + 自动加载实现瀑布流效果
May 30 Javascript
JavaScript实现像雪花一样的Hexaflake分形
Jul 07 Javascript
Javascript异步流程控制之串行执行详解
Sep 27 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
《魔兽争霸3:重制版》翻车了?你想要的我们都没有
2019/11/07 魔兽争霸
linux下使用ThinkPHP需要注意大小写导致的问题
2011/08/02 PHP
一些实用的jQuery代码片段收集
2011/07/12 Javascript
js事件(Event)知识整理
2012/10/11 Javascript
jQuery实现点击文本框弹出热门标签的提示效果
2013/11/17 Javascript
jQuery中选择器小问题(新人难免遇到)
2014/03/31 Javascript
JQuery点击事件回到页面顶部效果的实现代码
2016/05/24 Javascript
JavaScript编码风格指南(中文版)
2016/08/26 Javascript
jquery代码规范让代码越来越好看
2017/02/03 Javascript
nodejs中全局变量的实例解析
2017/03/07 NodeJs
详解VueJS应用中管理用户权限
2018/02/02 Javascript
VUE接入腾讯验证码功能(滑块验证)备忘
2019/05/07 Javascript
小程序云函数调用API接口的方法
2019/05/17 Javascript
p5.js绘制创意自画像
2019/11/04 Javascript
JavaScript实现Tab选项卡切换
2020/02/13 Javascript
Python的Flask框架标配模板引擎Jinja2的使用教程
2016/07/12 Python
python实现校园网自动登录的示例讲解
2018/04/22 Python
基于Django框架利用Ajax实现点赞功能实例代码
2018/08/19 Python
python实现抽奖小程序
2020/04/15 Python
在python中实现同行输入/接收多个数据的示例
2019/07/20 Python
django的model操作汇整详解
2019/07/26 Python
python实现批量处理将图片粘贴到另一张图片上并保存
2019/12/12 Python
python中property和setter装饰器用法
2019/12/19 Python
django数据模型(Model)的字段类型解析
2019/12/25 Python
使用K.function()调试keras操作
2020/06/17 Python
详解Html5原生拖拽操作
2018/01/12 HTML / CSS
浅谈HTML5新增和废弃的标签
2019/04/28 HTML / CSS
英国剑桥包官网:The Cambridge Satchel Company
2016/08/01 全球购物
美国网上花店:JustFlowers
2017/02/12 全球购物
英国假发网站:Hothair
2018/02/23 全球购物
ETO男装官方网店:ETO Jeans
2019/02/28 全球购物
四查四看剖析材料
2014/02/14 职场文书
催款律师函范文
2015/05/27 职场文书
惊涛骇浪观后感
2015/06/05 职场文书
用Python提取PDF表格的方法
2021/04/11 Python
Spring Boot 启动、停止、重启、状态脚本
2021/06/26 Java/Android