JS动态转盘可自由设置个数与概率

让我为大家介绍一下转盘的实现过程与原理,介绍都放在下面代码块中,一步一步的教会你。
我们转盘使用线段来实现

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
    <style type="text/css">
        .boss {
            width: 400px;
            height: 400px;
            border: 5px solid #000;
            margin: 0 auto;
            border-radius: 50%;
            position: relative;
        }

        .box1 {
            width: 2px;
            height: 200px;
            position: absolute;
            background-color: #000;
            top: 0;
            left: 50%;
            margin-left: -1px;
            transform-origin: bottom;
        }

        .box2 {
            width: 1px;
            height: 200px;
            background-color: red;
            position: absolute;
            top: 0;
            left: 50%;
            transform-origin: bottom;
            z-index: 99;
            transition: 2s;
        }
    </style>
</head>

<body>
    <!-- boss是最大的容器 -->
    <div class="boss">
        <!-- box2是旋转需要用到的指针 -->
        <div class="box2"></div>
    </div>
    <!-- 动态设置转盘的份数 需要用到表单与按钮 -->
    份数:<input type="number" id="inputs" placeholder="请输入份数" />
    <!-- 确定按钮 行内点击事件 -->
    <button type="button" onclick="func()">确定份数</button>
    <!-- 点击开始旋转 行内点击事件-->
    <button type="button" onclick="myFunc()">点击旋转</button>
    <!-- boss1存放设置概率的表单 -->
    <div class="boss1"></div>
</body>
<script type="text/javascript">
    // 获取input表单
    var inputs = document.getElementById("inputs");
    // 获取boss容器
    var boss = document.querySelector(".boss");
    // 获取存放概率表单的boss1
    var boss1 = document.querySelector(".boss1");
    var num = 0;
    // 点击确定分成多少等份
    function func() {
        // 点击后会清空设置好的份数 但我们的指针不能删除
        boss.innerHTML = "<div class='box2'></div>";
        // 点击后控制概率的表单也得清空
        boss1.innerHTML = "";
        // 把inputs.value也就是控制份数的表单的value值存到num中
        num = inputs.value;
        // 判断 如果我表单中输入了1那么就返回
        if (num <= 1) {
            return;
        }
        // 循环创建线段 转盘的份数 小于我表单输入的数字 因为是从0开始循环
        // 就不需要等于num
        for (var i = 0; i < num; i++) {
            // 创建div 相当于线段
            var divs = document.createElement("div");
            // 创建input表单 控制每一份的概率
            var inp = document.createElement("input");
            // 我们把事先准备好的box1类名添加给divs
            divs.className = "box1";
            // 旋转的角度 360/份数 * i 就可以得出我们份数旋转到的位置
            divs.style.transform = `rotate(${360 / num * i}deg)`
            // 我们把divs添加到boss里
            boss.appendChild(divs);
            // 把inp添加到boss1里
            boss1.appendChild(inp);
        }
    }
    // 存一个sum = 0 到时候控制度数
    var sum = 0;
    // 控制点击旋转按钮不能连点
    var isFlag = true
    // 点击旋转
    function myFunc() {
        // 当isFlag为真时执行
        if (isFlag == true) {
            // 创建一个新数组 存概率 如果我在第一个概率表单中输入100 就生成100个1
            var arrs = [];
            var nums = 0;
            // 获取指针
            var box2 = document.querySelector(".box2");
            // 获取控制概率的表单的集合
            var boss1_inp = document.querySelectorAll(".boss1 input");
            // 循环 j<概率表单的长度
            for (var j = 0; j < boss1_inp.length; j++) {
                // 使用我们事先准备好的nums += 概率表单总体的概率总和
                // 我们需要把概率表单中的字符串变为Number 要不然就是字符串拼接了
                nums += Number(boss1_inp[j].value);
                // 循环添加进arrs
                for (var i = 0; i < boss1_inp[j].value; i++) {
                    // j+1 如果是下标为0 且给的概率为50 就是50个1
                    arrs.push(j + 1)
                }
            }
            // 判断nums 不能大于 100
            if (nums > 100) {
                console.log("总和值不能大于100");
                alert("总和值不能大于100");
            } else {
                // 如果小于100 给一个随机数去随机0-arrs.length范围中的数 向下取整
                // 用随机下标去获取arrs数组中的元素
                var aa = arrs[Math.floor(Math.random() * arrs.length)];
                // 随机的角度 要不然指针一直指向一个地方
                var bb = Math.floor(Math.random() * 360 / boss1_inp.length);
                // sum+=1 控制连续点击 如果不设置指针会从最开始的地方再进行旋转
                sum += 1;
                // 指针旋转角度控制概率后 
                // 旋转的角度 = 数组随机的值*360度/概率表单的长度+1080(先让指针旋转1080度)*连续点击的次数-随机的角度
                box2.style.transform = `rotate(${aa * 360 / boss1_inp.length + 1080 * sum - bb}deg)`;
            }
            // 点击后isFlag赋值为false 就不可以连点了
            isFlag = false
            // 这里我使用比较暴力的办法,我直接就看它的间隔时间 2s后isFlag为true
            // 就可以继续点击了
            setTimeout(function () {
                isFlag = true
            }, 2000)
        }
    }
