【JavaScript】---- 使用 Tween 实现转盘抽奖

news2025/1/20 10:55:29

1. 实现效果

在这里插入图片描述

2. 需求分析

  1. 它和正常的转盘抽奖不一样,一般实现都是指针形式的,转盘转动,最后指针停留在奖品的随机位置;
  2. 通过上边图发现奖品必须刚好停留在奖品的位置,因为不是指针,所以不能最后落到随机位置。

3. 常见转盘抽奖实现

在这里插入图片描述

常见九宫格抽奖和转盘抽奖组件实现!!!

4. 使用库

  1. 张鑫旭大佬实现的动画函数算法库
  2. 如何使用Tween.js各类原生动画运动缓动算法,使用文档

5. 引入 Tween.js 算法库

	<script src="./js/tween.js"></script>
    <script src="./js/animation.js"></script>

6. HTML 布局

  1. 转盘图片 game_luck.png;
  2. 指针图片 game_check.png;
  3. 开始按钮 game_btn.png。
    <div class="rui-game-luck-content">
        <img src="./images/game_luck.png" 
        :style="`transform: translate(-50%, -50%) rotate(${angleNumber}deg)`" 
        :data-id="angleNumber"
        id="turntable" 
        class="rui-game-luck-img" alt="">
        <img src="./images/game_check.png" style="z-index: 10;" class="rui-game-luck-img" alt="">
        <img src="./images/game_btn.png" @click="drawLuck" class="rui-game-luck-btn" alt="">
      </div>

7. CSS 实现

	.rui-game-luck-content{
        width: 5.38rem;
        height: 5.38rem;
        position: relative;
        margin: 1.55rem auto 0.35rem;
      }
      .rui-game-luck-img{
        width: 5.38rem;
        height: 5.38rem;
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
      }
      .rui-game-luck-btn{
        width: 2.26rem;
        height: 2.26rem;
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
        z-index: 12;
      }

8. 点击旋转动画实现

  1. 申明一个 Lock 锁,用于防止抽奖时的重复点击;
  2. 抽奖的各个变量申明;
  3. 抽奖次数已用完判断;
  4. 判断锁是否生效;
  5. 生成0到5之间的随机整数;
  6. 计算最后的角度;
  7. 转盘旋转动画;
  8. 抽奖次数减少;
  9. 显示遮罩层中奖奖品;
  10. 记录上一次转动最终角度。
	  const lock = new Lock();
      var app = new Vue({
        el: "#app",
        data: {
          show: false, // 遮罩层
          luckNumber: 0, // 中奖位置
          luckList: ['成长快乐','笑口常开','健康活泼','成长快乐','笑口常开','健康活泼'], // 奖品列表
          angleNumber: 0, // 转盘旋转角度
          drawNumber: 3, // 抽奖次数
          recordPrevAngle: 0, // 上一次转动最终角度
          drawOverMask: false, // 抽奖次数已用完遮罩层
        },
        methods: {
          // 再抽一次
          drawAgainLuck(){
            this.show = false;
            this.drawLuck();
          },
          // 抽奖
          drawLuck(){
            // 抽奖次数已用完
            if(this.drawNumber <= 0){
              this.drawOverMask = true;
              return false;
            }
            // 判断锁是否生效
            if(lock.isLocked){
              return false;
            }
            // 获取锁
            lock.acquire(); 
            let _this = this;
            let prevLuckAngle = this.luckNumber * 60;
            // 生成0到5之间的随机整数
            let randomNum = Math.floor(Math.random() * this.luckList.length);
            this.luckNumber = randomNum;
            // 计算最后的角度
            let endAngle = 360 * 20 + _this.luckNumber * 60 - prevLuckAngle;
            // 转盘旋转动画
            Math.animation(_this.recordPrevAngle, _this.recordPrevAngle + endAngle, 5000, 'Cubic.easeInOut',function(value, isEnding) {
              _this.angleNumber = value;
              if(isEnding){
                lock.release(); // 释放锁
                // 抽奖次数减少
                _this.drawNumber--;
                // 显示遮罩层中奖奖品
                _this.show = true;
                // 记录上一次转动最终角度
                _this.recordPrevAngle += endAngle;
                console.log(_this.luckList[_this.luckNumber])
              }
            })
          }
        }
      });

