508 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			Vue
		
	
	
	
		
		
			
		
	
	
			508 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			Vue
		
	
	
	
|  | <template> | ||
|  | 	<view> | ||
|  | 		<view class="box-ly-pm" :style="style_box"> | ||
|  | 			<view class="dot" :class="'dot-'+(index+1)" v-for="(item,index) in dotList" :key="index"></view> | ||
|  | 			<view class="box-in" :style="style_box_in"> | ||
|  | 
 | ||
|  | 				<view class="ct-out" :class="['award-'+(index+1),index==indexSelect?'awardSelect':'']" | ||
|  | 					v-for="(item,index) in list" :key="index" | ||
|  | 					:style="[{'background-image':'url('+(index==indexSelect?itemacbg:itembg)+')'}]" @click="con(item)"> | ||
|  | 					<!-- {{item.name}} --> | ||
|  | 					<image lazy-load="true" @tap="toDetailPage({index: index})" class="award-image" :src="item.img"> | ||
|  | 					</image> | ||
|  | 				</view> | ||
|  | 
 | ||
|  | 
 | ||
|  | 				<view class="btn-start d-c d-c-c" :class="isRunning?'ative':''" @click="start"> | ||
|  | 					<view>{{$t('w_0199')}}:({{availableSurplusNum || 0}})</view> | ||
|  | 					<view>{{$t('w_0206')}}</view> | ||
|  | 				</view> | ||
|  | 			</view> | ||
|  | 		</view> | ||
|  | 	</view> | ||
|  | 
 | ||
|  | </template> | ||
|  | 
 | ||