</script>

</html>

效果图:
请添加图片描述

感谢大家的阅读,如有不对的地方,可以向我提出,感谢大家!

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

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

相关文章

Linux小程序之进度条

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;自己能实现进度条 > 毒鸡汤&#xff1a; > …

MySQL主从复制架构

MySQL主从复制架构 一、MySQL集群概述 ##1、集群的主要类型 高可用集群&#xff08;High Available Cluster&#xff0c;HA Cluster&#xff09; 高可用集群是指通过特殊的软件把独立的服务器连接起来&#xff0c;组成一个能够提供故障切换&#xff08;Fail Over&#xff09…

【Hadoop】集群资源管理器 YARN

一、yarn 简介 Apache YARN (Yet Another Resource Negotiator) 是 hadoop 2.x 引入的分布式资源管理系统。主要用于解决 hadoop 1.x 架构中集群资源管理和数据计算耦合在一起&#xff0c;导致维护成本越来越高的问题。 yarn主要负责管理集群中的CPU和内存 用户可以将各种服…

[ISCTF2023] Crypto/PWN/Reverse

最近新生赛还挺多&#xff0c;不过这个开始后注册页面就被删了&#xff0c;没注册上。拿别人的附件作了下。 Crypto 七七的欧拉 这题只给了n,e,c这种情况一般正常没法解&#xff0c;猜n不正常 import gmpy2 import libnum from crypto.Util.number import *flagbISCTF{****…

C++ day44完全背包问题 零钱兑换Ⅱ 组合总和Ⅳ

完全背包&#xff1a;一个物品可以使用无数次&#xff0c;将01背包中倒序遍历背包变成正序遍历背包 遍历顺序&#xff1a;在完全背包中&#xff0c;对于一维dp数组来说&#xff0c;其实两个for循环嵌套顺序是无所谓的&#xff01; 先遍历物品&#xff0c;后遍历背包可以&#…

docker搭建rabbit集群

1.去rabbitMQ官网拉去images 我当前使用的是最新版本的镜像&#xff1a;rabbitmq:3.12-management 2.创建一个集群专用网络 docker的容器相互隔离是不可通信的&#xff0c;我们自行创建一个网络后&#xff0c;创建容器时 给他们放在一起&#xff0c;就可以通信了。 docker netw…

2023年【安全员-A证】考试题及安全员-A证最新解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全员-A证考试题考前必练&#xff01;安全生产模拟考试一点通每个月更新安全员-A证最新解析题目及答案&#xff01;多做几遍&#xff0c;其实通过安全员-A证模拟考试题很简单。 1、【多选题】下列关于高处作业吊篮叙…

基于深度学习的点云三维目标检测方法综述

论文标题&#xff1a;基于深度学习的点云三维目标检测方法综述 作者&#xff1a;郭毅锋&#xff11;&#xff0c;&#xff12;†&#xff0c;吴帝浩&#xff11;&#xff0c;魏青民&#xff11; 发表日期&#xff1a; 2023 1 阅读日期 &#xff1a;2023 11 29 研究背景&…

Bug 检查 0x7B:INACCESSIBLE_BOOT_DEVICE(未解决)

环境&#xff1a; HP ProDesk 480 G7 Win10 专业版 问题描述&#xff1a; INACCESSIBLE_BOOT_DEVICE bug 检查的值为0x0000007B。 此 bug 检查表明 Microsoft Windows 操作系统在启动过程中无法访问系统分区 原因&#xff1a; 1.INACCESSIBLE_BOOT_DEVICE bug 检查经常发生…

