实现一个转盘随机选择器

news2024/11/18 11:22:47

实现效果
在这里插入图片描述
完整代码

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      .luckBg {
        background: #ffcf49;
        width: 20rem;
        height: 20rem;
        border-radius: 50%;
        margin: 0 auto;
        padding: 5px;
      }
      .luckWhellBg,
      .luckWhellBgMain {
        background: #fff;
        width: 100%;
        height: 100%;
        border-radius: 50%;
        position: relative;
        overflow: hidden;
      }
      .rotateStyle {
        -webkit-transition: transform 1000ms ease-in-out;
        transition: transform 1000ms ease-in-out;
      }
      .luckWhellSector {
        position: absolute;
        top: 0;
        right: 0;
        transform-origin: 0% 100%;
        border: 1px solid #facd89;
        border-right: 0;
        border-top: 0;
        box-sizing: border-box;
      }

      .luckWhellSector:nth-child(2n) {
        position: absolute;
        background: #fff3d8;
      }
      .wheel-main {
        position: absolute;
        left: 0;
        right: 0;
        top: 0;
        bottom: 0;
        width: 100%;
        height: 100%;
        z-index: 2;
      }
      .prize-list {
        width: 100%;
        height: 100%;
        position: relative;
      }
      .prize-item {
        position: absolute;
        left: 50%;
        height: 50%;
        padding-top: 15px;
        box-sizing: border-box;
        text-align: center;
        transform-origin: 50% 100%;
        color: #f83c0e;
      }
      .prize_point {
        position: absolute;
        left: 50%;
        background: #ff3a60;
        width: 4rem;
        height: 4rem;
        top: 50%;
        margin-left: -2rem;
        margin-top: -2rem;
        border-radius: 50%;
        text-align: center;
        line-height: 4rem;
        color: #fff;
        cursor: pointer;
      }
      .prize_point::after {
        position: absolute;
        left: 50%;
        top: -1.5rem;
        width: 0;
        height: 0;
        margin-left: -1rem;
        border: 1rem solid;
        border-color: transparent transparent #ff3a60;
        content: '';
      }
    </style>
  </head>
  <body>
    <h2 style="margin: 30px auto; width: 300px; text-align: center">吃什么</h2>
    <div class="luckBg">
      <div class="luckWhellBg">
        <div class="luckWhellBgMain rotateStyle">
          <!-- <div class="luckWhellSector">

        </div> -->
        </div>
        <div class="wheel-main">
          <div class="prize-list rotateStyle">
            <!-- <div class="prize-item" v-for='(item,index) in prize_List' :key="index" :style="item.style">
							
						<div>
							{{item.prize_name}}	
						</div>	
						<div style="padding-top:5px;">
							<img :src="item.img" style="width:45%"/>
						</div>	
					</div>		 -->
          </div>
          <div class="prize_point" onclick="prizeRoll()">开始</div>
        </div>
      </div>
    </div>
    <script>
      const CIRCLE_ANGLE = 360
      const BIGSIZE = 24
      let data = [
        {
          //可以随意更改奖项个数 还可以加color img
          id: 1,
          prize_name: '新疆小厨',
        },
        {
          id: 2,
          prize_name: '抿节',
        },
        {
          id: 3,
          prize_name: '奈哥酸菜鱼',
        },
        {
          id: 4,
          prize_name: '麻食',
        },
        {
          id: 5,
          prize_name: '刀削面',
        },
        {
          id: 6,
          prize_name: '牛肉汤',
        },
      ]
      let angleList = [] // 记录每个奖的位置
      let gift_id = 3 //中奖ID
      let prizeList = formatPrizeList(data) //有样式的奖品列表
      let index = '' //抽中的是第几个奖品
      let isRotating = false //为了防止重复点击
      let rotateAngle = 0
      let bgDom = document.getElementsByClassName('luckWhellBgMain')[0]
      let divDom = document.getElementsByClassName('prize-list')[0]
      prizeAddHtml(prizeList)
      //每个奖增加style
      function formatPrizeList(list) {
        const l = list.length
        // 计算单个奖项所占的角度
        const average = CIRCLE_ANGLE / l //60
        const half = average / 2 //30
        const rightBig = l == 2 ? '50' : '0'
        const heightBig = l <= 3 ? '100' : '50'
        const topBig = l == 3 ? '-50' : '0'
        const skewMain = l <= 2 ? 0 : (-(l - 4) * 90) / l
        // 循环计算给每个奖项添加style属性
        list.forEach((item, i) => {
          // 每个奖项旋转的位置为 当前 i * 平均值 + 平均值 / 2
          const angle = -(i * average + half)
          const bigAge = l > 2 ? (i * 360) / l : '0'
          // 增加 style 这个是给每一个奖项增加的样式
          item.style = `-webkit-transform: rotate(${-angle}deg);
          transform: rotate(${-angle}deg);
          width:${(100 / l) * 2}%;  
          margin-left: -${100 / l}%;
          font-size:${BIGSIZE - l}px;`
          //这是给每一个转盘背景新增的样式
          item.style2 = `-webkit-transform: rotate(${bigAge}deg);
          transform: rotate(${bigAge}deg) skewY(${skewMain}deg);
          right:${rightBig * i}%;
          height:${heightBig}%;
          top:${topBig}%;
          width:${l == 1 ? 100 : 50}%;
          background:${item.color}
          `
          // 记录每个奖项的角度范围
          angleList.push(angle)
        })
        return list
      }
      //奖品赋值到每个奖品中;
      function prizeAddHtml(prizeList) {
        console.log(prizeList)
        //把奖品赋值到.luckWhellBgMain
        let htmlBg = ''
        let htmlDiv = ''
        for (let i = 0, len = prizeList.length; i < len; i++) {
          htmlBg += `<div class="luckWhellSector" style="${prizeList[i].style2}"></div>`
          htmlDiv += `<div class="prize-item"  style="${prizeList[i].style}">							
          <div>
            ${prizeList[i].prize_name}                
          </div>	
        </div>`
        }
        bgDom.innerHTML = htmlBg
        divDom.innerHTML = htmlDiv
      }
      //抽奖
      function prizeRoll() {
        if (isRotating) return false
        gift_id = Math.floor(1 + Math.random() * prizeList.length)
        console.log(gift_id)
        prizeList.forEach((item, i) => {
          if (item.id == gift_id) index = i //判断中奖的位置
        })
        rotating()
      }
      //转盘转动角度
      function rotating() {
        isRotating = true
        // const {rotateAngle,angleList,config,index} = {0,angleList,{duration:5000, circle: 8,mode: "ease-in-out"},index};
        const config = {
          duration: 500,
          circle: 8,
          mode: 'ease-in-out',
        }
        // 计算角度
        const angle =
          // 初始角度
          rotateAngle +
          // 多旋转的圈数
          config.circle * CIRCLE_ANGLE +
          // 奖项的角度
          angleList[index] -
          (rotateAngle % CIRCLE_ANGLE)
        rotateAngle = angle
        bgDom.style.transform = `rotate(${rotateAngle}deg)`
        divDom.style.transform = `rotate(${rotateAngle}deg)`
        // 旋转结束后,允许再次触发
        setTimeout(() => {
          isRotating = false
          console.log('旋转结束')
        }, config.duration + 500)
      }
    </script>
  </body>
