基于JQuery和ES6的前端轮转抽奖
来源:互联网 发布:淘宝网班尼路 编辑:程序博客网 时间:2024/05/19 04:51
设计思路: 先匀速转动三圈,之后在礼物前五个开始减速,最后停在礼物上即选中预设的礼物。如此循环,直至抽中三个礼物。
先将前端设计好:
<div id="luckyActivity"> <div id="choujiang"> <div id="luck"> <div class="luckList1"> <div class="luckItem"><a class="i1" data-intro="礼物1"></a></div> <div class="luckItem"><a class="i2" data-intro="礼物2"></a></div> <div class="luckItem"><a class="i3" data-intro="礼物3"></a></div> <div class="luckItem"><a class="i4" data-intro="礼物4"></a></div> </div> <div class="luckList2"> <div class="luckGroup"> <div class="luckItem"><a class="i12" data-intro="礼物12"></a></div> <div class="luckItem"><a class="i11" data-intro="礼物11"></a></div> </div> <div id="luckBtn"> <a id="iwanna">我要抽奖</a> <p class="luckInfo">随机抽取3样奖品</p> </div> <div class="luckGroup"> <div class="luckItem"><a class="i5" data-intro="礼物5"></a></div> <div class="luckItem"><a class="i6" data-intro="礼物6"></a></div> </div> </div> <div class="luckList3"> <div class="luckItem"><a class="i10" data-intro="礼物10"></a></div> <div class="luckItem"><a class="i9" data-intro="礼物9"></a></div> <div class="luckItem"><a class="i8" data-intro="礼物8"></a></div> <div class="luckItem"><a class="i7" data-intro="礼物7"></a></div> </div> </div> </div>
这里要注意的是礼物的顺序以及编号,左上角为1号礼物,以此顺时针推算,最后一个礼物为12号。
data-intro用来为礼物的描述做铺垫,我们可以为每一个礼物添加hover效果:
代码如下:
$('.luckItem a').hover(function() { $(this).addClass('prizeIntro'); }, function() { $(this).removeClass('prizeIntro'); })
.prizeIntro:after { content: attr(data-intro); display: block; position: absolute; top: 48px; height: 29px; width: 75px; font-size: 14px; color: #fff; line-height: 29px; text-align: center; background-color: rgba(0, 0, 0, 0.7); }
其次,就是轮转的核心部分了。
var prizeIndex = 1; // 礼物序号var liwu = [7, 5, 11]; // 后端值(将要选取的三个礼物)var l = 0; // liwu[l]var distance = 5; //距离多少格前开始减速function roundPrize() { //此方法的作用是使我们的选中框先匀速转三圈 return new Promise(function(resolve) { var timeStep = 45; // 转动速度(毫秒) var round = 0; // 用于记录转了多少下 setTimeout(function(){ $('.luckItem a').removeClass('onPrize'); $('.i'+ prizeIndex++ ).addClass('onPrize'); if(prizeIndex > 12) { //转12次一循环 prizeIndex = 1; } //算法中最复杂的往往是数学部分 //转动次数是确定于一个值的,譬如我们要选取的第一个礼物是5号,那么我们应该转动36次(在被选取礼物前五格开始减速) //其次我们在实际测试中会发现,如果后一个礼物值小于前一个(liwu[l] - liwu[l-1] < 0)的情况下,选中框只转两圈就开始减速了,因此我们需要做一个判断,在 小于0 的情况下加上12(即加一圈) if( round++ < ( ( liwu[l] - (liwu[l-1] || 0) ) > 0 ? 36 : 48 ) + liwu[l] - (distance + 1) - ( (liwu[l-1]) || 0 ) ) { setTimeout(arguments.callee, timeStep); } else { resolve(); } },timeStep) }) }
至此,我们完成了匀速转动的效果,接着就是减速的部分:
$('#iwanna').click(function() { $('.i'+ prizeIndex).addClass('onPrize'); $('.luckInfo').hide(); $('#iwanna').text('抽奖中...'); var call = arguments.callee; roundPrize().then(function() { let timeStep = 200; // 初速度 var ratio = 1.5; // 速率变化系数 var endline = Math.floor( timeStep * Math.pow(ratio, distance-1) ); setTimeout(function() { $('.luckItem a').removeClass('onPrize'); $('.i'+ prizeIndex++ ).addClass('onPrize'); //'.onPrize'即滚动中的选中效果 if(prizeIndex > 12) { prizeIndex = 1; } if(timeStep < endline) { timeStep *= ratio; setTimeout(arguments.callee, timeStep); } else { $('.onPrize').parent().addClass('prizeMe').end().removeClass('onPrize'); //'.prizeMe'即礼物选中的CSS样式 l++; // 下一份礼物 if(l < 3) { //循环三次即选三次礼物 setTimeout(call, 1000) } else { $('.luckItem a').removeClass('onPrize'); //此处可以添加结束事件 } } }, timeStep) }) })
在部分老版本编辑环境中 ES6 语法可能会报错,但这并不影响在浏览器中的运行。
阅读全文
0 0
- 基于JQuery和ES6的前端轮转抽奖
- jquery实现转盘抽奖--基于奖品转动的转盘
- jquery.rotate.js可选抽奖次数和中奖内容的转盘抽奖demo
- 基于优先权的时间片轮转算法
- JQUERY图片轮转的改进版本
- 基于jquery 的前端分页插件
- 基于JAVA的抽奖系统
- 基于redis的抽奖解决方案
- 前端面试纪实(三):ES6的const和let
- 抽奖转盘的jquery实现
- 基于es6的promisify
- jquery 抽奖
- react基于webpack和babel以及es6的项目搭建
- 通过 ES6 Promise 和 jQuery Deferred 的异同学习 Promise
- jquery图片滚动轮转
- jquery实现图片轮转
- 基于mykernel的时间片轮转调度的实现
- 基于mykernel实现的时间片轮转调度代码分析
- Win10配置Java环境,解决javac不是内部或外部命令的问题
- 华清远见系统移植考试复习题
- PHP中XOR (异或)训练,很久不看PHP,突然发现已经非常强大了,什么SVM、FANN一应俱全了,谁让AI大潮了
- C/C++中产生随机数(rand,srand用法)
- spring-boot之helloworld
- 基于JQuery和ES6的前端轮转抽奖
- ZF
- Android四大组件:BroadcastReceiver
- Struts开发笔记二
- 优秀的前端框架总结
- iOS 获取当前app的名称和版本号
- django1.10官方文档翻译
- Spring Data的简单使用
- QGis二次开发基础 -- 栅格图像增强显示