Files
2025-04-30 14:08:39 +08:00

409 lines
8.6 KiB
Vue
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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