使用纯CSS和JavaScript来实现一个转盘抽奖效果(设置机率)

使用纯CSS和JavaScript来实现一个转盘抽奖效果。我们可以设定每个奖项的概率,并使用加权随机算法来决定最终的中奖奖项。

<!DOCTYPE html>
<html lang="zh"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>转盘抽奖</title><style>body {display: flex;justify-content: center;align-items: center;height: 100vh;margin: 0;background-color: #f7f7f7;}.container {position: relative;width: 300px;height: 300px;}/* 轮盘容器 */.wheel {width: 100%;height: 100%;border-radius: 50%;border: 5px solid #333;position: relative;overflow: hidden;transform: rotate(-36deg);transition: transform 5s ease-out;}/* 使用 clip-path 切分成10个扇形,并设置z-index */.wheel div {position: absolute;width: 100%;height: 100%;clip-path: polygon(50% 50%, 87% -3%, 100% 33%);transform-origin: 50% 50%;z-index: 1;}/* 设置每个扇形区域的颜色和旋转角度 */.wheel div:nth-child(1) {background-color: #f39c12;transform: rotate(0deg);}.wheel div:nth-child(2) {background-color: #e74c3c;transform: rotate(36deg);}.wheel div:nth-child(3) {background-color: #8e44ad;transform: rotate(72deg);}.wheel div:nth-child(4) {background-color: #3498db;transform: rotate(108deg);}.wheel div:nth-child(5) {background-color: #1abc9c;transform: rotate(144deg);}.wheel div:nth-child(6) {background-color: #27ae60;transform: rotate(180deg);}.wheel div:nth-child(7) {background-color: #f1c40f;transform: rotate(216deg);}.wheel div:nth-child(8) {background-color: #2ecc71;transform: rotate(252deg);}.wheel div:nth-child(9) {background-color: #e67e22;transform: rotate(288deg);}.wheel div:nth-child(10) {background-color: #c0392b;transform: rotate(324deg);}/* 奖项名称的显示 */.wheel div span {position: absolute;top: 50%;left: 50%;transform: translate(150%, -380%) rotate(-45deg);font-size: 12px;color: #fff;text-align: center;}/* 指针样式 */.pointer {position: absolute;top: 50%;left: 50%;width: 0;height: 0;border-left: 4px solid transparent;border-right: 4px solid transparent;border-bottom: 130px solid #333;transform: translate(4%, -96%);transform-origin: bottom center; /* 将旋转中心点移到指针底部 */z-index: 10;}button {width: 100px;height: 32px;border-radius: 20px;margin-top: 40px;}</style></head><body><div style="display: flex; flex-direction: column; align-items: center"><div class="container"><div class="wheel" id="wheel"><div><span>一等奖</span></div><div><span>二等奖</span></div><div><span>三等奖</span></div><div><span>四等奖</span></div><div><span>五等奖</span></div><div><span>六等奖</span></div><div><span>七等奖</span></div><div><span>八等奖</span></div><div><span>九等奖</span></div><div><span>十等奖</span></div></div><div class="pointer"></div></div><button onclick="spinPointer()">开始抽奖</button></div><script>let isSpinning = falseconst pointer = document.querySelector('.pointer')// 定义每个奖项及其对应的中奖概率 (权重)const prizes = [{ name: '一等奖', angle: 0, probability: 5 }, // 5% 概率{ name: '二等奖', angle: 36, probability: 10 }, // 10% 概率{ name: '三等奖', angle: 72, probability: 15 }, // 15% 概率{ name: '四等奖', angle: 108, probability: 10 }, // 10% 概率{ name: '五等奖', angle: 144, probability: 5 }, // 5% 概率{ name: '六等奖', angle: 180, probability: 20 }, // 20% 概率{ name: '七等奖', angle: 216, probability: 10 }, // 10% 概率{ name: '八等奖', angle: 252, probability: 10 }, // 10% 概率{ name: '九等奖', angle: 288, probability: 5 }, // 5% 概率{ name: '十等奖', angle: 324, probability: 10 } // 10% 概率]// 计算总概率权重const totalProbability = prizes.reduce((total, prize) => total + prize.probability,0)// 随机抽奖函数,基于权重function getRandomPrize() {const random = Math.random() * totalProbabilitylet sum = 0for (let prize of prizes) {sum += prize.probabilityif (random <= sum) {return prize}}}// 转动指针的函数function spinPointer() {if (isSpinning) return // 如果正在转动,不允许重复点击isSpinning = trueconst selectedPrize = getRandomPrize()const spins = Math.floor(Math.random() * 5) + 5 // 随机转动5到10圈const totalRotation = spins * 360 + selectedPrize.angle // 指针旋转的总角度pointer.style.transition = 'transform 4s ease-out'pointer.style.transform = `translate(4%, -96%) rotate(${totalRotation}deg)`// 等待动画结束后提示中奖奖项setTimeout(() => {alert(`恭喜你获得了: ${selectedPrize.name}`)isSpinning = false // 允许再次点击}, 5000) // 动画时间为5秒}</script></body>
</html>

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是组态软件?Web组态软件又是什么?

从事相关工作的对“组态软件”应该都不陌生&#xff0c;那Web组态软件又是什么呢?本文将对Web组态可视化软件&#xff08;下称“Web组态软件”&#xff09;做简单介绍&#xff0c;可视化编辑器是Web组态软件中的一个重要功能模块。除了编辑器&#xff0c;还有哪些功能模块?又…

leetcode---素数,最小质因子,最大公约数

1 判断一个数是不是质数(素数) 方法1&#xff1a;依次判断能否被n整除即可&#xff0c;能够整除则不是质数&#xff0c;否则是质数 方法2&#xff1a;假如n是合数&#xff0c;必然存在非1的两个约数p1和p2&#xff0c;其中p1<sqrt(n)&#xff0c;p2>sqrt(n)。 方法3&…

医院管理新思维:Spring Boot技术应用

5系统详细实现 5.1 医生模块的实现 5.1.1 病床信息管理 医院管理系统的医生可以管理病床信息&#xff0c;可以对病床信息添加修改删除操作。具体界面的展示如图5.1所示。 图5.1 病床信息管理界面 5.1.2 药房信息管理 医生可以对药房信息进行添加&#xff0c;修改&#xff0c;…

Java中System类和RunTime类的Api

目录 System 类 1)out 2)err 3)in 4)currentTimeMillis() 5)nanoTime() 6)arraycopy(Object 要从里面复制东西的数组, int 要从里面复制东西数组的索引起始位置, Object 获得复制元素的数组, int 获得复制元素数组的起始索引, int 要复制东西的个数) 7)gc() 8)exit(int status)…

