微信小程序实现多宫格抽奖活动


Posted in Javascript onApril 15, 2020

最近闲来无事,做了一个多宫格抽奖的例子,有什么需要改进或者错误的地方,请留言,谢谢

首先看效果:

微信小程序实现多宫格抽奖活动

思路是先让其转动2圈多,然后再进行抽奖,格子运动用的是setTimeout,让其运行的时间间隔不一样,然后产生运动快慢的效果

好了,上代码

首先是WXML(这里面的判断可能有些绕,仔细按顺序看,因其第五个和第十一个格子在不同手机屏幕大小上的显示有问题,所以再次给它们判断了一下)

<view class="box">
 <view class="boxsub {{luckynum==index?'luck':''}}" wx:for='{{box}}' style="{{index>0&&index<4?'top:0;left:'+index*140+'rpx;':(index>3&&index<8?'right:0;top:'+((index-4)*100)+'rpx;':(index>7&&index<12?'bottom:0;right:'+(index-7)*140+'rpx;':(index>11&&index<14?'left:0;bottom:'+(index-11)*100+'rpx;':'')))}} {{index=='4'?'top:0;':''}} {{index=='11'?'left:0;':''}} " wx:key=''>
  <text class='boxcontent' style='{{item.name.length>6?"line-height:40rpx;margin-top:10rpx;":"line-height:100rpx;"}}'>{{item.name}}</text> 
 
 </view>
 <view class="lucky" catchtap="luckyTap">
 <text class="taplucky">点击抽奖</text>
 <text class="howMany">您还有<text class="howMany_num" >{{howManyNum}}</text>次抽奖机会</text>
 </view>
</view>
<view class="explain">

</view>

WXSS:

.box{
 margin:20rpx 25rpx;
 height: 400rpx;
 width: 698rpx;
 /*border:1px solid #ddd;*/
 position: relative;
 /*box-sizing: border-box;*/
}
.boxsub{
 width: 140rpx;
 height: 100rpx;
 /*border: 1px solid #f00;*/
 box-sizing: border-box;
 position: absolute;
 background: #ff6100;
 border: 1rpx solid #fff;
 
}
.boxcontent{
 text-align: center;
 font-size: 26rpx;
 display: block;
 color: #fff;
}
.lucky{
 width: 300rpx;
 height:130rpx;
 background:#ff6100;/* #ff6100;007FFF*/
 position: absolute;
 left: 0;
 bottom: 0;
 right: 0;
 top: 0rpx;
 margin: auto;
}

.lucky:active{
 opacity: 0.7;
}
.taplucky{
 display: block;
 text-align: center;
 font-size: 30rpx;
 line-height: 50rpx;
 height: 50rpx;
 color: #fff;
 margin-top: 20rpx;
}
.howMany{
 display: block;
 text-align: center;
 font-size: 26rpx;
 color: #fff;
 line-height: 40rpx;
 height: 40rpx;
}
.howMany_num{
 color:#007FFF;
 font-size:32rpx;
 line-height:40rpx;
 padding:0 10rpx;
}
.luck{
 opacity: 0.5;
 background: #ff6100;
}

JS

var time = null;//setTimeout的ID,用clearTimeout清除
Page({
 data: {
 box: [{
 name:'100积分'
 }, {
 name: '10元优惠券\n满100可用'
 }, {
 name: '60积分'
 }, {
 name: '30积分'
 }, {
 name: '50积分'
 }, {
 name: '30元优惠券\n满120可用'
 }, {
 name: '100积分'
 }, {
 name: '200积分'
 }, {
 name: '10积分'
 }, {
 name: '50积分'
 }, {
 name: '40积分'
 }, {
 name: '50优惠券满500可用'
 }, {
 name: '60积分'
 }, {
 name: '70积分'
 }],
 luckynum:0,//当前运动到的位置,在界面渲染
 howManyNum:10,//抽奖的剩余次数
 content:{
 index: 0, //当前转动到哪个位置,起点位置
 count: 0, //总共有多少个位置
 speed: 50, //初始转动速度
 cycle: 3*14, //转动基本次数:即至少需要转动多少次再进入抽奖环节,这里设置的是转动三次后进入抽奖环节
 },
 prize:0,//中奖的位置
 luckytapif:true//判断现在是否可以点击
 },
 //点击抽奖
 luckyTap:function(){
 var i=0,
 that=this,
 howManyNum = this.data.howManyNum,//剩余的抽奖次数
 luckytapif = this.data.luckytapif,//获取现在处于的状态
 luckynum = this.data.luckynum,//当前所在的格子
 prize =Math.floor(Math.random()*14) ;//中奖序号,随机生成
 if (luckytapif && howManyNum>0){//当没有处于抽奖状态且剩余的抽奖次数大于零,则可以进行抽奖
 console.log('prize:'+prize);
 this.data.content.count=this.data.box.length;
 this.setData({
 howManyNum:howManyNum-1//更新抽奖次数
 });
 this.data.luckytapif=false;//设置为抽奖状态
 this.data.prize = prize;//中奖的序号
 this.roll();//运行抽奖函数
 } else if (howManyNum == 0 && luckytapif){
 wx.showModal({
 title: '',
 content: '您的抽奖次数已经没有了',
 showCancel:false
 })
 }
 },
//抽奖
 roll:function(){
 var content=this.data.content,
 prize = this.data.prize,//中奖序号
 that=this;
 if (content.cycle - (content.count-prize)>0){//最后一轮的时间进行抽奖
 content.index++;
 content.cycle--;
 this.setData({
 luckynum: content.index%14 //当前应该反映在界面上的位置
 });
 setTimeout(this.roll, content.speed);//继续运行抽奖函数
 }else{
 if (content.index < (content.count*3 + prize)){//判断是否停止

 content.index++; 
 content.speed += (550 /14);//最后一轮的速度,匀加速,最后停下时的速度为550+50
 this.data.content=content;
 this.setData({
  luckynum: content.index % 14
 });
 console.log(content.index, content.speed);//打印当前的步数和当前的速度
 setTimeout(this.roll,content.speed);
 }else{
 //完成抽奖,初始化数据
 console.log('完成');
 content.index =0;
 content.cycle = 3 * 14;
 content.speed = 50;
 this.data.luckytapif = true;
 clearTimeout(time);
 wx.showModal({
  title: '',
  content: '恭喜你抽到了'+that.data.box[prize].name,
  showCancel:false
 })
 }
 }
 },
 onLoad: function (options) {
 
 },
 onReady: function () {
 
 },
 onShow: function () {
 
 },
 onHide: function () {
 
 },
 onUnload: function () {
 
 }
})

