超级大转盘!(html+less+js)(结尾附代码)

超级大转盘!(结尾附代码)

网上看到有人用转盘抽奖,怀疑是不是有问题,为什么每次都中不了,能不能整个转盘自己想中啥中啥,查阅了网上写得好的文章,果然实现了只中谢谢参与!!
先上效果:
请添加图片描述

不是哥们,这还能只中谢谢参与?(其实故意干的)
请添加图片描述

这段代码用html+less+js和简单的jq判断实现

HTML部分

<section
  class="section"
  style="background-color: #1C003B;height: calc(100vh - 2.24rem);"
>
  <div class="kuohu"></div>
  <div class="luckBg">
    <div class="luckWhellBg">
      <div class="luckWhellBgMain rotateStyle"></div>
      <div class="wheel-main">
        <div class="prize-list rotateStyle"></div>
        <div class="prize_point" onclick="prizeRoll()"></div>
      </div>
    </div>
  </div>
  <p class="jihui">您今天还有<span>1</span>次抽奖机会!</p>
</section>

旋转动画的话其实就是.rotateStyle中的 transform 属性,改变转盘旋转的速度以及动画结束时间

CSS

/* 大转盘 */
.luckBg {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  /* background: #180036; */
  background-image: url(../images/borderrd.png);
  width: 6.5rem;
  height: 6.5rem;
  background-size: contain;
  /* border-radius: 50%; */
  margin: 0 auto;
  padding: 0.5rem;
  box-sizing: border-box;
  .luckWhellBg,
  .luckWhellBgMain {
    background: pink;
    width: 100%;
    height: 100%;
    border-radius: 50%;
    position: relative;
    overflow: hidden;

    .rotateStyle {
      -webkit-transition: transform 5000ms ease-in-out;
      transition: transform 5000ms ease-in-out;
    }
  }
}
.kuohu {
  width: 100%;
  height: 5.34rem;
  background-image: url(../images/kuohu.png);
  background-size: contain;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}

.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(1) {
    position: absolute;
    background: #fff68b;
  }
  &:nth-child(4) {
    position: absolute;
    background: #fff68b;
  }
  &:nth-child(2) {
    position: absolute;
    background: #ffbc2c;
  }
  &:nth-child(5) {
    position: absolute;
    background: #ffbc2c;
  }
  &:nth-child(3) {
    position: absolute;
    background: #ffd428;
  }
  &:nth-child(6) {
    position: absolute;
    background: #ffd428;
  }
}

/* .luckWhellSector:nth-child(2n+1) {
  position: absolute;
  background: #72FCF9;
} */

.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: 1.81rem;
  background-image: url(../images/btn.png);
  background-size: contain;
  height: 2.2rem;
  top: 50%;
  margin-left: -0.9rem;
  margin-top: -1rem;
  border-radius: 50%;
}

.prize_point::after {
  /*   position: absolute;
  left: 50%;
  top: -28px;
  width: 0;
  height: 0;
  margin-left: -16px;
  border: 16px solid;
  border-color: transparent transparent #ff3a60;
  content: ''; */
}

JS 部分

因为数据肯定是活的,所以我们这里要把数据单独拎出来

let formData = [
  {
    //可以随意更改奖项个数
    id: 1,
    img: "./images/33.png",
    prize_name: "谢谢参与",
  },
  {
    id: 2,
    img: "./images/22.png",
    prize_name: "打工一天",
  },
  {
    id: 3,
    img: "./images/11.png",
    prize_name: "狂炫一天",
  },
  {
    id: 4,
    img: "./images/33.png",
    prize_name: "谢谢参与",
  },
  {
    id: 5,
    img: "./images/22.png",
    prize_name: "打工一天",
  },
  {
    id: 6,
    img: "./images/11.png",
    prize_name: "狂炫一天",
  },
];

圈里的图片可以自己查找替换

