前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JavaScript 九宫格抽奖

JavaScript 九宫格抽奖

作者头像
Nian糕
修改2024-03-16 17:02:46
2K0
修改2024-03-16 17:02:46

这是之前国庆活动所做的一个新功能,以往抽奖都是采用转盘的形式,这次换了个新的玩法,折腾了两天才实现,主要代码出自哪里已经无法考究了,我做了部分优化,贴上来给大家参考下

HTML 结构代码

<ul id="lottery" class="clearfix">
    <li class="lottery-unit turn_5">
        <img src="images/turn_1.jpg">
        <div class="mask"></div>
    </li>
    <li class="lottery-unit turn_6">
        <img src="images/turn_2.jpg">
        <div class="mask"></div>
    </li>
    <li class="lottery-unit turn_7">
        <img src="images/turn_3.jpg">
        <div class="mask"></div>
    </li>
    <li class="lottery-unit turn_8">
        <img src="images/turn_4.jpg">
        <div class="mask"></div>
    </li>
    <li class="lottery-unit turn_0">
        <img src="images/turn_5.jpg">
        <div class="mask"></div>
    </li>
    <li class="lottery-unit turn_1">
        <img src="images/turn_6.jpg">
        <div class="mask"></div>
    </li>
    <li class="lottery-unit turn_2">
        <img src="images/turn_7.jpg">
        <div class="mask"></div>
    </li>
    <li class="lottery-unit turn_3">
        <img src="images/turn_8.jpg">
        <div class="mask"></div>
    </li>
    <li class="lottery-unit turn_4">
        <img src="images/turn_9.jpg">
        <div class="mask"></div>
    </li>
</ul>
<a class="rand_btn" href="javascript:void(0);"></a>

CSS 样式如下

#lottery {
    width: 650px;
    height: 650px;
    margin: 100px auto 0;
}
.turn_1, .turn_2, .turn_3, .turn_4, .turn_5, .turn_6, .turn_7, .turn_8, .turn_0 {
    width: 208px;
    height: 208px;
    float: left;
    position: relative;
}
.turn_5, .turn_6, .turn_8, .turn_0, .turn_2, .turn_3 {
    margin-right: 10px;
}
.turn_8, .turn_0, .turn_1, .turn_2, .turn_3, .turn_4 {
    margin-top: 10px;
}
.lottery-unit img {
    width: 208px;
    height: 208px;
}
.active .mask {
    display: block;
}
.mask {
    width: 100%;
    height: 100%;
    position: absolute;
    top: 0;
    left: 0;
    background: url(images/turn_active.png) no-repeat;
    display: none;
}
.rand_btn {
    margin: 60px auto 0;
    display: block;
    width: 40px;
    height: 40px;
    background: url(images/lottery.png) no-repeat;
    background-size: 40px 40px;
}

JavaScript 代码如下,相关的转动次数已经转动速度,看注释就好了

var click = false;
var scratchableLatex = {
    index: -1,     //当前转动到哪个位置,起点位置
    count: 0,      //总共有多少个位置
    timer: 0,      //setTimeout的ID,用clearTimeout清除
    speed: 100,    //初始转动速度
    times: 0,      //转动次数
    cycle: 50,     //转动基本次数:即至少需要转动多少次再进入抽奖环节
    prize: -1,     //中奖位置
    init: function(){
        this.bindEvent();
        this.lotteryInit('lottery');
    },
    bindEvent: function(){
        var that = this;
        $('body').on('click', '.rand_btn', function(){         
            if (click) {
                //click控制一次抽奖过程中不能重复点击抽奖按钮,后面的点击不响应                            
                return false;
            }else{
                that.rotateFunc();  // 转圈过程不响应click事件,会将click置为false
                click = true;       // 一次抽奖完成后,设置click为true,可继续抽奖 
                return false;
            }
        })
    },
    lotteryInit: function(id) {
        if ($('#' + id).find('.lottery-unit').length > 0) {
            $lottery = $('#' + id);
            $units = $lottery.find('.lottery-unit');
            this.obj = $lottery;
            this.count = $units.length;
            $lottery.find('.turn_' + this.index).addClass('active');
        };
    },
    roll: function() {
        var index = this.index;
        var count = this.count;
        var lottery = this.obj;
        $(lottery).find('.turn_' + index).removeClass('active');
        index += 1;
        if (index > count - 1) {
            index = 0;
        };
        $(lottery).find('.turn_' + index).addClass('active');
        this.index = index;
        return false;
    },
    rotateFunc: function(){
        var that = this;
        this.times += 1;
        this.roll();
        if (this.times > this.cycle + 10 && this.prize == this.index) {
            clearTimeout(this.timer);
            this.prize = -1;
            this.times = 0;
            click = false;
        }else {
            if (this.times < this.cycle) {
                this.speed -= 10;
            }else if (this.times == this.cycle) {
                var index = Math.random() * (this.count) | 0; //静态演示,随机产生一个奖品序号,实际需请求接口产生
                this.prize = index;
            }else {
                if (this.times > this.cycle + 10 && ((this.prize == 0 && this.index == 7) || this.prize == this.index + 1)) {
                    this.speed += 80;
                }else {
                    this.speed += 20;
                }
            }
            if (this.speed < 40) {
                this.speed = 40;
            };
            this.timer = setTimeout(function(){
                that.rotateFunc()
            }, this.speed); //循环调用
        }
        return false;
    }
}
scratchableLatex.init();
运行结果
运行结果

本篇的内容到这里就全部结束了,源码我已经发到了 GitHub Source_code 上了,有需要的同学可自行下载,预览效果可点击 effect

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.11.06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档