Vue 九宫格抽奖实现

vue实现抽奖大转盘 1. 实现原理 实际解决用户需求:当用户点击抽奖时,会请求接口获取中奖的奖品信息,前端根据中奖编号进行修改css样式,让转盘旋转,调整角度对应后端返回的奖品。如果抽奖有多次机会的话,每次需要抽奖结束后需要重置角度 2.html 代码 .wheel img.turntable( src='@/assets/img/second-anniversary/turntable.png' :style="{transform:'rotate('+rotateAngle+'deg)',tra 阅读详情

最近做了一个公司的活动项目,效果如图。本篇文章创作记录粗糙,只是当下先记下代码片段,后期我会抽时间优化。

 1、页面搭建(创建index.vue)

首先要确定页面布局,class为start的div代表中间的开始按钮,同级的ul为九个奖品的位置。

我是采用父元素相对定位,li元素绝对定位。将每一个元素定位到页面上(当时一下想到的方案,欢迎有大佬提供不用怎么麻烦的布局方式)

<div class="luck-cont" v-if="loadingComplete">
    <div class="start" @click="start">
	    <div class="start-content" v-if="activeExistFlag">
		    <p>开始</p>
		    <p>抽奖</p>
	    </div>
	    <div class="start-content" v-else-if="!activeExistFlag && !notStartFlag">
		    <p>活动</p>
		    <p>结束</p>
	    </div>
    </div>
	<ul class="luck-ul">
		<li v-for="(item, index) in prizes" :key="index"
			:class="['item' + (index + 1), {'active': currentIndex == index}]">
	        <div>
	            <img :src="item.img_path" />
		        <p>{{item.prize_name}}</p>
			</div>
			<div class="mask" v-if="currentIndex == index"></div>
		</li>
	</ul>
</div>

2、相关CSS定位

.luck-cont {position: relative;width: 318px;height: 338px;background-color: #cb0e23;border-radius: 23px;}
.grid-tips {font-size: 12px;font-weight: 400;color: #fde4b7;text-align: center;padding-top: 6px;}
.luck-ul li {position: absolute;width: 96px;height: 96px;background: linear-gradient(135deg, #ffb5b4, #ffc3a5 100%);border-radius: 12px;}
.luck-ul li.item1 {left: 9px;top: 32px;}
.luck-ul li.item2 {left: 111px;top: 32px;}
.luck-ul li.item3 {left: 213px;top: 32px;}
.luck-ul li.item4 {left: 213px;top: 134px;}
.luck-ul li.item5 {left: 213px;top: 236px;}
.luck-ul li.item6 {left: 111px;top: 236px;}
.luck-ul li.item7 {left: 9px;top: 236px;}
.luck-ul li.item8 {left: 9px;top: 134px;}
.luck-ul li.active .mask {position: absolute;width: 96px;height: 96px;background: rgba(255, 172, 24, 0.60);border-radius: 12px;top: -6px;left: 0px}
.luck-ul li div {width: 84px;height: 84px;padding: 10px 0 0;margin: 6px auto;background: linear-gradient(135deg, #fff0e5, #ffdfc6 100%);border-radius: 12px;text-align: center;}
.luck-ul li div img {display: block;margin: 0 auto;height: 45px;}
.luck-ul li div p {color: #000;font-size: 10px;font-weight: 400;line-height: 20px}
.start {position: absolute;left: 111px;top: 134px;width: 96px;height: 96px;background: #fac246;border-radius: 94px;}
.start-content {width: 69px;height: 69px;background: #ff5f5a;border-radius: 84px;box-shadow: 0px 0px 15px 0px #cb0e23 inset;margin: 14px auto 0;color: #fff;font-weight: 400;font-size: 18px;text-align: center;padding-top: 8px;}
.start-content p:first-child {line-height: 22px;margin-top: 4px;}
.luck-active-content {padding: 0 15px 20px 24px; margin-top: 24px;}

3、相应JS逻辑(idnex.js)

中奖位置和是否能够参与抽奖、抽奖的次数都是调用后端的接口实现。相应的js方法都加了相应的注释。

本次代码开发难点在于得到中奖位置后,将转盘停止的方法(startRoll)方法。可能中间有不和逻辑的代码,欢迎大家指正。

data(){
    return{
        luckyNum: 2, // 抽奖次数
	    prizes: [], // 奖品列表
	    shareFlag: true, // 是否分享
	    showShareFlag: false, // 分享成功弹层
	    currentIndex: -1, // 当前转动到哪个位置,起点位置
	    count: 8, // 总共有多少个位置
	    timer: 0, // 每次转动定时器
	    speed: 200, // 初始转动速度
	    times: 0, // 转动次数
	    cycle: 50, // 转动基本次数:即至少需要转动多少次再进入抽奖环节
	    prize: -1, // 中奖位置
    }
}

// 开始抽奖
start() {
	let vm = this
    this.getLuckDrawIndex()
},

// 获取中奖位置
getLuckDrawIndex() {
	let _this = this
	// 返回中奖位置、剩余抽奖次数
	startLuckDraw(this.params).then(res => {
		if (res.code == 200) {
			this.startRoll()
			this.isLuckFlag = true
		    this.prizeInfo = res.content
			this.prize = _this.getPrizeIndex(res.content)
			this.quertSurplusCount()
		} else if (res.code == 300) {
			this.showPopFlag = true
			this.isFollowFlag = false
			this.followImageUrl = res.content
			this.clearRoll()
		    return
	    } else {
			this.startRoll()
			this.prize = parseInt(Math.random() * 10, 0) > 5 ? 3 : 7
			this.isLuckFlag = false
			this.followTitps1 = res.message
			this.quertSurplusCount()
		}
    }).catch(error => {
		console.log(error)
    })
},

startRoll() {
	let vm = this
	this.times += 1 // 转动次数
	this.oneRoll() // 转动过程调用的每一次转动方法,这里是第一次调用初始化
	// 如果当前转动次数达到要求 && 目前转到的位置是中奖位置
	if (this.times > this.cycle + 10 && this.prize === this.currentIndex) {
		clearTimeout(this.timer) // 清除转动定时器,停止转动
		this.prize = -1
		this.times = 0
		this.speed = 200
		this.click = true;
		var that = this;
		setTimeout(res => {
			if (that.isLuckFlag) {
				that.showToast = true;
				that.isReceive = false
			} else {
				that.showPopFlag = true
				that.isFollowFlag = true
			}
		}, 500)
	} else {
		if (this.times < this.cycle) {
			this.speed -= 10 // 加快转动速度
		} else if (this.times === this.cycle) {
			if (this.prize > 7) {
				this.prize = 7
			}
		} else if (this.times > this.cycle + 10 && ((this.prize === 0 && this.currentIndex === 7) || this
						.prize === this.currentIndex + 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.currentIndex // 当前转动到哪个位置
	const count = this.count // 总共有多少个位置
	index += 1
	if (index > count - 1) {
		index = 0
	}
	this.currentIndex = index
},

clearRoll() {
	clearTimeout(this.timer) // 清除转动定时器,停止转动
	this.prize = -1
	this.times = 0
	this.speed = 200
	this.click = true;
},

放一个发现的有好多集成抽奖案例的网站:九宫格抽奖 | 基于 Js / TS / Vue / React / 微信小程序 / uni-app / Taro 的【大转盘 & 九宫格 & 老虎机】抽奖插件

本次分享结束~共勉!!!

vue写一个简单的九宫格抽奖 vue实现九宫格抽奖 阅读详情

相关推荐

vue 转盘抽奖功能,可控制抽奖概率

vue 转盘抽奖功能,可控制抽奖概率

qq_43532275的博客 2349

vue实现大转盘抽奖

效果图如下 中奖提示 代码如下 <template> <div class="dial" v-wechat-title="$route.meta.title"> <div class="times">抽奖次数{{LuckyClick}}</div> <!-- 转盘包裹 --> &lt...

Candy_mi的博客 1万+

AURIX TC397开发板到手第一步:用iLLD库驱动LED流水灯(附完整代码)

本文详细介绍了如何使用英飞凌AURIX TC397开发板和iLLD库实现LED流水灯效果。从开发环境配置到硬件连接,再到完整的代码实现,逐步引导开发者完成项目。文章还提供了优化建议和常见问题解决方案,帮助嵌入式开发新手快速上手。

weixin_30911451的博客 390

Vue笔记_插件组件_lucky-canvas抽奖转盘

中使用,在此以vue2.x作为示例进行说明。两种抽奖界面,UI 精美,功能强大且专业可靠,只需要通过简单配置即可实现自由定制,快速完成产品需求。在进行渲染时,为了使页面能够等比放大/缩小,会进行配置将所有单位为px的值转换为rem单位。因此 若是想要转盘随着页面等比缩放 => 在给配置项设置数据时单位需要设置为。此时点击 “点击领取” 按钮转盘无任何反应,因为我们还没有设置事件进行抽奖。height: ‘300px’ // 默认300px。width: ‘300px’ // 默认300px。

qq_43260366的博客 5943

LangGraph实战:用Plan-and-Execute模式5步搭建智能问答机器人(附Tavily搜索集成)

本文详细介绍了如何利用LangGraph的Plan-and-Execute模式,通过规划、执行、动态调整三个核心阶段,构建一个能够处理复杂多步骤问题的智能问答机器人。文章提供了从环境配置、状态管理到核心节点(规划、执行、重新规划)实现的完整实战指南,并集成了Tavily搜索工具,展示了如何将智能任务规划应用于实际信息查询场景。

weixin_29258297的博客 339

Mac 环境配置jdk、Maven

3、终端打开配置jdk时候建好的脚本文件: open -e .bash_profile。4、查看maven是否安装成功和系统能不能识别maven/mvn命令:⬇️。输入⬇️并保存: 其中第一行JAVA_HOME替换为自己下的jdk路径。,安装编译好的二进制版本,具体安装zip还是tar.gz我看的。5、查看jdk是否安装成功和系统能不能识别java命令:⬇️。至此,我的Mac系统的环境配置jdk、Maven完成!然后就发现我的maven命令还是没作用,不识别,下载后直接安装即可,很快,点几下就OK了。

weixin_42416791的博客 4387

使用vue实现九宫格抽奖功能

使用vue2和vue3分别实现九宫格抽奖功能 关于九宫格抽奖的功能,想必大家都见过。外圈为奖品,中间是一个抽奖的按钮,接下来就讲解怎么实现九宫格的抽奖功能。 本demo使用技术:vue2/vue3,作用域插槽,定时器,递归自调用,注册全局组件 这里我就搭建个新vue3的项目,虽然是vue3,但也完全可以使用vue2的写法实现 创建项目删除初始化代码省略… 在这里我是写死的数据。首先我们在App组件里声明list数组,用来当做奖品。这里我们在list数组里写8个项,id从0到7,text可随意写(九宫格为什么

SYXZSs的博客 6192

QT与Coin3D实现机器人的仿真

前言 Coin3D编程环境配置好后,开始下一步的机器人仿真任务。本文根据在研5轴机器人,完成三维模型生成与机器人的仿真。主要参考博主冯Jungle的博客,在此表示感谢。 ——2021.05.23 环境 Win10:VS2019、QT5.15.2、Coin3D、SolidWorks2016 机器人三维模型生成 目前广泛应用于因特网的VRML ( Virtual Reality Modeling Language,虚拟现实建模语言)为用户提供一种可参与的、并能对场景中对象主动做出反应的虚拟现实环境,现已成

焦露的博客 6906

基于vue实现九宫格大转盘抽奖

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、基于vue实现九宫格大转盘抽奖 二、使用步骤 基于vue实现九宫格大转盘抽奖 总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、基于vue实现九宫格大转盘抽奖 示例:为活动而写的一小段代码。 二、使用步骤..

hanwei020502的博客 3003

从华为杯建模到论文录用:我的Biomedical Signal Processing and Control投稿全记录(含Latex模板与审稿人推荐技巧)

本文详细记录了作者从华为杯数学建模竞赛到Biomedical Signal Processing and Control期刊投稿的全过程,分享了如何将竞赛成果转化为学术论文的实用技巧,包括LaTeX排版中的常见陷阱与解决方案,以及审稿人推荐策略。特别提供了针对Elsevier模板的优化建议和高效回复审稿意见的方法,适合生物医学信号处理领域的研究者参考。

weixin_42549037的博客 452

Android蓝牙开发—经典蓝牙和BLE(低功耗)蓝牙的区别

      最近在做蓝牙开发,刚接触时傻傻的分不清经典蓝牙和低功耗蓝牙的区别,一直用开发低功耗蓝牙的方法去连接经典蓝牙设备,最后当然是一直连接不上了。在此记录下经典蓝牙和低功耗蓝牙的区别和联系。 Android中的蓝牙         说到Android中的蓝牙,大家听到的可能有蓝牙1.0、蓝牙2.0、蓝牙3.0、蓝牙4.0之类的以数字结尾的蓝牙版本号,而实际上,在最新的标准中,已经不再使用数...

zqf_888的博客 4万+

vue 实现九宫格抽奖_基于VUE实现的九宫格抽奖功能

先给大家展示下效果图:html代码:我的积分: 1000 8金转 128金转立即抽奖 128金转 256金转分享领积分 活动规则1、活动时间:2017年9月8日起;2、活动期间,股事汇用户每次抽奖消耗20积分,抽奖次数不限3、金钻可用于向投顾提问、送礼、赞赏;4、积分赚取:每日签到、分享文章/问答/直播间、点赞、金钻充值均可获得积分哦...

weixin_30523989的博客 771

从.bib到.bbl:手把手教你搞定LaTeX参考文献的完整流程

本文详细介绍了从.bib到.bbl的LaTeX参考文献处理完整流程,包括文献数据库构建、样式选择、主文档配置、编译流程及问题排查。特别针对.bib、.bbl等文件的操作提供了实战解决方案,帮助用户高效管理学术文献引用,适用于各类学术写作场景。

weixin_29292431的博客 285

vue 方式实现九宫格抽奖效果

gridItems: ['奖品1', '奖品2', '奖品3', '奖品4', '抽奖', '奖品5', '奖品6', '奖品7', '奖品8'],console.log('中奖:', this.gridItems[this.activeIndex]);sequence: [0, 1, 2, 5, 8, 7, 6, 3] // 顺时针旋转顺序。// 这里可以添加中奖后的逻辑。

weixin_46046976的博客 802

注意力机制模块:CA(坐标注意力)二次创新:融合深度可分离卷积,打造 CADS 模块

本文提出CADS模块,将坐标注意力(CA)与深度可分离卷积(DSC)深度融合,优化移动端AI部署效率。通过重构CA的计算范式,用深度卷积替代传统1×1卷积,在保持精度的同时显著降低计算开销。文章深入分析了CA的计算瓶颈和DSC的实际效率问题,详细阐述了CADS的设计原理与PyTorch实现,并提供了多组性能对比数据。该模块可直接应用于YOLO、UNet等主流模型,为移动端AI部署提供高效解决方案。

ZXSXJ的博客 96

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

vue实现九宫格抽奖

九宫格结构模板jscss九宫格配置-nineConfig 结构模板 <div class="nineSquare_wrap"> <div class="nine-box"> <template v-for="(nine,index) of nineConfig.nineSort"> <template v-if="nine.prizeRank == -1"> <div class=

Wq_2977的博客 835

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

vue 实现九宫格抽奖demo

<template> <div class="luckDraw"> <div class="container"> <div class="turntable-wrapper"> <div class="luck-wrapper"> <p class="integral">今日还剩 <span>1<.

为啥不能换名字的博客 255

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

vue简单实现九宫格抽奖

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> <title>九宫格抽奖</title> &l.

明知山 1712

vue 实现简易九宫格抽奖功能

运行原理:通过定时器和三元表达式来切换奖品的class名。

m0_72759446的博客 755

VUE实现的九宫格抽奖功能

效果图如下: 前端全栈学习交流圈:866109386,面向1-3经验年前端开发人员,帮助突破技术瓶颈,提升思维能力,群内有大量PDF可供自取,更有干货实战项目视频进群免费领取。 HTML代码: &lt;template&gt; &lt;div class="luckDraw"&gt; &lt;title-bar :title="title"&gt;&lt;/title-bar&gt;...

明月如霜丶 5256

vue 实现九宫格抽奖_重磅推荐:一个基于 Vue 的 (大转盘/九宫格) 抽奖插件

大家好,我是章鱼猫。今天给大家推荐的这开源项目是前端开发者比较喜欢的。现在作为前端开发者,经常开发一个商城网页,开发一些活动网页,那么就必须离不开需要大转盘和九宫格的抽奖功能。今天给大家推荐的这个开源项目就是专门针对抽奖的一个抽奖插件。这个开源项目就是:vue-luck-draw,它是一个基于 vue2 /vue3 的(大转盘抽奖 / 九宫格抽奖)插件;A lucky draw plug-in b...

weixin_42208901的博客 1547

VUE3简单实现九宫格点击抽奖

分享一个基于Vue3 + setup 语法糖开发的极简九宫格抽奖组件,无任何第三方依赖,代码简洁易懂、无冗余,修复了抽奖无限转圈的核心 BUG,实现了「点击抽奖→先快后慢减速转动→精准停止→中奖弹窗」的完整业务逻辑,同时做了轻量精致的样式美化,不花哨、颜值在线,可直接 CV 复用在项目中,新手也能轻松看懂和修改。这个九宫格抽奖组件做到了极简、无 BUG、高颜值、易复用,所有核心逻辑都做了优化和修复,代码注释清晰,新手也能轻松理解。

萌新程序员的博客,觉得有用的可以点点关注 653

Vue实现3*3九宫格抽奖(并拓展实现n*n多宫格抽奖)

3*3九宫格,4*4十二宫格,5*5十六宫格,n*n多宫格一套代码实现!

前端小记 3473

VUE3实现九宫格抽奖

本文介绍了一个基于Vue的九宫格抽奖组件的实现。代码通过<template>标签定义了九宫格的布局,每个格子对应不同的主题词(如“富强”、“民主”等),并通过<script>标签实现了抽奖逻辑。抽奖开始时,九宫格会随机转动,用户点击按钮后,转动逐渐停止,最终显示抽奖结果。代码中封装了随机数生成和定时器功能,并提供了三种不同的结果处理方式:随机结果、当前值结果和跳转至指定页面。样式部分通过<style>标签定义了九宫格的外观和交互效果。整体代码结构清晰,功能完整,适合用于简

2301_76459194的博客 246

vue3按照概率实现九宫格抽奖

在Vue3中,可以使用以下基本的思路来实现九宫格抽奖游戏。函数中返回需要暴露给模板使用的响应式数据和方法。方法中,我们判断当前是否正在抽奖,然后设置。在上述代码中,我们使用 Vue 3 的。函数创建了一个响应式对象,包含奖项列表。方法的实现和之前的示例代码相同。,并计算出中奖的索引,然后调用。

zzx262625的博客 800
上一篇: JS实现Ajax 请求后台接口
下一篇: CSS垂直居中的方法
逩跑鍀小学生
博客等级 码龄5年 37粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值