16

总是看到类似的九宫格抽奖效果,后来想自己手撸一个试一试吧。
(多多尝试,万一成功了呢 github L6zt)


先来总结一下效果,类似与跑马灯效果,闪动效果先快后慢。
代码解析如下所示:
代码

 <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地址


方糖先生
1.1k 声望1.8k 粉丝