9. 最终效果

在这里插入图片描述

10. 总结

  1. 使用现有的算法库,减少了我的工作量;
  2. 在不考虑异步中奖的时候,我觉得这个实现是比较便捷的方法,当然如果需要异步中奖结果,就需要多个动画配合实现,这个功能准备将这个算法库移植到微信小程序后再实现;
  3. 同一个需求,实现的方法很多,找到最适合自己的,多关注大佬的博客,学习,感觉收获满满!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1674094.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

伦敦银晚盘预测方法:以经济数据为基础

晚盘是指北京时间晚上8点到凌晨的这个时段&#xff0c;覆盖了部分欧盘和大部分的美盘。一般来说&#xff0c;这个时段有欧美方面&#xff08;主要是美国&#xff09;的经济数据公布&#xff0c;其中一些重要的数据&#xff0c;如通胀数据、美联储公布利率决议等等&#xff0c;会…

企业为什么需要HTTPS

一.什么是HTTPS HTTPS &#xff08;全称&#xff1a;Hyper Text Transfer Protocol over SecureSocket Layer&#xff09;&#xff0c;是以安全为目标的 HTTP 通道&#xff0c;在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性 。HTTPS 在HTTP 的基础下加入SSL&a…

winserver系统设置图片查看器

新建 .bat 批处理执行文件&#xff0c;内容如下&#xff1a; echo off&cd&color 0a&cls echo Set Win10 Photo Viewer reg add "HKLM\SOFTWARE\Microsoft\Windows Photo Viewer\Capabilities\FileAssociations" /v ".jpg" /t REG_SZ /d Photo…

centos7.8 迁移为 TencentOS Server 2.4(TK4) 报错解决

文章目录 一 问题二 解决三 注意 一 问题 CentOS 官方计划停止维护 CentOS Linux 项目&#xff0c;公司某台腾讯云的centos7.8服务器计划迁移为 TencentOS Server 2.4(TK4) 。在下载rpm包执行迁移命令后报错&#xff0c;场景还原如下。 首先 安装 Python 3 yum install -y p…

Emby for Mac(轻松管理多媒体影音库)1.9.9中文版

Emby for Mac是一款强大的多媒体影音库管理工具&#xff0c;可以帮助用户轻松管理和浏览自己的影音资源。它可以将用户的个人视频、音乐和照片组合在一起&#xff0c;并将其流式传输到用户的设备上。 Emby for Mac 1.9.9中文版下载 Emby for Mac具有易于使用的界面&#xff0c;…

WMS系统业务学习

电商ERP 供应链整体流程 从采购到付款 需求—采购申请—报价请求—供应商报价—采购订单—接收—付款。 从销售到收款 销售定价—订单—发运—收款—开票。 WMS业务 收货管理 业务流程&#xff1a;采购订单—到货预约—货物交接—&#xff08;质检&#xff09;—上架。 …

【计算机毕业设计】ssm绿色农产品推广应用网站

21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的 重要性已逐渐被人们所认识&#xff0c;科学化的管理&#xff0c;使信息存储达到…

Spring AI开发前期开发指导(maven依赖下载问题解决)

文章目录 说明开发条件网络环境准备本地环境准备开发工具准备 特殊说明maven配置项目jar一致下载错误解决可行的版本搭配 说明 动力节点视频教程地址&#xff0c;本文章学习该教程&#xff0c;同时说明的maven配置问题导致的项目依赖下载失败的问题和其他问题的记录。 开发条…

SQL Server (MSSQLSERVER) 服务无法启动

解决方法&#xff1a; 打开服务&#xff0c;右键SQL Server (MSSQLSERVER) ->属性->登录&#xff0c;改为本地系统用户

vs2019 c++ 对左值引用取地址得到的是谁的地址?

