实现一个转盘随机选择器

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

<!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>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Midjourney如何用参考图/垫图来绘画图

大家都知道AI绘画工具每次生成的效果都是随机的&#xff0c;但是现在很多AI绘图工具都提供了利用参考图/垫图的方式出图&#xff0c;这样就可以让让AI画作生成自己想要的布局、场景、色彩等等。 国内的AI绘图工具一般都好操作&#xff0c;国外主流的Midjourney也可以添加参考图…

DataV图表-排名轮播表自定义

DataV图表-排名轮播表自定义数据大屏可视化 场景&#xff1a;需要计算根据分数不同柱子的颜色不同 低于60分变成为橙色柱子 一开始使用的是 dv-scroll-ranking-board 这个不可以自定义颜色和属性 我们可以更改 dv-scroll-board 样式来实现 排名轮播表 安装 data-view npm ins…

2023年最新互联网Java面试八股文出炉(附大厂P5-P8技术栈)

为什么感觉 Java 面试变难了&#xff1f; 几年前&#xff0c;你只需要简单的ssm框架&#xff0c;就能轻松找到一份Java的工作&#xff0c;但现在不一样了&#xff0c;随着涌入这个行业的人越来越多&#xff0c;同一个岗位需要筛选掉更多人&#xff0c;要求自然水涨船高&#x…

短视频------Adobe Photoshop 笔记总结

一、Adobe Photoshop 使用方式方法 ctrlc/v 复制 粘贴 ctrlx 剪切 ctrla 全选 ctrlz撤销 ctrls保存 ENTER 回车 换行 CTRL 调取定界框 CAPSLOCK 大写锁定 Esc 退出 Delete 删除 Backspace 退格 Ctrl shi alt 三个控制键 Shi 连选 ctrl 加选/减选 锁屏 WinL 打开运行命令窗口 …

WLAN的Roaming机制和案例log解析

一 、WLAN漫游简介 [百度百科]:当网络环境存在多个相同SSID的AP,且它们的微单元互相有一定范围的重合时,无线用户可以在整个WLAN覆盖区内移动,无线网卡能够自动发现附近信号强度最大的AP,并通过这个AP收发数据,保持不间断的网络连接,这就称为无线漫游。 简单来说:WLA…

【SpringCloud config分布式配置中心】—— 每天一点小知识

&#x1f4a7; S p r i n g C l o u d c o n f i g 分布式配置中心 \color{#FF1493}{SpringCloud config分布式配置中心} SpringCloudconfig分布式配置中心&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云的…

【Spring Cloud系列】-Eureka服务端高可用详解

【Spring Cloud系列】-Eureka服务端高可用详解 文章目录 【Spring Cloud系列】-Eureka服务端高可用详解一. 序言二. 什么是高可用性三. 什么是CAP一致性&#xff08;Consistency&#xff09;可用性&#xff08;Availability&#xff09;分区容错&#xff08;Partition-toleranc…

Lowe‘s EDI 项目数据库方案开源介绍

近期为了帮助广大用户更好地使用 EDI 系统&#xff0c;我们根据以往的项目实施经验&#xff0c;将成熟的 EDI 项目进行开源。用户安装好知行之桥EDI系统之后&#xff0c;只需要下载我们整理好的示例代码&#xff0c;并放置在知行之桥指定的工作区中&#xff0c;即可开始使用。 …

使用cloc软件对项目的代码行数进行统计

1、下载cloc https://github.com/AlDanial/cloc/releases 进入之后选择exe进行下载。 2、下载之后随意放在任意文件夹下&#xff0c;并修改命名为cloc.exe 3、然后设置该目录为环境变量 4、在需要统计代码行数的目录&#xff0c;shift右键&#xff0c;打开Powershell窗口 5、输…

多元回归预测 | Matlab麻雀算法(SSA)优化极限学习机ELM回归,SSA-ELM回归预测,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab麻雀算法(SSA)优化极限学习机ELM回归,SSA-ELM回归预测,多变量输入模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源码 %% 清空环境变…

认识 SpringCloud 核心组件

✅作者简介&#xff1a;大家好&#xff0c;我是Cisyam&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Cisyam-Shark的博客 &#x1f49e;当前专栏&#xff1a; 微服务探索之旅 ✨特色专…

Spring Resources资源操作

文章目录 1、Spring Resources概述2、Resource接口3、Resource的实现类3.1、UrlResource访问网络资源3.2、ClassPathResource 访问类路径下资源3.3、FileSystemResource 访问文件系统资源3.4、ServletContextResource3.5、InputStreamResource3.6、ByteArrayResource 4、Resour…

PyGame游戏编程

Python非常受欢迎的一个原因是它的应用领域非常广泛&#xff0c;其中就包括游戏开发。而是用Python进行游戏开发的首选模块就是PyGame。 1. 初识Pygame PyGame是跨平台Python模块&#xff0c;专为电子游戏设计&#xff0c;包含图像、声音等&#xff0c;创建在SDL&#xff08;…

DAY31——贪心

1.分发饼干 class Solution {public int findContentChildren(int[] g, int[] s) {Arrays.sort(g);Arrays.sort(s);int start 0;int count 0;for (int i 0; i < s.length && start < g.length; i) {if (s[i] > g[start]) {start;count;}}return count;} } …

本地离线安装SeleniumIDE(Chrome)

一、插件下载 现需要准备一台可以连接外网的电脑&#xff0c;由于受到chrome的限制&#xff0c;我们可以选择搭梯子进行直接安装相应插件&#xff0c;但考虑到部分新手不会翻墙&#xff0c;本次提供一个不需翻墙的方法。 进入https://www.crx4chrome.com/crx/181591/网页内&…

SpringBoot项目-双人对战五子棋实验报告

简单五子棋Web项目报告 课 程 Web应用程序设计 项目名称 简单双人五子棋对战 成绩 专业班级 XXX 组别 无 学号 XXX 指导教师 XXX 姓 名 XXX 同组人姓名 无 完成日期 XXX 功能描述 1.用户的注册及登录功能 玩家可以在完成游戏账户的注册&#xff0c…

PADS VX 网络飞线的隐藏与关闭

如何设置隐藏和关闭网络飞线&#xff1f; 以隐藏和关闭GND网络飞线为例。网络飞线的隐藏&#xff1a;界面不会显示飞线&#xff0c;但移动器件时会显示。打开PADS layout&#xff0c;点击“查看”→“网络”&#xff08;快捷方式“CtrlAltN”&#xff09;&#xff0c;在弹出的…

POI导出Excel (满满的干货啊)

已经实现的POI导出Excel 步骤一&#xff1a;导入依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi…

k8s部署单点的minio集群

k8s部署单点的minio集群 文章目录 前言一、基础环境准备二、准备yaml文件三、执行部署四、命令行查看部署结果五、登陆页面访问总结 前言 记录一下根据minio官网的范本部署一个单节点单磁盘的minio服务端。 一、基础环境准备 准备一个k8s集群&#xff0c;配置好存储类 二、…

【从删库到跑路】MySQL数据库的查询(单表查询,多表查询,内外连接,联合查询,子查询)

&#x1f38a;专栏【MySQL】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; 文章目录 &#x1f354;多表查询⭐多表关系&#x1f388;一对多&#x…