vue实现九宫格抽奖

1.使用说明代码内图片引用的事本地图片,使用时请自行准备图片 ,注意引用路径

<template>
    <div id="app">
        <h1 class="title">VUE实现九宫格抽奖</h1>
        <div class="lottery">
            <div class="lottery-item">
                <div class="lottery-start">
                    <div class="box gray" v-if="isStart===0">
                        <p>活动未开始</p>
                    </div>
                    <div class="box" @click="startLottery" v-if="isStart===1">
                        <p><b>抽奖</b></p>
                        <p>消耗{{score}}积分</p>
                    </div>
                    <div class="box gray" v-if="isStart===2">
                        <p>活动已过期</p>
                    </div>
                </div>
                <ul>
                    <li v-for="(item,i) in list" :class="i==index?'on':''">
                        <div class="box">
                            <p><img :src="item.img" alt=""></p>
                            <p>{{item.title}}</p>
                        </div>
                    </li>
                </ul>
            </div>
        </div>
        <!-- 中奖弹窗 -->
        <div class="mask" v-if="showToast"></div>
        <div class="lottery-alert" v-if="showToast">
            <h1>恭喜您</h1>
            <p><img src="./assets/j2.png" alt=""></p>
            <h2>获得{{list[index].title}}</h2>
            <div class="btnsave" @click="showToast=false">确定</div>
        </div>
    </div>
</template>
<script>
    export default {
        name: 'app',
        data() {
            return {
                isStart: 1,
                score: 10, //消耗积分
                list: [{
                        img: require('./assets/j1.png'),
                        title: '谢谢参与'
                    },
                    {
                        img: require('./assets/j2.png'),
                        title: '美女一个'
                    },
                    {
                        img: require('./assets/j1.png'),
                        title: '宝马一辆'
                    },
                    {
                        img: require('./assets/j2.png'),
                        title: '单车一辆'
                    },
                    {
                        img: require('./assets/j1.png'),
                        title: '鸡蛋一蓝'
                    },
                    {
                        img: require('./assets/j2.png'),
                        title: '500红包'
                    },
                    {
                        img: require('./assets/j1.png'),
                        title: '靓号一个'
                    },
                    {
                        img: require('./assets/j2.png'),
                        title: '鲜花一蓝'
                    }
                ], //奖品1-9     
                index: 0, // 当前转动到哪个位置,起点位置
                count: 8, // 总共有多少个位置
                timer: 0, // 每次转动定时器
                speed: 200, // 初始转动速度
                times: 0, // 转动次数
                cycle: 50, // 转动基本次数:即至少需要转动多少次再进入抽奖环节
                prize: -1, // 中奖位置
                click: true,//标识是否处于抽奖状态
                showToast: false, //显示中奖弹窗        
            }
        },
        methods: {
            //抽奖方法
            startLottery() {
                if (!this.click) {
                    return
                }
                this.startRoll();
            },
            // 开始转动
            startRoll() {
                this.times += 1 // 转动次数
                this.oneRoll() // 转动过程调用的每一次转动方法,这里是第一次调用初始化 
                // 如果当前转动次数达到要求 && 目前转到的位置是中奖位置
                if (this.times > this.cycle + 10 && this.prize === this.index) {
                    clearTimeout(this.timer) // 清除转动定时器,停止转动
                    this.prize = -1
                    this.times = 0
                    this.speed = 200
                    this.click = true;
                    var that = this;
                    setTimeout(res => {
                        that.showToast = true;
                    }, 500)
                } else {
                    if (this.times < this.cycle) {
                        this.speed -= 10 // 加快转动速度
                    } else if (this.times === this.cycle) {
                        const index = parseInt(Math.random() * 10, 0) || 0; // 随机获得一个中奖位置
                        this.prize = index; //中奖位置,可由后台返回 
                        if (this.prize > 7) {
                            this.prize = 7
                        }
                    } else if (this.times > this.cycle + 10 && ((this.prize === 0 && this.index === 7) || this.prize === this.index +
                            1)) {
                        this.speed += 110
                    } else {
                        this.speed += 20
                    }
                    if (this.speed < 40) {
                        this.speed = 40
                    }
                    this.timer = setTimeout(this.startRoll, this.speed)
                }
            },

            // 每一次转动
            oneRoll() {
                let index = this.index // 当前转动到哪个位置
                const count = this.count // 总共有多少个位置
                index += 1
                if (index > count - 1) {
                    index = 0
                }
                this.index = index
            },
        }
    }
</script>