&#xff08;1&#xff09; 测试一下&#xff1a; 对左值引用取地址&#xff0c;返回的地址是其引用的变量的地址&#xff0c;而非自身的地址。 &#xff08;2&#xff09; 用反汇编看一下&#xff0c;为了代码容易看懂&#xff0c;改一下源代码&#xff0c;不使用 cout 这个复…

北亚MF2200手机取证平台介绍

一、产品介绍。 北亚MF2200手机取证平台是由北亚企安科技&#xff08;北京&#xff09;有限公司&#xff08;Frombyte&#xff09;自主研发的一款针对智能手机&#xff08;iPhone、Android&#xff09;及 iPad 取证分析的法证平台。本平台采集速度快&#xff0c;可通过自动提取…

海外仓管理优化策略:花更少的钱,收获更大的收益

海外仓成本确实越来越高了。 仓储成本和人力成本几乎占据了海外仓经营成本的一大部分&#xff0c;这严重的影响了海外仓企业的盈利能力。如果你正打算开设海外仓业务或者已经在经营海外仓业务&#xff0c;那这个问题一定不能忽视&#xff0c;毕竟成本越高&#xff0c;就意味着你…

[算法面试]_01_L1和L2正则化,为什么L1正则化更容易导致稀疏?

本人今年参加了很多面试&#xff0c;也有幸拿到了一些大厂的offer&#xff0c;整理了众多面试资料&#xff0c;后续还会分享众多面试资料。 整理成了面试系列&#xff0c;由于时间有限&#xff0c;每天整理一点&#xff0c;后续会陆续分享出来&#xff0c;感兴趣的朋友可关注收…

在idea中使用vue

一、安装node.js 1、在node.js官网&#xff08;下载 | Node.js 中文网&#xff09;上下载适合自己电脑版本的node.js压缩包 2、下载完成后进行解压并安装&#xff0c;一定要记住自己的安装路径 一直点击next即可&#xff0c;这部选第一个 3、安装成功后&#xff0c;按住winR输入…

Vue3+TS实现将html或富文本编辑器转为Word并下载

说明&#xff1a;我用的富文本编辑器是wangEditor&#xff1a; wangEditor官网 安装 yarn add wangeditor/editor # 或者 npm install wangeditor/editor --save yarn add wangeditor/editor-for-vuenext # 或者 npm install wangeditor/editor-for-vuenext --save yarn add …

国内验签DV单域名SSL证书怎么购买?

JoySSL所签发的专业版单域名SSL证书可以做到国内验签&#xff0c;数据不出境&#xff0c;安全等级为业内最高。 JoySSL 专业版国际算法DV单域名证书-JoySSLJoySSL专业版国际算法DV单域名证书通过交叉授信方式&#xff0c;实现国产根与欧美根相互验证&#xff0c;完美兼容且自主…

武汉星起航:亚马逊——全球市场中的物流巨擘与技术创新引领者

在全球电商的舞台上&#xff0c;亚马逊凭借其卓越的物流体系、领先的技术创新以及深厚的市场底蕴&#xff0c;稳坐全球市场的头把交椅。其前瞻性的战略布局和不断优化的运营模式&#xff0c;不仅推动了整个电商行业的发展&#xff0c;也为全球消费者带来了前所未有的购物体验。…

C++哈希(个人笔记)

C哈希 1.unordered_mapd1.1unordered_map的构造函数1.2unorder_map的容量1.3unordered_map的迭代器1.4unordered_map的元素访问1.5unorder_map的查找1.6unordered_map的修改操作1.7unordered_map的桶操作 2.unordered_set3.unordered_set和unordered_set的笔试题4.哈希4.1哈希概…

window.localStorage.setItem() 报错

目录标题 一、原因二、快速解决三、彻底解决 一、原因 在使用sessionStorage做缓存处理时&#xff0c;报了如上的错误提示&#xff0c;经查是sessionStorage对大小是有限制的&#xff0c;所以要进行try catch&#xff0c;500KB左右的东西保存起来就会令到Resources变卡&#x…