老是看到相似的九宫格抽奖效果,后来想本身手撸一个试一试吧。
(多多尝试,万一成功了呢 github L6zt)jquery
先来总结一下效果,相似与跑马灯效果,闪动效果先快后慢。
代码解析以下所示:
代码git
<div class="gift-container"> <ul> <li> <section class="gift-box active" data-role="0">0</section> <section class="gift-box" data-role="1">1</section> <section class="gift-box" data-role="2">2</section> </li> <li> <section class="gift-box" data-role="7">7</section> <section class="gift-box get-gift-btn" >抽奖</section> <section class="gift-box" data-role="3">3</section> </li> <li> <section class="gift-box" data-role="6">6</section> <section class="gift-box" data-role="5">5</section> <section class="gift-box" data-role="4">4</section> </li> </ul> <div> <label for="gift-num"> <span>抽奖数字<small>0-7</small>:</span> <input type="text" id="gift-num" name="gift-name"> </label> </div> </div> <script src="jquery.js"></script> <script> $(function () { // 奖号dom元素 let $frameList = $('[data-role]'); let $input = $('#gift-num'); // 定时器的值 let k = null; // 奖号dom元素 总长度 let len = null; // 初始化 闪动间隔时间 毫秒数 let initDelayTime = 50; // 抽奖号数 let times = 0; // 抽圈数 let circleCount = 0; // 是否是在抽奖 let isBusy = false; // 抽奖初始 号数 let oldTimes = null; // 抽奖号数 dom元素 作个排序, 分个大小 frameList = Array.from($frameList).sort((a, b) => { return $(a).data('role') - $(b).data('role') }); len = frameList.length; // 抽奖开始效果 function startGiftAm () { // 抽奖第一帧时,给oldTimes 赋值起始抽号数 k || (oldTimes = times); // 当前应激活的元素 let $curItem = $(frameList[(times++) % len]); //抽奖圈数 circleCount = parseInt((times - oldTimes) / len); // 根据圈数 改变 闪动间隔时间 switch (circleCount) { case 0: case 1: { break; } case 2: case 3: { initDelayTime = 100; break; } default : { initDelayTime = 200 } } // $frameList.removeClass('active'); $curItem.addClass('active'); // 若是够四圈 而且 当前抽奖号数等于 结束抽奖号数 终止抽奖, 并初始化抽奖 状态 if(circleCount === 4 && $input.val() == $curItem.data('role')) { circleCount = 0; k = null; isBusy = false; initDelayTime = 50; } else { k = setTimeout(startGiftAm, initDelayTime); } }; // $('.get-gift-btn').on('click', function () { if (!isBusy) { console.log(isBusy); isBusy = true; startGiftAm(); } }) }) </script>
demo地址github