基于VUE實(shí)現(xiàn)的九宮格抽獎功能
先給大家展示下效果圖:


HTML代碼:
<template>
<div class="luckDraw">
<title-bar :title="title"></title-bar>
<div class="container">
<div class="turntable-wrapper">
<div class="luck-wrapper">
<p class="integral">我的積分: <span>1000</span></p>
<ul class="nineGrid">
<li class="row">
<div v-for="(n, key) in 3" :key="n" :class="index === key ? `active` : ``">
<div class="wrapper">
<img src="../../assets/luck-icon.png" alt="">
<p>8金轉(zhuǎn)</p>
</div>
<div class="mask"></div>
</div>
</li>
<li class="row">
<div :class="index === 7 ? 'active': ''">
<div class="wrapper">
<img src="../../assets/luck-icon.png" alt="">
<p>128金轉(zhuǎn)</p>
</div>
<div class="mask"></div>
</div>
<div class="getLuck" @click="startLottery">
<p>立即<br>抽獎</p>
</div>
<div :class="index === 3 ? 'active': ''">
<div class="wrapper">
<img src="../../assets/luck-icon.png" alt="">
<p>128金轉(zhuǎn)</p>
</div>
<div class="mask"></div>
</div>
</li>
<li class="row">
<div v-for="(n, key) in 3" :key="n" :class="index === 6-key ? `active` : ``">
<div class="wrapper">
<img src="../../assets/luck-icon.png" alt="">
<p>256金轉(zhuǎn)</p>
</div>
<div class="mask"></div>
</div>
</li>
</ul>
</div>
<p class="share">分享領(lǐng)積分 <i class="icon-go"></i></p>
<div class="rule">
<p class="rule-title">活動規(guī)則</p>
<ul class="rule-main">
<li>1、活動時間:2017年9月8日起;</li>
<li>2、活動期間,股事匯用戶每次抽獎消耗20積分,抽獎次數(shù)不限</li>
<li>3、金鉆可用于向投顧提問、送禮、贊賞;</li>
<li>4、積分賺?。好咳蘸灥?、分享文章/問答/直播間、點(diǎn)贊、金鉆充值均可獲得積分哦</li>
<li>5、活動最終解釋權(quán)歸股事匯所有。</li>
</ul>
</div>
<div></div>
</div>
<LuckToast :showToast="showToast" :toastType="toastType" @closeToast="closeToast" @startLottery="startLottery"></LuckToast>
</div>
</div>
</template>
SCSS樣式:
@import "~base";
.luckDraw {
.turntable-wrapper {
padding: 0 px3rem(38);
position: relative;
@include background-cover("background-luck.png");
padding-top: px3rem(121);
.luck-wrapper {
width: px3rem(300);
height: px3rem(377);
margin: 0 auto;
position: relative;
@include background-cover("background-turntable.png");
.integral {
width: 100%;
color: #6d2d00;
font-size: px3rem(16);
font-weight: normal;
text-align: center;
position: absolute;
top: px3rem(58);
span {
font-weight: 600;
color: #ff2f4d;
}
}
.nineGrid {
position: absolute;
top: px3rem(86);
left: 50%;
margin-left: px3rem(-130);
width: px3rem(260);
height: px3rem(260);
li {
height: px3rem(80);
display: flex;
margin-top: px3rem(5);
> div {
flex: 1;
margin-right: px3rem(5);
height: 100%;
text-align: center;
position: relative;
.wrapper {
width: 100%;
height: 100%;
margin: 0;
@include background-cover("background-grid.png");
}
img {
width: px3rem(46);
height: px3rem(38);
vertical-align: middle;
margin-top: px3rem(8);
}
.mask {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
opacity: 0.5;
border-radius: px3rem(10);
background-color: #000;
display: none;
}
}
> div.active {
.mask {
display: block;
}
}
> div:first-child {
margin-left: px3rem(5);
}
> div.getLuck {
@include background-cover("background-getLuck.png");
font-size: 0;
p {
font-size: px3rem(20);
font-weight: 600;
color: #fff;
line-height: 1.1;
margin-top: px3rem(11);
}
}
}
li:last-child {
margin-bottom: px3rem(5);
}
}
}
.share {
width: px3rem(160);
height: px3rem(42);
margin: 0 auto;
text-align: center;
line-height:px3rem(42);
@include background-cover("luckShrae.png");
margin-top: px3rem(22);
color: #6d2d00;
font-size: px3rem(16);
font-weight: 600;
.icon-go {
@include size(30);
@include background-cover("goShare-icon.png");
display: inline-block;
vertical-align: middle;
margin-bottom: px3rem(2);
}
}
.rule {
margin-top: px3rem(14);
color: #fff;
font-size: px3rem(14);
padding-bottom: px3rem(39);
.rule-title {
text-align: center;
position: relative;
font-size: px3rem(16);
margin-bottom: px3rem(14);
}
.rule-title:before,
.rule-title:after {
content: '';
position: absolute;
top: 52%;
background: #fff;
width: 30%;
height: px3rem(1);
}
.rule-title:before {
left: 0;
}
.rule-title:after {
right: 0;
}
}
}
}
JS代碼:
// import Utils from 'utils'
import TitleBar from 'components/TitleBar.vue'
import LuckToast from 'components/luckToast.vue'
export default {
name: 'luckDraw',
components: {
TitleBar,
LuckToast,
},
data () {
return {
title: '積分轉(zhuǎn)盤',
index: -1, // 當(dāng)前轉(zhuǎn)動到哪個位置,起點(diǎn)位置
count: 8, // 總共有多少個位置
timer: 0, // 每次轉(zhuǎn)動定時器
speed: 200, // 初始轉(zhuǎn)動速度
times: 0, // 轉(zhuǎn)動次數(shù)
cycle: 50, // 轉(zhuǎn)動基本次數(shù):即至少需要轉(zhuǎn)動多少次再進(jìn)入抽獎環(huán)節(jié)
prize: -1, // 中獎位置
click: true,
showToast: false,
toastType: 'luck',
}
},
props: {
},
methods: {
// 開始抽獎
startLottery () {
if (!this.click) {
return
}
this.closeToast()
this.speed = 200
this.click = false
this.startRoll()
},
// 開始轉(zhuǎn)動
startRoll () {
this.times += 1 // 轉(zhuǎn)動次數(shù)
this.oneRoll() // 轉(zhuǎn)動過程調(diào)用的每一次轉(zhuǎn)動方法,這里是第一次調(diào)用初始化
// 如果當(dāng)前轉(zhuǎn)動次數(shù)達(dá)到要求 && 目前轉(zhuǎn)到的位置是中獎位置
if (this.times > this.cycle + 10 && this.prize === this.index) {
clearTimeout(this.timer) // 清除轉(zhuǎn)動定時器,停止轉(zhuǎn)動
this.prize = -1
this.times = 0
this.click = true
this.showToast = true
this.toastType = 'comeOn'
console.log('你已經(jīng)中獎了')
} else {
if (this.times < this.cycle) {
this.speed -= 10 // 加快轉(zhuǎn)動速度
} else if (this.times === this.cycle) { // 隨機(jī)獲得一個中獎位置
const index = parseInt(Math.random() * 10, 0) || 0
this.prize = index
if (this.prize > 7) {
this.prize = 7
}
console.log(`中獎位置${this.prize}`)
} 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)
}
},
// 每一次轉(zhuǎn)動
oneRoll () {
let index = this.index // 當(dāng)前轉(zhuǎn)動到哪個位置
const count = this.count // 總共有多少個位置
index += 1
if (index > count - 1) {
index = 0
}
this.index = index
},
// 關(guān)閉彈出框
closeToast () {
this.showToast = false
},
},
beforeMount () {
},
created () {
},
beforeDestroy () {
},
}
總結(jié)
以上所述是小編給大家介紹的基于VUE實(shí)現(xiàn)的九宮格抽獎功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
- vue3實(shí)現(xiàn)抽獎模板設(shè)置
- vue實(shí)現(xiàn)大轉(zhuǎn)盤抽獎功能
- Vue組件實(shí)現(xiàn)數(shù)字滾動抽獎效果
- vue實(shí)現(xiàn)宮格輪轉(zhuǎn)抽獎
- VUE實(shí)現(xiàn)大轉(zhuǎn)盤抽獎
- vue簡單實(shí)現(xiàn)轉(zhuǎn)盤抽獎
- vue組件實(shí)現(xiàn)移動端九宮格轉(zhuǎn)盤抽獎
- Vue.js實(shí)現(xiàn)大轉(zhuǎn)盤抽獎總結(jié)及實(shí)現(xiàn)思路
- vue實(shí)現(xiàn)手機(jī)號碼抽獎上下滾動動畫示例
- vue組件封裝實(shí)現(xiàn)抽獎隨機(jī)數(shù)
相關(guān)文章
基于vue2.0+vuex+localStorage開發(fā)的本地記事本示例
這篇文章主要介紹了基于vue2.0+vuex+localStorage開發(fā)的本地記事本示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-02-02
使用elementuiadmin去掉默認(rèn)mock權(quán)限控制的設(shè)置
這篇文章主要介紹了使用elementuiadmin去掉默認(rèn)mock權(quán)限控制的設(shè)置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04
vue+element下日期組件momentjs轉(zhuǎn)換賦值問題解決
這篇文章主要介紹了vue+element下日期組件momentjs轉(zhuǎn)換賦值問題,記錄下使用momentjs轉(zhuǎn)換日期字符串賦值給element的日期組件報錯問題,需要的朋友可以參考下2024-02-02
vue在?for?循環(huán)里使用異步調(diào)用?async/await的方法
大家都遇到這樣的問題,在使用函數(shù)的async/await異步調(diào)用時候,放在正常函數(shù)中單個調(diào)用時沒有問題的,但是await放在forEach()循環(huán)里面就會報錯,本文給大家介紹vue?如何在?for?循環(huán)里面使用異步調(diào)用?async/await,感興趣的朋友一起看看吧2023-10-10
vue中echarts關(guān)系圖動態(tài)增刪節(jié)點(diǎn)以及連線方式
這篇文章主要介紹了vue中echarts關(guān)系圖動態(tài)增刪節(jié)點(diǎn)以及連線方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07
使用Vite+Vue3+TypeScript?搭建開發(fā)腳手架的詳細(xì)過程
這篇文章主要介紹了Vite+Vue3+TypeScript?搭建開發(fā)腳手架的詳細(xì)過程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-02-02

