一. 录制视频
二. 代码
HTML
<div class="lottery-machine"></div><div class="j-lottery-start lottery-start-btn"></div>
JS
import $ from 'jquery'class Lottery {/*** 抽奖组件* @param {string} - 抽奖容器* @param {boolean} - 是否需要登录* @param {number} - 抽奖次数* @param {number} - 抽奖动画持续时间* @param {array/object} - 奖品信息*/constructor ({lotteryEl,isLogin = true,prizeObjArray,lotteryResultCallback,minturns = 8,lastestIndex = 0}) {Object.assign(this, {lotteryEl: lotteryEl,isLogin: isLogin,prizeObjArray,lotteryResultCallback: lotteryResultCallback,// 高亮位置lastestIndex: lastestIndex,// 最小圈数minturns: minturns,// 当前进过的步数runs_now: 0,// 当前用户中奖情况finalIndex: 2,// 启动速度speed: 300,// 最快速度max_speed: 40,// 触发开始抽奖元素lotteryStartbtnEl: '.j-lottery-start',// 是否正在进行中isLotteryIng: false})this.initLotterySkeleton()this.lotteryFuncEvent()}/** 组件结构代码 非必须 */initLotterySkeleton () {const html = `<img src="https://img1.dxycdn.com/2019/0906/267/3366737516631409096-2.png" alt="" /><div class="prize-roulette"><ul>${this.prizeObjArray.map((item, index) => {return `<li class="single-prize ${index === this.lastestIndex ? 'active' : ''}"><div class="item">${item.label}</div></li>`}).join('')}</ul></div>`$(this.lotteryEl).html(html)}rolling () {const self = this// 正在进行中self.isLotteryIng = true// 定时器记录步数let myInterval = setTimeout(function () {self.rolling()}, self.speed)// 增加一个单位步数self.runs_now++// 根据获奖信息算出总共需要的步数this.countNum = this.minturns * 4 + self.finalIndex// 动画速度调节if (self.runs_now <= (self.countNum / 3) * 2) {// 上升期间self.speed -= 30if (self.speed <= self.max_speed) {self.speed = self.max_speed // 最高速度为 40}} else if (self.runs_now >= self.countNum) {// 抽奖结束 1. 清除定时器 2. 数据 reset 3. 结束回调clearInterval(myInterval)// self.runs_now = 0self.isLotteryIng = falseself.lotteryResultCallback()} else if (self.countNum - self.runs_now <= 10) {// 下降期间self.speed += 20} else {// 缓冲区间self.speed += 10if (self.speed >= 100) {self.speed = 100 // 最低速度为 100}}// 渲染当前高亮位置self.renderActiveIndex(self.runs_now % 4)}lotteryFuncEvent () {const self = this$('body').on('click', self.lotteryStartbtnEl, function () {if (self.isLotteryIng) return falseself.rolling()})}/*** 渲染当前高亮位置* @param {number} - index 当前位置 0,1,2,3*/renderActiveIndex (index) {const prizeLi = $('.prize-roulette li')prizeLi.removeClass('active').eq(index).addClass('active')}}new Lottery({lotteryEl: '.lottery-container .lottery-content .lottery-machine',isLogin: true,lastestIndex: 0,minturns: 15,// 奖品设置prizeObjArray: [{id: 1,label: '100元 优惠券'},{id: 2,label: '200元 优惠券'},{id: 3,label: '500元 优惠券'},{id: 4,label: '再接再厉'}],lotteryResultCallback: function () {// 抽奖结束回调函数}})
三. 函数解析
rolling 函数的作用是调节走马灯转动时,不同时间段的速度。
this.countNum 是设定的到达该用户所得奖品的总共步数。

