409 lines
8.6 KiB
Vue
409 lines
8.6 KiB
Vue
<template>
|
||
<view class="lottery_container" style="border-radius: 12px; overflow: hidden">
|
||
<view
|
||
class="grid_wrap"
|
||
:style="{
|
||
width: `${+size}rpx`,
|
||
height: `${+size}rpx`,
|
||
}"
|
||
>
|
||
<view
|
||
class="lottery_wrap"
|
||
:style="{
|
||
'--liBg': backgroundColor,
|
||
}"
|
||
>
|
||
<!-- @click="beginBefore(index)" -->
|
||
<ul class="lottery_grid">
|
||
<li
|
||
v-for="(item, index) in prizeData"
|
||
:class="{ active: current_index == index && index != 8 }"
|
||
:key="index"
|
||
:data-index="index"
|
||
:style="{
|
||
boxShadow: `0upx 8upx 0upx 0upx ${borderColor}`,
|
||
'--activeBackgroundColor': activeBackgroundColor,
|
||
}"
|
||
>
|
||
<image v-if="index != 8" class="grid_img" mode="aspectFit" :src="item[keyImage]" alt="" />
|
||
{{ index == 8 ? '' : item[keyName] }}
|
||
</li>
|
||
<li class="img-btn" style="width: 28%; height: 28%">
|
||
<slot></slot>
|
||
</li>
|
||
</ul>
|
||
</view>
|
||
<view
|
||
class="lottery_wrap_border"
|
||
v-if="isShowLamp"
|
||
:style="{
|
||
'--evenBg': backgroundColorEven,
|
||
'--oddBg': backgroundColorOdd,
|
||
}"
|
||
>
|
||
<ul v-for="(item, index) in 4" :key="index" :style="{ background: squareBorderColor }">
|
||
<li v-for="(item, index) in 12" :key="index"></li>
|
||
</ul>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
</template>
|
||
|
||
<script>
|
||
export default {
|
||
name: 'benben-lucky-draw-square',
|
||
data() {
|
||
return {
|
||
current_index: -1,
|
||
count: 0,
|
||
totalCount: 6,
|
||
startIndex: 0,
|
||
timer: null,
|
||
speed: 50,
|
||
winingIndex: 3,
|
||
throttle: false,
|
||
}
|
||
},
|
||
props: {
|
||
isShowLamp: {
|
||
type: Boolean,
|
||
default: true,
|
||
},
|
||
prizeData: {
|
||
type: Array,
|
||
default: () => [],
|
||
},
|
||
//方块背景色
|
||
backgroundColor: {
|
||
type: String,
|
||
default: '',
|
||
},
|
||
//方块的下边框阴影
|
||
borderColor: {
|
||
type: String,
|
||
default: '',
|
||
},
|
||
//九宫格边框颜色
|
||
squareBorderColor: {
|
||
type: String,
|
||
default: '',
|
||
},
|
||
//三角块背景色even
|
||
backgroundColorEven: {
|
||
type: String,
|
||
default: '',
|
||
},
|
||
//三角块背景色odd
|
||
backgroundColorOdd: {
|
||
type: String,
|
||
default: '',
|
||
},
|
||
//转盘大小
|
||
size: {
|
||
type: [Number, String],
|
||
default: 650,
|
||
},
|
||
//中奖背景色
|
||
activeBackgroundColor: {
|
||
type: String,
|
||
default: '',
|
||
},
|
||
//id
|
||
keyId: {
|
||
type: [String, Number],
|
||
default: 'id',
|
||
},
|
||
keyName: {
|
||
type: String,
|
||
default: 'name',
|
||
},
|
||
keyImage: {
|
||
type: String,
|
||
default: 'image',
|
||
},
|
||
},
|
||
onLoad() {},
|
||
computed: {},
|
||
methods: {
|
||
rollFn() {
|
||
this.timer = null //计时器
|
||
this.startIndex = 0 //从第几个位置开始抽奖 [默认为零]
|
||
this.count = 0 //计数,跑的圈数
|
||
this.winingIndex = 3 //获奖的位置
|
||
this.totalCount = 6 //抽奖跑的圈数
|
||
this.speed = 50
|
||
},
|
||
startLuckyDraw(id) {
|
||
let num = this.prizeData.findIndex((item) => item[this.keyId] == id)
|
||
if (num === -1) num = 0
|
||
this.winingIndex = num
|
||
// 当跑的圈数等于设置的圈数,且活动的index值是奖品的位置时停止
|
||
if (this.throttle) return console.log('转盘抽奖中...')
|
||
this.throttle = true
|
||
this.luckyDraw()
|
||
},
|
||
luckyDraw() {
|
||
this.startIndex++
|
||
if (this.startIndex >= this.prizeData.length - 1) {
|
||
this.startIndex = 0
|
||
this.count++
|
||
}
|
||
this.current_index = this.startIndex
|
||
if (this.count >= this.totalCount && this.startIndex === this.winingIndex) {
|
||
this.rollFn()
|
||
this.throttle = false
|
||
} else {
|
||
//重新开始一圈
|
||
if (this.count >= this.totalCount - 1) {
|
||
this.speed += 30
|
||
}
|
||
var that = this
|
||
this.timer = setTimeout(function () {
|
||
that.luckyDraw()
|
||
}, this.speed)
|
||
}
|
||
},
|
||
},
|
||
}
|
||
</script>
|
||
|
||
<style lang="scss" scoped>
|
||
li {
|
||
list-style: none;
|
||
}
|
||
|
||
ul,
|
||
li {
|
||
margin: 0;
|
||
padding: 0;
|
||
}
|
||
|
||
.grid_wrap {
|
||
/* background-color: #9ad3ff; */
|
||
width: 650upx;
|
||
height: 650upx;
|
||
position: relative;
|
||
border-radius: 12upx;
|
||
/* box-shadow: 0upx 12upx 0upx 0upx #89bbf7; */
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
}
|
||
|
||
.grid_wrap .lottery_wrap_border {
|
||
position: absolute;
|
||
top: 0;
|
||
left: 0;
|
||
width: 100%;
|
||
height: 100%;
|
||
}
|
||
|
||
.grid_wrap .lottery_wrap_border ul {
|
||
position: absolute;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
}
|
||
|
||
.grid_wrap .lottery_wrap_border ul li {
|
||
border-radius: 50%;
|
||
width: 17upx;
|
||
height: 17upx;
|
||
background: var(--evenBg);
|
||
}
|
||
|
||
.grid_wrap .lottery_wrap_border ul li:nth-child(even) {
|
||
width: 24upx;
|
||
height: 24upx;
|
||
background: var(--oddBg);
|
||
}
|
||
|
||
.grid_wrap .lottery_wrap_border ul:nth-child(odd) {
|
||
width: 100%;
|
||
height: 35upx;
|
||
left: 0;
|
||
right: 0;
|
||
flex-direction: row;
|
||
}
|
||
|
||
.grid_wrap .lottery_wrap_border ul:nth-child(odd) li {
|
||
margin: 0 10upx;
|
||
}
|
||
|
||
.grid_wrap .lottery_wrap_border ul:nth-child(even) {
|
||
width: 35upx;
|
||
height: 100%;
|
||
top: 0;
|
||
bottom: 0;
|
||
flex-direction: column;
|
||
}
|
||
|
||
.grid_wrap .lottery_wrap_border ul:nth-child(even) li {
|
||
margin: 10upx 0;
|
||
}
|
||
|
||
.grid_wrap .lottery_wrap_border ul:nth-child(3) {
|
||
bottom: 0;
|
||
}
|
||
|
||
.grid_wrap .lottery_wrap_border ul:nth-child(4) {
|
||
right: 0;
|
||
}
|
||
|
||
.grid_wrap .lottery_wrap_border ul:nth-child(1) li:nth-child(odd),
|
||
.grid_wrap .lottery_wrap_border ul:nth-child(4) li:nth-child(odd) {
|
||
animation: blink_large 1s linear infinite;
|
||
}
|
||
|
||
.grid_wrap .lottery_wrap_border ul:nth-child(1) li:nth-child(even),
|
||
.grid_wrap .lottery_wrap_border ul:nth-child(4) li:nth-child(even) {
|
||
animation: blink_small 1s linear infinite;
|
||
}
|
||
|
||
.grid_wrap .lottery_wrap_border ul:nth-child(3) li:nth-child(even),
|
||
.grid_wrap .lottery_wrap_border ul:nth-child(2) li:nth-child(even) {
|
||
width: 17upx;
|
||
height: 17upx;
|
||
background: var(--evenBg);
|
||
animation: blink_large 1s linear infinite;
|
||
}
|
||
|
||
.grid_wrap .lottery_wrap_border ul:nth-child(3) li:nth-child(odd),
|
||
.grid_wrap .lottery_wrap_border ul:nth-child(2) li:nth-child(odd) {
|
||
width: 24upx;
|
||
height: 24upx;
|
||
background: var(--oddBg);
|
||
animation: blink_small 1s linear infinite;
|
||
}
|
||
|
||
.grid_wrap .lottery_wrap {
|
||
width: calc(100% - 75upx);
|
||
height: calc(100% - 75upx);
|
||
font-size: 14upx;
|
||
background-color: #61a2fc;
|
||
border-radius: 12upx;
|
||
/* position: absolute;
|
||
top: 50%;
|
||
left: 50%;
|
||
transform: translate(-50%, -50%); */
|
||
z-index: 1;
|
||
}
|
||
|
||
.grid_wrap .lottery_wrap .lottery_grid {
|
||
width: 100%;
|
||
height: 100%;
|
||
position: relative;
|
||
}
|
||
|
||
.grid_wrap .lottery_wrap .lottery_grid li {
|
||
width: 28%;
|
||
height: 28%;
|
||
display: flex;
|
||
flex-direction: column;
|
||
align-items: center;
|
||
justify-content: center;
|
||
float: left;
|
||
position: absolute;
|
||
background-color: var(--liBg);
|
||
border-radius: 12upx;
|
||
white-space: nowrap;
|
||
overflow: hidden;
|
||
text-overflow: ellipsis;
|
||
font-size: 28upx;
|
||
}
|
||
|
||
.grid_wrap .lottery_wrap .lottery_grid li .grid_img {
|
||
width: 65upx;
|
||
height: 65upx;
|
||
margin-bottom: 10upx;
|
||
}
|
||
|
||
.grid_wrap .lottery_wrap .lottery_grid .active {
|
||
background: var(--activeBackgroundColor);
|
||
box-shadow: 0upx 8upx 0upx 0upx var(--activeBackgroundColor) !important;
|
||
color: #ffffff !important;
|
||
}
|
||
|
||
.grid_wrap .lottery_wrap .lottery_grid li:nth-of-type(1) {
|
||
left: 4%;
|
||
top: 3%;
|
||
}
|
||
|
||
.grid_wrap .lottery_wrap .lottery_grid li:nth-of-type(2) {
|
||
left: 36%;
|
||
top: 3%;
|
||
}
|
||
|
||
.grid_wrap .lottery_wrap .lottery_grid li:nth-of-type(3) {
|
||
left: 68%;
|
||
top: 3%;
|
||
}
|
||
|
||
.grid_wrap .lottery_wrap .lottery_grid li:nth-of-type(4) {
|
||
left: 68%;
|
||
top: 35.5%;
|
||
}
|
||
|
||
.grid_wrap .lottery_wrap .lottery_grid li:nth-of-type(5) {
|
||
left: 68%;
|
||
top: 68%;
|
||
}
|
||
|
||
.grid_wrap .lottery_wrap .lottery_grid li:nth-of-type(6) {
|
||
left: 36%;
|
||
top: 68%;
|
||
}
|
||
|
||
.grid_wrap .lottery_wrap .lottery_grid li:nth-of-type(7) {
|
||
left: 4%;
|
||
top: 68%;
|
||
}
|
||
|
||
.grid_wrap .lottery_wrap .lottery_grid li:nth-of-type(8) {
|
||
left: 4%;
|
||
top: 35.5%;
|
||
}
|
||
|
||
.grid_wrap .lottery_wrap .lottery_grid li:nth-of-type(9) {
|
||
left: 36%;
|
||
top: 35.5%;
|
||
cursor: pointer;
|
||
background: #ff3a59;
|
||
box-shadow: none !important;
|
||
color: #ffffff !important;
|
||
font-size: 40upx;
|
||
font-weight: bolder;
|
||
}
|
||
|
||
@keyframes blink_large {
|
||
to {
|
||
width: 24upx;
|
||
height: 24upx;
|
||
background: var(--oddBg);
|
||
}
|
||
}
|
||
|
||
@keyframes blink_small {
|
||
to {
|
||
width: 17upx;
|
||
height: 17upx;
|
||
/* background-color: #bce0e9; */
|
||
}
|
||
}
|
||
.img-btn {
|
||
width: 28%;
|
||
height: 28%;
|
||
view,
|
||
div,
|
||
img,
|
||
image {
|
||
width: 100% !important;
|
||
height: 100% !important;
|
||
}
|
||
}
|
||
.testTabs_key-image_c0 {
|
||
width: 100% !important;
|
||
height: 100% !important;
|
||
}
|
||
</style>
|