基于springboot实现实习管理系统的设计与实现项目【项目源码+论文说明】计算机毕业设计

基于sprinmgboot实现实习管理系统的设计与实现演示 摘要 随着信息化时代的到来&#xff0c;管理系统都趋向于智能化、系统化&#xff0c;实习管理也不例外&#xff0c;但目前国内仍都使用人工管理&#xff0c;市场规模越来越大&#xff0c;同时信息量也越来越庞大&#xff0c;…

Condition原码分析及实现原理

一、引言 Java作为一种广泛应用于企业级开发的编程语言&#xff0c;其内部机制和特性被许多开发者所关注。本文将深入分析Java Condition原码&#xff0c;以及Condition接口的实现原理&#xff0c;为大家提供一个更深入的了解。 二、Condition概述 Condition是Java并发编程中一…

【hacker送书第5期】SQL Server从入门到精通(第5版)

第5期图书推荐 内容简介作者简介图书目录参与方式 内容简介 SQL Server从入门到精通&#xff08;第5版&#xff09;》从初学者角度出发&#xff0c;通过通俗易懂的语言、丰富多彩的实例&#xff0c;详细介绍了SQL Server开发所必需的各方面技术。全书分为4篇共19章&#xff0c;…

jenkins使用nexus插件

nexus介绍 Nexus 是一个强大的仓库管理工具&#xff0c;用于管理和分发 Maven、npm、Docker 等软件包。它提供了一个集中的存储库&#xff0c;用于存储和管理软件包&#xff0c;并提供了版本控制、访问控制、构建和部署等功能。 Nexus 可以帮助开发团队提高软件包管理的效率和…

vue项目中通过vuex管理数据

目录 1.前言&#xff1a; 2.vuex的基础用法&#xff1a; 1.构建与挂载vue 基础模板渲染 构建仓库 2.mutations的使用 1.介绍 ​编辑 2.案列&#xff1a; 3.传参 4.辅助函数mapMutations&#xff1a; 3.module分对象的写法 介绍 建立模块&#xff1a; 访问数据的方…

python接口自动化测试之requests库的基础使用

简单介绍 requests库简单易用的HTTP库 Get请求 格式&#xff1a; requests.get(url) 注意&#xff1a;若需要传请求参数&#xff0c;可直接在 url 最后的 ? 后面&#xff0c;也可以调用 get() 时多加一个参数 params &#xff0c;传入请求参数&#xff0c;注意需要是 dict…

0基础学java-day8

一、项目-零钱通 1 项目开发流程说明 1.1 项目需求说明 使用 Java 开发 零钱通项目 , 可以完成收益入账&#xff0c;消费&#xff0c;查看明细&#xff0c;退出系统等功能. 1.2 项目的界面 化繁为简. 1) 先完成显示菜单&#xff0c;并可以选择 2) 完成零钱通明细. 3) 完成…

C++学习寄录(八.继承)

继承的语法&#xff1a;class 子类 : 继承方式 父类 class A : public B; A 类称为子类 或 派生类 B 类称为父类 或 基类 1.基本使用 未使用继承的代码比较冗余重复 #include <iostream> #include <fstream> #include <string> #include <chrono>…

leetcode:循环队列

题目描述 题目链接&#xff1a;622. 设计循环队列 - 力扣&#xff08;LeetCode&#xff09; 题目分析 我们开辟空间的时候多开一个&#xff0c;k是队列的长度&#xff0c;我们开k1个空间&#xff0c;定义一个front指向头&#xff0c;back的下一个指向尾 当frontback的时候&am…

八、hdfs文件系统副本块数量的配置

1、配置方式 2、实际操作演示 &#xff08;1&#xff09;在Hadoop用户的根目录下创建text.txt文件 &#xff08;2&#xff09;上传文件 hadoopnode1:~$ hdfs dfs -ls hdfs://node1:8020/ Found 4 items drwxr-xr-x - hadoop supergroup 0 2023-11-21 23:06 hdfs:/…

Spark经典案例分享

Spark经典案例 链接操作案例二次排序案例 链接操作案例 案例需求 数据介绍 代码如下&#xff1a; package base.charpter7import org.apache.hadoop.conf.Configuration import org.apache.hadoop.fs.{FileSystem, Path} import org.apache.spark.SparkContext import org.a…