一. 录制视频
二. 代码
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 -= 30
if (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 = 0
self.isLotteryIng = false
self.lotteryResultCallback()
} else if (self.countNum - self.runs_now <= 10) {
// 下降期间
self.speed += 20
} else {
// 缓冲区间
self.speed += 10
if (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 false
self.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 是设定的到达该用户所得奖品的总共步数。