</html>

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

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

相关文章

Java的Stream流详细讲解

一.Stream 是什么 Stream是Java 8新增的重要特性, 它提供函数式编程支持并允许以管道方式操作集合. 流操作会遍历数据源, 使用管道式操作处理数据后生成结果集合, 这个过程通常不会对数据源造成影响。 ​ 同时stream不是一种数据结构&#xff0c;它只是某种数据源的一个视图&…

Neo4j desktop在界面上使用dump备份还原

Neo4j数据库的版本在4.4版本中有dump &#xff08;Neo4j 3.5的版本没有dump文件&#xff09;&#xff0c;选中某个数据库可以使用dump导出一个.dump文件。 导出后的文件 导入dump文件&#xff0c;创建新的数据库

基于InteloneAPI的油锅爆燃预警系统

基于InteloneAPI的油锅爆燃预警系统 前言一、方案介绍1.系统概述2.设计思路 二、方案实现1.ResNet-18模型2.Intel OneAPI AI Kit 使用1.Intel Neural Compressor&#xff1a;2.Intel Optimization for PyTorch* 三、方案价值总结 前言 家居场景下&#xff0c;最容易起火的原因…

selenium自动化登录(实战解析)

目录 1.纯英文验证码 1.首先需要了解运行所需要的模块 2.获取我们的目标地址链接 3.进入古诗词首页面&#xff0c;找到验证码的标签&#xff0c;获取并且保存 4.调用超级鹰打码平台 5.调用超级鹰内的方法 6.输入账号密码 7.模拟登陆需要用cookie保持登陆状态 相信有很多…

人工智能 | 技能人才评价证书分析及人工智能/计算机类证书推荐

目录 简介技能人才评价证书相关介绍1. 国家职业资格证书2. 职业技能等级证书 推荐证书目录1. 计算机类的国家职业资格证书a. 证书推荐b. “软高***”和“PMP”的区别 2. 计算机类的职业技能等级证书a. 工信部认证b. 中国人工智能学会证书 专业证书的作用1. 抵税2. 领取职业技能…

想要让视频素材格式快速调整转换的方法分享

有时候有些视频播放软件不支持播放某些格式的视频文件&#xff1f;那要怎么解决呢&#xff1f;换一个播放软件&#xff1f;不妨试试批量转换视频格式&#xff0c;简单的几步操作就能快速解决烦恼&#xff0c;跟着小编一起来看看具体的操作环节吧。 首先先进入“固乔科技”的官网…

Apikit 自学日记:发起快速测试

功能入口&#xff1a;API管理应用 / 选中某个项目 / API文档菜单 / 选中标签页旁加号 发起快速测试 如果未创建该接口文档&#xff0c;仅临时调试接口&#xff0c;则可创建API快速测试页面。可在这个页面输入接口相关的信息并进行快速测试。具体各协议的测试字段配置&#xf…