运维工具之ansible

Ansible 1.什么是ansible? ​ ansible是基于ssh架构的自动化运维工具&#xff0c;由python语言实现&#xff0c;通过ansible可以远程批量部署等。 2.部署前提 ​ 控制端需要安装ansible,被控制端要开启ssh服务&#xff0c;并允许远程登录&#xff0c;被管理主机需要安装py…

探讨Facebook在全球社交网络中的技术优势

Facebook作为全球最大的社交网络之一&#xff0c;其技术优势在于多个方面&#xff0c;这些优势不仅塑造了用户体验&#xff0c;也影响了整个社交媒体生态。 个性化用户体验 Facebook通过分析用户的行为和兴趣&#xff0c;提供个性化的内容推荐。利用机器学习算法&#xff0c;平…

仅用一分钟,AI如何帮你构建完整的论文初稿?揭秘背后科技!

大家好&#xff01;在今天的分享中&#xff0c;我们将深入探讨一项令人兴奋的技术进展&#xff1a;仅用一分钟&#xff0c;AI如何帮助你构建一篇完整的论文初稿。这项技术不仅节省了研究人员和学生的宝贵时间&#xff0c;还改变了我们对学术写作的传统认知。 首先&#xff0c;…

【读书笔记·VLSI电路设计方法解密】问题10:从概念到硅片开发SoC芯片的主要任务

从概念到硅片的SoC芯片开发过程可分为以下四个任务&#xff1a;设计、验证、实现和软件开发。 设计&#xff1a;通常从市场调研和产品定义开始&#xff0c;然后进行系统设计&#xff0c;最后以RTL编码结束。验证&#xff1a;确保芯片按照设计规格能够准确执行功能&#xff0c;…

深度学习500问——Chapter17:模型压缩及移动端部署(4)