|  | <script> | ||
|  | 	import lotBg from '@/static/bg/lot-bg.png'; | ||
|  | 	import lotacBg from '@/static/bg/lotac-bg.png'; | ||
|  | 	export default { | ||
|  | 		props: { | ||
|  | 			list: { | ||
|  | 				type: Array, | ||
|  | 				default () { | ||
|  | 					return [] | ||
|  | 				} | ||
|  | 			}, | ||
|  | 			availableSurplusNum: { | ||
|  | 				type: Number, | ||
|  | 				default: 0 | ||
|  | 			}, | ||
|  | 			themeColor: { | ||
|  | 				type: String, | ||
|  | 				default: '#811400', | ||
|  | 			}, | ||
|  | 			bgColor: { | ||
|  | 				type: String, | ||
|  | 				default: '#cf262b', | ||
|  | 			}, | ||
|  | 			bg_sd_Color: { | ||
|  | 				type: String, | ||
|  | 				default: '#cf262b', | ||
|  | 			}, | ||
|  | 			height: { | ||
|  | 				type: Number, | ||
|  | 				default: 600 | ||
|  | 			}, | ||
|  | 			width: { | ||
|  | 				type: Number, | ||
|  | 				default: 650 | ||
|  | 			}, | ||
|  | 			//跑马灯启用图片背景
 | ||
|  | 			is_img_bg: { | ||
|  | 				type: Boolean, | ||
|  | 				default: false | ||
|  | 			}, | ||
|  | 			//背景图片
 | ||
|  | 			theme_img_bg: { | ||
|  | 				type: String, | ||
|  | 				default: '', | ||
|  | 			}, | ||
|  | 			box_shadow_Color: { | ||
|  | 				type: String, | ||
|  | 				default: '#fcc8d0', | ||
|  | 			}, | ||
|  | 			//底部背景图片
 | ||
|  | 			bg_img: { | ||
|  | 				type: String, | ||
|  | 				default: '', | ||
|  | 			}, | ||
|  | 			//停留位置
 | ||
|  | 			stay_index: { | ||
|  | 				type: Number, | ||
|  | 				default: 1 | ||
|  | 			}, | ||
|  | 		}, | ||
|  | 		data() { | ||
|  | 			return { | ||
|  | 				itembg: lotBg, | ||
|  | 				itemacbg: lotacBg, | ||
|  | 				dotList: 24, //圆点个数
 | ||
|  | 				//奖品
 | ||
|  | 				indexSelect: 0, //抽中的奖品下标
 | ||
|  | 				isRunning: false //抽中状态
 | ||
|  | 			} | ||
|  | 		}, | ||
|  | 		computed: { | ||
|  | 			style_box() { | ||
|  | 				let that = this; | ||
|  | 				var height = parseInt(that.height); | ||
|  | 				var width = parseInt(that.width); | ||
|  | 				var style = ''; | ||
|  | 				if (height > 0) { | ||
|  | 					style = `height:${height}rpx;`; | ||
|  | 				} | ||
|  | 				if (width > 0) { | ||
|  | 					style += `width:${width}rpx;`; | ||
|  | 				} | ||
|  | 				style += `background-color:${that.bgColor};`; | ||
|  | 
 | ||
|  | 				if (that.is_img_bg && that.bg_img.length > 0) { | ||
|  | 					style += `background-image:url(${that.bg_img});`; | ||
|  | 				} | ||
|  | 
 | ||
|  | 				style += `box-shadow: 0 10px 0  ${that.bg_sd_Color};`; | ||
|  | 				return style; | ||
|  | 			}, | ||
|  | 			style_box_in() { | ||
|  | 				let that = this; | ||
|  | 				var height = parseInt(that.height); | ||
|  | 				var width = parseInt(that.width); | ||
|  | 				var style = ''; | ||
|  | 				if (height > 70) { | ||
|  | 					style = `height:${height-70}rpx;`; | ||
|  | 				} | ||
|  | 				if (width > 70) { | ||
|  | 					style += `width:${width-70}rpx;`; | ||
|  | 				} | ||
|  | 
 | ||
|  | 				style += `background-color:${that.themeColor};`; | ||
|  | 
 | ||
|  | 				var theme_img_bg = that.theme_img_bg; | ||
|  | 				if (that.is_img_bg && theme_img_bg.length > 0) { | ||
|  | 					style += `background-image:url(${that.theme_img_bg});`; | ||
|  | 				} | ||
|  | 				return style; | ||
|  | 			}, | ||
|  | 
 | ||
|  | 		}, | ||
|  | 		methods: { | ||
|  | 			con(e) { | ||
|  | 				console.log(e) | ||
|  | 			}, | ||
|  | 			//详情页
 | ||
|  | 			toDetailPage(item) { | ||
|  | 				let that = this; | ||
|  | 				let list = that.list; | ||
|  | 				let index = item.index; | ||
|  | 				let data = { | ||
|  | 					curIndex: index, | ||
|  | 					item: list[index], | ||
|  | 					list: list | ||
|  | 				}; | ||
|  | 				this.$emit('toDetailPage', data); | ||
|  | 			}, | ||
|  | 			//随机数
 | ||
|  | 			random(u) { | ||
|  | 				let rnd = Math.random() > 0.5 ? "2" : "1"; | ||
|  | 				u = u || 3; | ||
|  | 				for (var i = 0; i < u; i++) { | ||
|  | 					rnd += Math.floor(Math.random() * 10); | ||
|  | 				} | ||
|  | 				return Number(rnd); | ||
|  | 			}, | ||
|  | 
 | ||
|  | 			//开始
 | ||
|  | 			start() { | ||
|  | 				let that = this; | ||
|  | 				if (this.availableSurplusNum <= 0) { | ||
|  | 					this.$emit('Recharge'); | ||
|  | 					return | ||
|  | 				} | ||
|  | 				if (this.isRunning) return | ||
|  | 				this.isRunning = true; | ||
|  | 				let indexSelect = 0; | ||
|  | 				let i = 0; | ||
|  | 				let randomNum = this.random(3); | ||
|  | 				let timer = setInterval(() => { | ||
|  | 					++indexSelect; | ||
|  | 					//这里用y=30*x+150函数做的处理.可根据自己的需求改变转盘速度
 | ||
|  | 					indexSelect = indexSelect % 8; | ||
|  | 					this.indexSelect = indexSelect; | ||
|  | 
 | ||
|  | 
 | ||
|  | 					i += 40; | ||
|  | 					//console.log(i)
 | ||
|  | 					if (i > randomNum) { | ||
|  | 
 | ||
|  | 						//去除循环
 | ||
|  | 
 | ||
|  | 						//控制停留位置
 | ||
|  | 						indexSelect = that.stay_index; | ||
|  | 						this.indexSelect = indexSelect; | ||
|  | 
 | ||
|  | 						// console.log(randomNum)
 | ||
|  | 						// console.log(indexSelect)
 | ||
|  | 						// console.log(JSON.stringify(that.list[indexSelect]) )
 | ||
|  | 
 | ||
|  | 						clearInterval(timer) | ||
|  | 						timer = null; | ||
|  | 						let data = { | ||
|  | 							curIndex: indexSelect, | ||
|  | 							item: that.list[indexSelect], | ||
|  | 							list: that.list | ||
|  | 						}; | ||
|  | 						this.$emit('result', data); | ||
|  | 						this.isRunning = false | ||
|  | 
 | ||
|  | 					} | ||
|  | 				}, (70 + i)) | ||
|  | 			} | ||
|  | 		} | ||
|  | 	} | ||
|  | </script> | ||
|  | 
 | ||