NoSQL之Redis配置

NoSQL 一、关系型数据库与非关系型数据库关系型数据库非关系型数据库区别 二、Redis简介Redis的优点Redis的使用场景 三、Redis安装部署四、Redis命令工具redis-cli 命令行工具redis-benchmark 测试工具 五、Redis 数据库常用命令六、Redis多数据库常用命令 一、关系型数据库与…

深入浅出设计模式 - 观察者模式

博主介绍&#xff1a; ✌博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家✌ Java知识图谱点击链接&#xff1a;体系化学习Java&#xff08;Java面试专题&#xff09; &#x1f495;&#x1f495; 感兴趣的同学可以收…

【Sql】win11系统安装sqlserver2008r2数据库,找不到文件user.config line 5

【问题描述】 在win11系统环境下&#xff0c; 安装sql server 2008 r2数据库的时候&#xff0c;提示【Microsoft.NET Framework】窗口错误。 如果点击继续&#xff0c;应用程序将忽略此错误并尝试继续。 具体错误明细&#xff1a; 创建userSettings/Microsoft.SqlServer.Config…

centos下的Nginx的安装 --yum安装

1.没有可用软件包 nginx 2.检查yum源下nginx相关软件包 3.解决yum源无nginx软件包问题 yum install epel-release yum update更新yum源后查询结果 4.安装nginx yum -y install nginx5.yum安装后的nginx相关目录 6.查看nginx.conf&#xff0c;确定nginx相关具体目录 详细配置…

ECCV2020-DY-RELU

论文地址&#xff1a;https://arxiv.org/abs/2003.10027论文代码&#xff1a;https://github.com/Islanna/DynamicReLU三方复现&#xff1a;Dynamic ReLU: 与输入相关的动态激活函数 - 知乎 ReLU是深度学习中很重要的里程碑&#xff0c;简单但强大。目前有很多ReLU的改进版&am…

【uniapp学习之分享小程序页面】

一、设置分享功能之前的样子 二、在代码中开启分享转发按钮 <script>export default {data() {return {}},methods: {},onLoad() {wx.showShareMenu({withShareTicket: true,menus: [shareAppMessage, shareTimeline]});},onShareAppMessage(res) { //发送给朋友return …

C1. Make Nonzero Sum (easy version) - 思维

分析&#xff1a; n一但是奇数就一定不行&#xff0c;因为无论有多少-1和1都会导致最后的和是-1或1&#xff0c;每次断开一个区间会改变2&#xff0c;所以一定不行&#xff0c;直接输出-1。 其次&#xff0c;如果数组满足题意也可以一个一个输出每一个下标&#xff0c;遍历数组…

4 测试分类

文章目录 总结:课程笔记 总结: 课程笔记

I/O复用的高级应用三——同时处理TCP和UDP服务

截至目前学习&#xff0c;我们讨论过的服务器程序都只监听一个端口。但在实际应用中&#xff0c;有不少服务器程序能同时监听多个端口&#xff0c;比如超级服务inetd和android的调试服务adbd。 从bind系统调用的参数看&#xff0c;一个socket只能与一个socket地址绑定&#xff…

聚焦 5 大技术领域,腾讯2023 年度犀牛鸟开源人才培养计划启动报名

如今&#xff0c;开源已成为全球科技创新的重要方式&#xff0c;而人才建设则是中国开源生态健康发展的关键。 6 月 28 日&#xff0c;在开放原子校源行清华大学站上&#xff0c;腾讯 2023 年度犀牛鸟开源人才培养计划正式启动&#xff0c;将聚焦AI、大数据、数据库、基础软件…

MATLAB代码:配网节点电价 DLMP 考虑网损,电压,阻塞的配电网二阶锥节点电价 (DLMP)需要gurobi求解器

MATLAB代码&#xff1a;配网节点电价 DLMP 关键词&#xff1a;DLMP SOCP lindistflow 参考文档&#xff1a;《Distribution Locational Marginal Pricing (DLMP) for Congestion Management and Voltage Support》2018 SCI一区 IEEE Transactions on Power System 非完美复现 …

使用 Jetpack Compose 构建 CircularProgressIndicator

欢迎阅读这篇关于如何使用 Jetpack Compose 构建 CircularProgressIndicator&#xff08;圆形进度指示器&#xff09;的博客。Jetpack Compose 是 Google 推出的一款现代化 UI 工具包&#xff0c;用于构建 Android 界面。其声明式的设计使得 UI 开发更加简洁、直观。 一、什么…

Spring 中的 bean 是线程安全的吗?

spring 是一款非常流行的 Java 开源框架&#xff0c;它主要用于构建企业级应用程序。Spring 的 IoC 和AOP技术能够帮助开发人员更加便捷地组织和管理 Java 代码。 在 Spring 中&#xff0c;bean 默认是单例模式&#xff0c;也就是说&#xff0c;每个 bean 只会被 Spring 容器创…