const CIRCLE_ANGLE = 360; // 转盘的总旋转角度
const BIGSIZE = 24; //
let angleList = []; // 记录每个奖的位置
let gift_id = 1; //中奖ID
let prizeList = formatPrizeList(formData); //有样式的奖品列表
let index = ""; //抽中的是第几个奖品
let isRotating = false; //为了防止重复点击
let rotateAngle = 0;
let bgDom = document.getElementsByClassName("luckWhellBgMain")[0];
let divDom = document.getElementsByClassName("prize-list")[0];

定义变量

function formatPrizeList(list) {
  const l = list.length;
  // 计算单个奖项所占的角度
  const average = CIRCLE_ANGLE / l;
  const half = average / 2;
  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;
}

把奖品放入这个函数中

prizeAddHtml(prizeList);
//奖品赋值到每个奖品中;
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 style="letter-spacing:0.05rem">
            ${prizeList[i].prize_name}                
          </div>	
          <div style="padding-top:5px;">
            <img src=" ${prizeList[i].img}" style="width:45%"/>
          </div>	
        </div>`;
  }
  bgDom.innerHTML = htmlBg;
  divDom.innerHTML = htmlDiv;
}

抽奖部分

//抽奖
let prize = "";
function prizeRoll() {
  if ($(".jihui span").text() == 0) {
    return alert("你的机会已经用完了!无法继续抽奖,若获奖,请到活动页面领取");
  }
  if (isRotating) return false;
  prizeList.forEach((item, i) => {
    if (item.id == gift_id) {
      index = i;
      console.log(item.prize_name);
      prize = item.prize_name;
    } //判断中奖的位置
  });
}

转盘转动角度

//转盘转动角度
function rotating() {
  isRotating = true;
  const config = {
    duration: 5000,
    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("旋转结束");
    $(".jihui span").text(0);
    alert(prize);
  }, config.duration + 500);
}

完整代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>抽奖</title>
    <link rel="stylesheet/less" href="./css/style.less">
    <link rel="stylesheet" href="./css/base.css">
</head>

<body>
    <header class="header">
        <div class="banner" style="background-image: url(./images/banner.jpg);"></div>
    </header>
    <section class="section" style="background-color: #1C003B;height: calc(100vh - 2.24rem);">
        <div class="kuohu"> </div>
        <div class="luckBg">
            <div class="luckWhellBg">
                <div class="luckWhellBgMain rotateStyle">
                </div>
                <div class="wheel-main">
                    <div class="prize-list rotateStyle">
                    </div>
                    <div class="prize_point" onclick="prizeRoll()"></div>
                </div>
            </div>
        </div>
        <p class="jihui">您今天还有<span>1</span>次抽奖机会!</p>
    </section>
    <script>
        const CIRCLE_ANGLE = 360;
        const BIGSIZE = 24;
        let formData = [{ //可以随意更改奖项个数
            id: 1,
            img: './images/33.png',
            prize_name: "谢谢参与"
        }, {
            id: 2,
            img: './images/22.png',
            prize_name: "打工一天"
        }, {
            id: 3,
            img: './images/11.png',
            prize_name: "狂炫一天"
        }, {
            id: 4,
            img: './images/33.png',
            prize_name: "谢谢参与"
        }, {
            id: 5,
            img: './images/22.png',
            prize_name: "打工一天"
        }, {
            id: 6,
            img: './images/11.png',
            prize_name: "狂炫一天"
        },];
        let angleList = []; // 记录每个奖的位置
        let gift_id = 1; //中奖ID
        let prizeList = formatPrizeList(formData); //有样式的奖品列表
        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;
            const half = average / 2;
            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 style="letter-spacing:0.05rem">
            ${prizeList[i].prize_name}                
          </div>	
          <div style="padding-top:5px;">
            <img src=" ${prizeList[i].img}" style="width:45%"/>
          </div>	
        </div>`
            }
            bgDom.innerHTML = htmlBg;
            divDom.innerHTML = htmlDiv;
        };
        //抽奖
        let prize = ''
        function prizeRoll() {
            if ($('.jihui span').text() == 0) {
                return alert('你的机会已经用完了!无法继续抽奖,若获奖,请到活动页面领取')
            }
            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
                    console.log(item.prize_name);
                    prize = item.prize_name
                }; //判断中奖的位置
            });
            rotating();
        };
        //转盘转动角度
        function rotating() {
            isRotating = true;
            // const {rotateAngle,angleList,config,index} = {0,angleList,{duration:5000, circle: 8,mode: "ease-in-out"},index};
            const config = {
                duration: 5000,
                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('旋转结束')
                $('.jihui span').text(0)
                alert(prize)
            }, config.duration + 500);
        }			
    </script>
    <script src="./js/less.js"></script>
    <script src="./js/jquery.3.6.3.min.js"></script>
    <script src="./js/rem7.5.js"></script>