|  | <style lang="scss"> | ||
|  | 	.box-ly-pm { | ||
|  | 		margin: 40rpx auto; | ||
|  | 		border-radius: 40rpx; | ||
|  | 		position: relative; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	.box-in { | ||
|  | 		border-radius: 40rpx; | ||
|  | 		position: absolute; | ||
|  | 		left: 0; | ||
|  | 		right: 0; | ||
|  | 		top: 0; | ||
|  | 		bottom: 0; | ||
|  | 		margin: auto; | ||
|  | 
 | ||
|  | 		background-size: 100% 100%; | ||
|  | 		background-repeat: no-repeat; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/**小圆点 start*/ | ||
|  | 
 | ||
|  | 	.dot { | ||
|  | 		position: absolute; | ||
|  | 		display: block; | ||
|  | 		border-radius: 50%; | ||
|  | 		height: 20rpx; | ||
|  | 		width: 20rpx; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	.dot:nth-child(odd) { | ||
|  | 		background: #fff; | ||
|  | 		animation: 0.5s odd linear infinite; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	.dot:nth-child(even) { | ||
|  | 		background: #fcf400; | ||
|  | 		animation: 0.5s even linear infinite; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	.dot-1 { | ||
|  | 		left: 15rpx; | ||
|  | 		top: 15rpx; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	.dot-2 { | ||
|  | 		left: 117.5rpx; | ||
|  | 		top: 7.5rpx; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	.dot-3 { | ||
|  | 		left: 220rpx; | ||
|  | 		top: 7.5rpx; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	.dot-4 { | ||
|  | 		left: 322.5rpx; | ||
|  | 		top: 7.5rpx; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	.dot-5 { | ||
|  | 		left: 425rpx; | ||
|  | 		top: 7.5rpx; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	.dot-6 { | ||
|  | 		left: 527.5rpx; | ||
|  | 		top: 7.5rpx; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	.dot-7 { | ||
|  | 		left: 620rpx; | ||
|  | 		top: 15rpx; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	.dot-8 { | ||
|  | 		left: 622rpx; | ||
|  | 		top: 109rpx; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	.dot-9 { | ||
|  | 		left: 622rpx; | ||
|  | 		top: 203rpx; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	.dot-10 { | ||
|  | 		left: 622rpx; | ||
|  | 		top: 297rpx; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	.dot-11 { | ||
|  | 		left: 622rpx; | ||
|  | 		top: 391rpx; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	.dot-12 { | ||
|  | 		left: 622rpx; | ||
|  | 		top: 485rpx; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	.dot-13 { | ||
|  | 		left: 620rpx; | ||
|  | 		top: 565rpx; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	.dot-14 { | ||
|  | 		left: 517.5rpx; | ||
|  | 		top: 572rpx; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	.dot-15 { | ||
|  | 		left: 415rpx; | ||
|  | 		top: 572rpx; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	.dot-16 { | ||
|  | 		left: 312.5rpx; | ||
|  | 		top: 572rpx; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	.dot-17 { | ||
|  | 		left: 210rpx; | ||
|  | 		top: 572rpx; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	.dot-18 { | ||
|  | 		left: 107.5rpx; | ||
|  | 		top: 572rpx; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	.dot-19 { | ||
|  | 		left: 15rpx; | ||
|  | 		top: 565rpx; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	.dot-20 { | ||
|  | 		left: 7.5rpx; | ||
|  | 		top: 471rpx; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	.dot-21 { | ||
|  | 		left: 7.5rpx; | ||
|  | 		top: 377rpx; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	.dot-22 { | ||
|  | 		left: 7.5rpx; | ||
|  | 		top: 283rpx; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	.dot-23 { | ||
|  | 		left: 7.5rpx; | ||
|  | 		top: 189rpx; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	.dot-24 { | ||
|  | 		left: 7.5rpx; | ||
|  | 		top: 95rpx; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	@-webkit-keyframes odd { | ||
|  | 		0% { | ||
|  | 			background: #fff; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		100% { | ||
|  | 			background: #fcf400; | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	@keyframes odd { | ||
|  | 		0% { | ||
|  | 			background: #fff; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		100% { | ||
|  | 			background: #fcf400; | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	@-webkit-keyframes even { | ||
|  | 		0% { | ||
|  | 			background: #fcf400; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		100% { | ||
|  | 			background: #fff; | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	@keyframes even { | ||
|  | 		0% { | ||
|  | 			background: #fcf400; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		100% { | ||
|  | 			background: #fff; | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/**小圆点 end*/ | ||
|  | 
 | ||
|  | 	.ct-out { | ||
|  | 		position: absolute; | ||
|  | 		height: 150rpx; | ||
|  | 		width: 168rpx; | ||
|  | 		// background-color: #fcecec;
 | ||
|  | 		border-radius: 15rpx; | ||
|  | 		// box-shadow: 0 4px 0 #fcc8d0;
 | ||
|  | 
 | ||
|  | 		background-size: 100% 100%; | ||
|  | 		background-repeat: no-repeat; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/* 580 530  */ | ||
|  | 
 | ||
|  | 	.award-1 { | ||
|  | 		left: 24rpx; | ||
|  | 		top: 24rpx; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	.award-2 { | ||
|  | 		left: 206rpx; | ||
|  | 		top: 24rpx; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	.award-3 { | ||
|  | 		left: 388rpx; | ||
|  | 		top: 24rpx; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	.award-4 { | ||
|  | 		left: 388rpx; | ||
|  | 		top: 188rpx; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	.award-5 { | ||
|  | 		left: 388rpx; | ||
|  | 		top: 352rpx; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	.award-6 { | ||
|  | 		left: 206rpx; | ||
|  | 		top: 352rpx; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	.award-7 { | ||
|  | 		left: 24rpx; | ||
|  | 		top: 352rpx; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	.award-8 { | ||
|  | 		left: 24rpx; | ||
|  | 		top: 188rpx; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/**居中 加粗*/ | ||
|  | 
 | ||
|  | 	.btn-start { | ||
|  | 		position: absolute; | ||
|  | 		top: 188rpx; | ||
|  | 		left: 206rpx; | ||
|  | 		border-radius: 15rpx; | ||
|  | 		height: 150rpx; | ||
|  | 		width: 168rpx; | ||
|  | 		background: linear-gradient(0deg, #ff6a00, #fed8bc); | ||
|  | 		// box-shadow: 0 4px 0 #fcc8d0;
 | ||
|  | 		color: #fff; | ||
|  | 		text-align: center; | ||
|  | 		font-size: 26rpx; | ||
|  | 		// font-weight: bold;
 | ||
|  | 		line-height: 1.5; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	.ative { | ||
|  | 		opacity: 0.6 !important; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	.award-image { | ||
|  | 		position: absolute; | ||
|  | 		margin: auto; | ||
|  | 		top: 0; | ||
|  | 		left: 0; | ||
|  | 		bottom: 0; | ||
|  | 		right: 0; | ||
|  | 		height: 100rpx; | ||
|  | 		width: 100rpx; | ||
|  | 		border-radius: 50%; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	.awardSelect { | ||
|  | 		// background: linear-gradient(-20deg, #f95413, hsla(0, 20%, 99%, .6)) !important;
 | ||
|  | 	} | ||
|  | </style> |