文章目录 17.9 常用的轻量级网络有哪些 17.9.1 SequeezeNet 17.9.2 MobileNet 17.9.3 MobileNet-v2 17.9.4 Xception 17.9 常用的轻量级网络有哪些 17.9.1 SequeezeNet SqueezeNet出自 F.N.landola, S.Han等人发表的论文《SqueezeNet&#xff1a;ALexNet-level accuracy with…

目标检测中的损失函数

损失函数是用来衡量模型与数据的匹配程度的&#xff0c;也是模型权重更新的基础。计算损失产生模型权重的梯度&#xff0c;随后通过反向传播算法&#xff0c;模型权重得以更新进而更好地适应数据。一般情况下&#xff0c;目标损失函数包含两部分损失&#xff0c;一个是目标框分…

RandLA-Net PB 模型 测试

tensorflow ckpt 模型 转换 pb 模型, 测试模型是否正确, 后续实现 c++ 部署。 Code: https://github.com/QingyongHu/RandLA-Net 测试PB 模型 RandLANetConvert.py import tensorflow.compat.v1 as tf tf.disable_v2_behavior

R语言中的plumber介绍

R语言中的plumber介绍 基本用法常用 API 方法1. GET 方法2. POST 方法3. 带路径参数的 GET 方法 使用 R 对数据进行操作处理 JSON 输入和输出运行 API 的其他选项其他功能 plumber 是个强大的 R 包&#xff0c;用于将 R 代码转换为 Web API&#xff0c;通过使用 plumber&#x…

PowerJob做定时任务调度

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、区别对比二、使用步骤1. 定时任务类型2.PowerJob搭建与部署 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; PowerJob是基于java开…

如何优化抖音直播间数据?

在数字驱动的时代&#xff0c;缺乏精准的数据支撑&#xff0c;任何线上活动都难以形成有效的流量循环。特别是在抖音直播这一领域&#xff0c;深入理解并优化核心数据&#xff0c;是提升直播效果、吸引并留住观众的关键。那么&#xff0c;抖音直播平台在评估一场直播时&#xf…

【重学 MySQL】四十六、创建表的方式

【重学 MySQL】四十六、创建表的方式 使用CREATE TABLE语句创建表使用CREATE TABLE LIKE语句创建表使用CREATE TABLE AS SELECT语句创建表使用CREATE TABLE SELECT语句创建表并从另一个表中选取数据&#xff08;与CREATE TABLE AS SELECT类似&#xff09;使用CREATE TEMPORARY …

安装最新 MySQL 8.0 数据库(教学用)

安装 MySQL 8.0 数据库&#xff08;教学用&#xff09; 文章目录 安装 MySQL 8.0 数据库&#xff08;教学用&#xff09;前言MySQL历史一、第一步二、下载三、安装四、使用五、语法总结 前言 根据 DB-Engines 网站的数据库流行度排名&#xff08;2024年&#xff09;&#xff0…

【Redis】持久化(上)---RDB

文章目录 持久化的概念RDB手动触发自动触发bgsave命令的运行流程RDB文件的处理RDB的优缺点RDB效果展示 持久化的概念 Redis支持AOF和RDB两种持久化机制,持久化功能能有效的避免因进程退出而导致的数据丢失的问题,当下次重启的时候利用之前持久化的文件即可实现数据恢复. 所以此…

一键生成PPT的AI工具-Kimi!

一键生成PPT的AI工具-Kimi&#xff01; 前言介绍Kimi为什么选择Kimi如何使用Kimi在线编辑PPT下载生成的PPT自己编辑 结语 &#x1f600;大家好&#xff01;我是向阳&#x1f31e;&#xff0c;一个想成为优秀全栈开发工程师的有志青年&#xff01; &#x1f4d4;今天不来讨论前后…

启动hadoop后没有 NodeManager和 ResourceManager

跟着黑马网课学下去时发现我的hadoop启动后没有NodeManager和ResourceManager 找到日志的路径 我在/export/server/hadoop/etc/hadoop/hadoop-env.sh文件里配置了日志存放的路径 这里找到你的日志路径&#xff0c;每个人的习惯和看的教程不同&#xff0c;日志放的地方大概率也…

对象比较工具类:实现对业务的修改记录保存(对象字段差异对比)

测试 1&#xff1a;User类 Data NoArgsConstructor AllArgsConstructor public class User {FieldLabel("姓名")private String name;FieldLabel("年龄")private Integer age;FieldLabel("手机")private String phone;FieldLabel("手机号…