</body>
</html>

结尾

当然中什么可以自己根据id控制中什么(我中不了奖就是有黑幕!)
在这里插入图片描述

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

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

相关文章

Unity如何使用adb工具安装APK

1、下载adb工具 SDK 平台工具版本说明 | Android Studio | Android Developers (google.cn) 2、配置环境变量 把platform-tools的路径添加进去就行 打开cmd&#xff0c;输入adb&#xff0c;即可查看版本信息 3、使用数据线连接设备&#xff0c;查看设备信息&#xff08;…

【MySQL】事务及其隔离性/隔离级别

目录 一、事务的概念 1、事务的四种特性 2、事务的作用 3、存储引擎对事务的支持 4、事务的提交方式 二、事务的启动、回滚与提交 1、准备工作&#xff1a;调整MySQL的默认隔离级别为最低/创建测试表 2、事务的启动、回滚与提交 3、启动事务后未commit&#xff0c;但是…

快速搭建webase-front并且部署合约

PS: 因为我开发时候要用到fisco和webase-front,避免官方文档粘贴, 因此直接整理下面的笔记。开发的时候,好粘贴。1.搭建4节点联盟链 前提 curl 一种命令行工具 apt install -y openssl curl创建操作目录, 下载安装脚本 cd ~ && mkdir -p fisco && cd fisco…

Gartner发布应对动荡、复杂和模糊世界的威胁形势指南:当前需要应对的12种不稳定性、不确定性、复杂和模糊的安全威胁

当今世界是动荡&#xff08;Volatile&#xff09;、复杂&#xff08;Complex&#xff09;和模糊&#xff08;Ambiguous&#xff09;的&#xff0c;随着组织追求数字化转型以及犯罪分子不断发展技术&#xff0c;由此产生的安全威胁也是波动性、不确定性、复杂性和模糊性的&#…

《ElementUI 基础知识》el-tree 之“我的电脑”目录结构效果

前言 项目需求&#xff0c;Web 端获取服务器文件夹目录结构。目录数据是调接口获取&#xff0c;本篇略过&#xff0c;直接展现数据&#xff01; 效果 实现 html 代码 8 - 15 行&#xff0c;自定义节点信息&#xff1b;代码 9 - 14 行&#xff0c;判断 icon 显示&#xff1b…

数据仓库项目---Day01

文章目录 框架的安装包数据仓库概念项目需求及架构设计项目需求分析项目框架技术选型系统数据流程设计框架版本选型集群资源规划设计 数据生成模块数据埋点主流埋点方式埋点数据上报时机 服务器和JDK准备搭建三台Linux虚拟机(VMWare)编写集群分发脚本xsyncSSH无密登录配置JDK准…

顶顶通呼叫中心中间件电话黑名单系统介绍

黑名单 有显示成功和失败导入数&#xff0c;可以禁用也可以启用&#xff0c;如果禁用状态就是不使用这一组黑名单&#xff0c;多个号码核验就是验证号码存不存在。黑名单只有管理员和操作员可以配置&#xff0c;租户是看不到黑名单的。但是黑名单跟租户是互通的。 可以单个号码…

计算机毕业设计Python+Vue.js天气预测系统 中国气象质量采集与可视化 天气数据分析 天气可视化 天气大数据 天气爬虫 大数据毕业设计

摘要 随着科技技术的不断发展&#xff0c;人民物质生活质量不断提高&#xff0c;我们越来越关注身边的气象、空气等地理环境。对于普通居民我们会选择合适的气象进行出游&#xff0c;提高精神层面的生活质量&#xff1b;对于企业会关注气象变换状况&#xff0c;来定制相关的生产…