完结。

想要学习更多关于抽奖功能的实现,请参考此专题:抽奖功能

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
实例:用 JavaScript 来操作字符串(一些字符串函数)
Feb 15 Javascript
Javascript图像处理—亮度对比度应用案例
Jan 03 Javascript
JS取数字小数点后两位或n位的简单方法
Oct 24 Javascript
JavaScript文件的同步和异步加载的实现代码
Aug 19 Javascript
JS实现闭包中的沙箱模式示例
Sep 07 Javascript
关于react-router/react-router-dom v4 history不能访问问题的解决
Jan 08 Javascript
vue中如何实现pdf文件预览的方法
Jul 12 Javascript
vue-router的HTML5 History 模式设置
Sep 08 Javascript
详解在不使用ssr的情况下解决Vue单页面SEO问题
Nov 08 Javascript
vue动态绑定class的几种常用方式小结
May 21 Javascript
vue项目或网页上实现文字转换成语音播放功能
Jun 09 Javascript
一起深入理解js中的事件对象
Feb 06 Javascript
十分钟带你快速了解React16新特性
Nov 10 #Javascript
JS实现移动端整屏滑动的实例代码
Nov 10 #Javascript
Three.js加载外部模型的教程详解
Nov 10 #Javascript
vue2导航根据路由传值,而改变导航内容的实例
Nov 10 #Javascript
three.js加载obj模型的实例代码
Nov 10 #Javascript
vue router-link传参以及参数的使用实例
Nov 10 #Javascript
vue-router2.0 组件之间传参及获取动态参数的方法
Nov 10 #Javascript
You might like
CakePHP去除默认显示的标题及图标的方法
2008/10/22 PHP
解析php中两种缩放图片的函数,为图片添加水印
2013/06/14 PHP
PHP类和对象相关系统函数与运算符小结
2016/09/28 PHP
tp5.1 实现setInc字段自动加1
2019/10/18 PHP
在IE模态窗口中自由查看HTML源码的方法
2007/03/08 Javascript
javascript通过获取html标签属性class实现多选项卡的方法
2015/07/27 Javascript
原生JavaScript编写canvas版的连连看游戏
2016/05/29 Javascript
浅谈javascript中的加减时间
2016/07/12 Javascript
js实现可键盘控制的简单抽奖程序
2016/07/13 Javascript
js 将图片连接转换成base64格式的简单实例
2016/08/10 Javascript
vue分页组件table-pagebar使用实例解析
2020/11/15 Javascript
微信小程序教程系列之设置标题栏和导航栏(7)
2020/06/29 Javascript
基于DOM节点删除之empty和remove的区别(详解)
2017/09/11 Javascript
Angular2管道Pipe及自定义管道格式数据用法实例分析
2017/11/29 Javascript
vue2.x+webpack快速搭建前端项目框架详解
2017/11/30 Javascript
解决Vue+Element ui开发中碰到的IE问题
2018/09/03 Javascript
浅谈webpack SplitChunksPlugin实用指南
2018/09/17 Javascript
js实现搜索栏效果
2018/11/16 Javascript
改进 JavaScript 和 Rust 的互操作性并深入认识 wasm-bindgen 组件
2019/07/13 Javascript
微信小程序bindtap事件与冒泡阻止详解
2019/08/08 Javascript
在vue中实现嵌套页面(iframe)
2020/07/30 Javascript
JavaScript实现表单验证功能
2020/12/09 Javascript
[32:39]完美世界DOTA2联赛循环赛 Forest vs Inki BO2第一场 11.04
2020/11/04 DOTA
python+matplotlib实现动态绘制图片实例代码(交互式绘图)
2018/01/20 Python
python将类似json的数据存储到MySQL中的实例
2019/07/12 Python
Python连接Oracle之环境配置、实例代码及报错解决方法详解
2020/02/11 Python
如何创建一个Flask项目并进行简单配置
2020/11/18 Python
HTML5新增属性data-*和js/jquery之间的交互及注意事项
2017/08/08 HTML / CSS
伦敦哈德森鞋:Hudson Shoes
2018/02/06 全球购物
英国鞋网:Rubber Sole
2020/03/03 全球购物
某IT外企面试题-二分法求方程!看看大家的C++功底
2015/07/04 面试题
《长城和运河》教学反思
2014/04/14 职场文书
教师作风建设剖析材料
2014/10/11 职场文书
民用住房租房协议书
2014/10/29 职场文书
python热力图实现的完整实例
2022/06/25 Python
css中:last-child不生效的解决方法
2022/08/05 HTML / CSS