一. 录制视频

6735602592950965007.MP4 (633.06KB)

二. 代码

HTML

  1. <div class="lottery-machine"></div>
  2. <div class="j-lottery-start lottery-start-btn"></div>

JS

  1. import $ from 'jquery'
  2. class Lottery {
  3. /**
  4. * 抽奖组件
  5. * @param {string} - 抽奖容器
  6. * @param {boolean} - 是否需要登录
  7. * @param {number} - 抽奖次数
  8. * @param {number} - 抽奖动画持续时间
  9. * @param {array/object} - 奖品信息
  10. */
  11. constructor ({
  12. lotteryEl,
  13. isLogin = true,
  14. prizeObjArray,
  15. lotteryResultCallback,
  16. minturns = 8,
  17. lastestIndex = 0
  18. }) {
  19. Object.assign(this, {
  20. lotteryEl: lotteryEl,
  21. isLogin: isLogin,
  22. prizeObjArray,
  23. lotteryResultCallback: lotteryResultCallback,
  24. // 高亮位置
  25. lastestIndex: lastestIndex,
  26. // 最小圈数
  27. minturns: minturns,
  28. // 当前进过的步数
  29. runs_now: 0,
  30. // 当前用户中奖情况
  31. finalIndex: 2,
  32. // 启动速度
  33. speed: 300,
  34. // 最快速度
  35. max_speed: 40,
  36. // 触发开始抽奖元素
  37. lotteryStartbtnEl: '.j-lottery-start',
  38. // 是否正在进行中
  39. isLotteryIng: false
  40. })
  41. this.initLotterySkeleton()
  42. this.lotteryFuncEvent()
  43. }
  44. /** 组件结构代码 非必须 */
  45. initLotterySkeleton () {
  46. const html = `<img src="https://img1.dxycdn.com/2019/0906/267/3366737516631409096-2.png" alt="" />
  47. <div class="prize-roulette">
  48. <ul>
  49. ${this.prizeObjArray
  50. .map((item, index) => {
  51. return `<li class="single-prize ${
  52. index === this.lastestIndex ? 'active' : ''
  53. }"><div class="item">${item.label}</div></li>`
  54. })
  55. .join('')}
  56. </ul>
  57. </div>`
  58. $(this.lotteryEl).html(html)
  59. }
  60. rolling () {
  61. const self = this
  62. // 正在进行中
  63. self.isLotteryIng = true
  64. // 定时器记录步数
  65. let myInterval = setTimeout(function () {
  66. self.rolling()
  67. }, self.speed)
  68. // 增加一个单位步数
  69. self.runs_now++
  70. // 根据获奖信息算出总共需要的步数
  71. this.countNum = this.minturns * 4 + self.finalIndex
  72. // 动画速度调节
  73. if (self.runs_now <= (self.countNum / 3) * 2) {
  74. // 上升期间
  75. self.speed -= 30
  76. if (self.speed <= self.max_speed) {
  77. self.speed = self.max_speed // 最高速度为 40
  78. }
  79. } else if (self.runs_now >= self.countNum) {
  80. // 抽奖结束 1. 清除定时器 2. 数据 reset 3. 结束回调
  81. clearInterval(myInterval)
  82. // self.runs_now = 0
  83. self.isLotteryIng = false
  84. self.lotteryResultCallback()
  85. } else if (self.countNum - self.runs_now <= 10) {
  86. // 下降期间
  87. self.speed += 20
  88. } else {
  89. // 缓冲区间
  90. self.speed += 10
  91. if (self.speed >= 100) {
  92. self.speed = 100 // 最低速度为 100
  93. }
  94. }
  95. // 渲染当前高亮位置
  96. self.renderActiveIndex(self.runs_now % 4)
  97. }
  98. lotteryFuncEvent () {
  99. const self = this
  100. $('body').on('click', self.lotteryStartbtnEl, function () {
  101. if (self.isLotteryIng) return false
  102. self.rolling()
  103. })
  104. }
  105. /**
  106. * 渲染当前高亮位置
  107. * @param {number} - index 当前位置 0,1,2,3
  108. */
  109. renderActiveIndex (index) {
  110. const prizeLi = $('.prize-roulette li')
  111. prizeLi
  112. .removeClass('active')
  113. .eq(index)
  114. .addClass('active')
  115. }
  116. }
  117. new Lottery({
  118. lotteryEl: '.lottery-container .lottery-content .lottery-machine',
  119. isLogin: true,
  120. lastestIndex: 0,
  121. minturns: 15,
  122. // 奖品设置
  123. prizeObjArray: [
  124. {
  125. id: 1,
  126. label: '100元 优惠券'
  127. },
  128. {
  129. id: 2,
  130. label: '200元 优惠券'
  131. },
  132. {
  133. id: 3,
  134. label: '500元 优惠券'
  135. },
  136. {
  137. id: 4,
  138. label: '再接再厉'
  139. }
  140. ],
  141. lotteryResultCallback: function () {
  142. // 抽奖结束回调函数
  143. }
  144. })

三. 函数解析

rolling 函数的作用是调节走马灯转动时,不同时间段的速度。
this.countNum 是设定的到达该用户所得奖品的总共步数。