使用.NET8实现Web API

目录 1、环境准备1.1、从官网下载 及安装VS2022社区版1.2、下载及安装asp.net core的运行时及IIS Module 2、WebAPI工程创建2.1 创建API服务2.2 推荐的库2.2.1 数据库篇2.2.1.1、 SQLSugar2.2.1.2、 OracleAccess 2.2.2、IOC篇2.2.2.1、autofac2.2.2.2、 2.2.3、日志记录篇2.2.…

MY SQL 实验一:

一、实验目的 通过实验了解MYSQL数据库服务器的基本架构及基本的使用方法。 二、实验原理、条件 本实验采用著名的开源数据库软件MYSQL 作为实验平台。MYSQL有多种版本&#xff0c;常用的是服务器版。数据库引擎是用于存储、处理和保护数据的核心服务。MYSQL有多个数据库引擎&a…

【北京迅为】《iTOP-3588开发板快速烧写手册》-第4章 烧写器RKDevTool常用功能

RK3588是一款低功耗、高性能的处理器&#xff0c;适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用&#xff0c;RK3588支持8K视频编解码&#xff0c;内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

规培报名身份证上传怎么小于500k?这几个方法试试看

大家都知道在规培报名的时候&#xff0c;是需要上传一些自己的个人信息资料到平台上的&#xff0c;其中身份证照片是比较重要的一项&#xff0c;我们自己拍的身份证照片大小有时候可能不符合网站的规定&#xff0c;需要去做一些图片修改调整&#xff0c;比如图片你压缩&#xf…

【自动驾驶|毫米波雷达】初识毫米波雷达射频前端硬件

第一次更新&#xff1a;2024/5/4 目录 整体概述 混频器&#xff08;MIXER&#xff09; 低通滤波器&#xff08;LPF&#xff1a;Low-Pass filter&#xff09; 数模转换器&#xff08;ADC&#xff1a;Analog to Digital Converter&#xff09; 毫米波雷达功能框图 整体概述 完…

1072 开学寄语(测试点2)

solution 测试点2:物品编号可能不足四位&#xff0c;高位需补0 #include<iostream> #include<string> using namespace std; const int maxn 1e5; int flag[maxn] {0}; int main(){int n, m, k, cnt 0, cnt1 0, have, x;string id;cin >> n >> m…

基于STM32的智能垃圾桶设计(论文+源码)_kaic

基于STM32的智能垃圾桶设计 摘 要 随着社会科学技术的迅猛进展&#xff0c;人们的生活质量和速度也在不断提高。然而&#xff0c;大多数传统的家庭垃圾桶已经过时且缺乏创新&#xff0c;缺乏人性化设计。它们使用起来不方便、不卫生&#xff0c;所有的生活和废物垃圾都被混合…

跨平台桌面客户端开发框架

跨平台桌面客户端开发框架允许开发者创建能够在多个操作系统上运行的桌面应用程序。以下是一些流行的跨平台桌面客户端开发框架。这些框架各有优势&#xff0c;选择哪个框架取决于项目需求、团队的技术栈以及对特定特性的偏好。 1.Electron &#xff1a; 使用JavaScript, HTML…

融知财经:期权期货及其他衍生产品

期权、期货及其他衍生产品是金融市场中用于管理风险和进行投机的金融工具。这些衍生产品的价值依赖于一个或多个基础资产&#xff0c;如股票、商品、利率、汇率等。以下是关于这些衍生产品的一些基本介绍&#xff1a; 1、期货&#xff08;Futures&#xff09;&#xff1a;期货是…

5月7号(信息差)

&#x1f30d;首次&#xff0c;西湖大学用蛋白质语言模型定向改造碱基编辑器&#xff0c;登Cell子刊 https://www.jiqizhixin.com/articles/2024-05-07-10 &#x1f384; 哈马斯宣布同意停火提议 https://finance.eastmoney.com/a/202405073067687785.html ✨ 中国将对…

数据结构学习:栈(详细讲解)

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;C语言基本概念 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 &#x1f697;1.对栈概念理解&#xff1a; &a…
最新文章