<style>
    #app {
        font-family: 'Avenir', Helvetica, Arial, sans-serif;
        -webkit-font-smoothing: antialiased;
        -moz-osx-font-smoothing: grayscale;
        text-align: center;
        color: #2c3e50;
        margin-top: 60px;
    }

    * {
        margin: 0px;
        padding: 0px;
        box-sizing: border-box;
    }

    body {
        background: radial-gradient(49% 160%, #22b5ff 0, #3a72fa 100%);
        font-size: 14px;
    }

    img {
        border: 0px;
    }

    ul,
    li {
        list-style-type: none;
    }

    .lottery-box {
        overflow: hidden;
    }

    .lottery-box .title {
        text-align: center;
        padding: 50px 0;
        font-size: 18px;
        color: #fff;
    }

    .lottery {
        animation: changeBg .5s ease infinite;
        overflow: hidden;
        padding: 20px;
        width: 400px;
        margin: 0 auto;
        background-repeat: no-repeat;
        background-size: 100% 100%;
        margin-top: 20px;
    }

    @keyframes changeBg {
        0% {
            background-image: url(./assets/k1.png);
        }

        100% {
            background-image: url(./assets/k2.png);
        }
    }

    .lottery .lottery-item {
        height: 340px;
        position: relative;
        margin-top: 10px;
        margin-left: 10px;
    }

    .lottery .lottery-item ul li {
        width: 33.33333333%;
        position: absolute;
        padding-right: 10px;
    }

    .lottery .lottery-item ul li:nth-child(2) {
        left: 33.33333333%;
    }

    .lottery .lottery-item ul li:nth-child(3) {
        left: 66.66666666%;
    }

    .lottery .lottery-item ul li:nth-child(4) {
        left: 66.66666666%;
        top: 110px;
    }

    .lottery .lottery-item ul li:nth-child(5) {
        left: 66.66666666%;
        top: 220px;
    }

    .lottery .lottery-item ul li:nth-child(6) {
        left: 33.33333333%;
        top: 220px;
    }

    .lottery .lottery-item ul li:nth-child(7) {
        left: 0;
        top: 220px;
    }

    .lottery .lottery-item ul li:nth-child(8) {
        left: 0;
        top: 110px;
    }

    .lottery .lottery-item ul li .box {
        height: 100px;
        position: relative;
        text-align: center;
        overflow: hidden;
        background: url(./assets/bg2.png) no-repeat center;
        background-size: 100% 100%;
    }

    .lottery .lottery-item ul li .box img {
        display: block;
        height: 50px;
        margin: 0 auto;
        margin-top: 10px;
        margin-bottom: 5px;
    }

    .lottery .lottery-item ul li .box p {
        color: #708ABF;
        white-space: nowrap;
        overflow: hidden;
        text-overflow: ellipsis;
        font-size: 14px;
    }

    .lottery .lottery-item ul li.on .box {
        background: url(./assets/bg1.png) no-repeat center;
        background-size: 100% 100%;
    }

    .lottery .lottery-item ul li.on .box p {
        color: #fff;
    }

    .lottery .lottery-item .lottery-start {
        position: absolute;
        left: 33.33333333%;
        width: 33.33333333%;
        top: 110px;
        padding-right: 10px;
    }

    .lottery .lottery-item .lottery-start .box {
        height: 100px;
        font-size: 14px;
        color: #fff;
        cursor: pointer;
        text-align: center;
        overflow: hidden;
        background: url(./assets/bg1.png) no-repeat center;
        background-size: 100% 100%;
    }

    .lottery .lottery-item .lottery-start .box p b {
        font-size: 40px;
        margin-top: 16px;
        margin-bottom: 15px;
        line-height: 30px;
        display: block;
    }

    .lottery .lottery-item .lottery-start .box:active {
        opacity: 0.7;
    }

    .lottery .lottery-item .lottery-start .box.gray {
        background: url(./assets/bg3.png) no-repeat center;
        background-size: 100% 100%;
    }

    .lottery .lottery-item .lottery-start .box.gray p {
        color: #708ABF;
        font-weight: bold;
    }

    .mask {
        width: 100%;
        height: 100%;
        background: rgba(0, 0, 0, 0.7);
        position: fixed;
        overflow: hidden;
        z-index: 222;
        top: 0;
        left: 0;
    }

    .lottery-alert {
        max-width: 400px;
        text-align: center;
        z-index: 10000;
        border-radius: 10px;
        background: #fff;
        padding: 20px;
        position: fixed;
        left: 0;
        right: 0;
        margin: auto;
        top: 50%;
        transform: translateY(-50%);
    }

    .lottery-alert h1 {
        font-size: 18px;
        font-weight: bold;
        color: #D92B2F;
    }

    .lottery-alert img {
        display: block;
        height: 120px;
        margin: 0 auto;
    }

    .lottery-alert h2 {
        font-weight: normal;
        color: #D92B2F;
        font-size: 15px;
        padding-top: 15px;
    }

    .lottery-alert p {
        color: #666;
        font-size: 16px;
        padding-top: 5px;
    }

    .lottery-alert .btnsave {
        border-radius: 3px;
        box-shadow: none;
        height: 40px;
        cursor: pointer;
        line-height: 40px;
        color: #fff;
        margin-top: 12px;
        background: linear-gradient(180deg, rgba(213, 60, 63, 1) 0%, rgba(201, 20, 24, 1) 100%);
        font-size: 16px;
    }
</style>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,951评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,606评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,601评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,478评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,565评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,587评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,590评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,337评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,785评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,096评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,273评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,935评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,578评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,199评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,440评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,163评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,133评论 2 352