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

news2024/10/5 21:17:55

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

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

效果图:
请添加图片描述

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

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

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

相关文章

【Jmeter性能测试】ForEach控制器的用法解析

引言 最近我在进行JMeter性能测试时遇到了一些问题&#xff0c;特别是在使用ForEach控制器时感到有点棘手。 但是经过不断地摸索和实践&#xff0c;终于成功地掌握了这个神奇的工具&#xff0c;提高了我的测试效率。因此&#xff0c;今天我想和大家分享我的经验&#xff0c;让…

“逆风飞翔·事实孤儿同行计划”成长陪伴主题区域陪伴培训会

为推进各机构更好地开展事实孤儿成长陪伴工作&#xff0c;促进事实孤儿成长陪伴实施成效&#xff0c;搭建各机构间事实孤儿成长陪伴方式方法交流平台。11月26日&#xff0c;在中国乡村发展基金会、中国民生银行的支持下&#xff0c;由湖南省大爱无疆青少年公益发展中心主办&…

社区内涝积水监测系统作用,改善社区积水

随着社区化进程的加速&#xff0c;社区基础设施的重要性日益凸显。在这个背景下&#xff0c;社区生命线和内涝积水监测系统成为了关注的焦点。它们在维护社区安全&#xff0c;特别是在应对暴雨等极端天气条件下&#xff0c;发挥着至关重要的作用。 WITBEE万宾时刻关注社区内涝积…

【JavaEE初阶】volatile 关键字、wait 和 notify

目录 一、volatile 关键字 1、volatile 能保证内存可见性 2、volatile 不保证原子性 二、wait 和 notify 1、wait()方法 2、notify()方法 3、notifyAll()方法 4、wait 和 sleep 的对比 一、volatile 关键字 1、volatile 能保证内存可见性 我们前面的线程安全文章中&…

Windows系统IIS服务配置与网站搭建,结合内网穿透实现公网访问

文章目录 1.前言2.Windows网页设置2.1 Windows IIS功能设置2.2 IIS网页访问测试 3. Cpolar内网穿透3.1 下载安装Cpolar内网穿透3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5.结语 1.前言 在网上各种教程和介绍中&#xff0c;搭建网页都会借助各种软件的帮助&#xf…

nginx 配置前端项目添加https

可申请阿里云免费证书 步骤省略… nginx 配置 server {listen 8050; #默认80端口 如果需要所有访问地址都是https 需要注释listen 8443 ssl; #https 访问的端口 &#xff0c;默认443server_name 192.168.128.XX; #域名 或 ip# 增加ssl#填写证书文件…

【嵌入式C】数据的大小端存储与数据格式转换

【嵌入式C】数据的大小端存储与数据格式转换 目录 1. 大小端存储格式图解2. 数据类型转换函数2.1 u8数组转u162.2 u16数转u8数组 资料&#xff1a;【嵌入式数据传输及存储的C语言实现】 以Cortex-M内核为例&#xff0c;实际应用中大部分内核都是 **小端 **存储&#xff0c;以S…

艺海泛舟——尹星从艺六十年作品展暨学术交流首展作品(一)

简历&#xff1a; 1944年1月25日出生于山西省阳高县&#xff0c;内蒙古师范学院艺术系美术专业&#xff0c;师从水彩之父李剑晨&#xff0c;北京京华美术学院创立者邱石冥&#xff0c;徐坚。与吴冠中&#xff0c;朱德群&#xff0c;赵无极&#xff0c;杨飞云是同门。擅长&…

windows系统bat脚本命令总结之EnableDelayedExpansion

前言 做了一段时间的bat脚本开发&#xff0c;bat脚本中有各种各样的命令跟传统的编程逻辑完全不同&#xff0c;本专栏会讲解下各种各式的命令使用方法。 本篇文章讲解的是EnableDelayedExpansion的使用。 EnableDelayedExpansion简介 EnableDelayedExpansion是用于在批处理脚本…

开发提测前测试的目的是什么

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

为什么修改IP和隐藏IP地址?修改IP地址带来哪些好处?

随着互联网的普及&#xff0c;越来越多的人开始依赖网络进行日常生活和工作。然而&#xff0c;在上网过程中&#xff0c;我们的IP地址是暴露无遗的&#xff0c;这就有可能导致一些安全问题。因此&#xff0c;修改IP和隐藏IP地址的需求应运而生。那么&#xff0c;为什么要修改IP…

【深度学习实验】图像处理(三):PIL——自定义图像数据增强操作(随机遮挡、擦除、线性混合)

文章目录 一、实验介绍二、实验环境1. 配置虚拟环境2. 库版本介绍 三、实验内容0. 导入必要的库1. PIL基础操作2. Cutout&#xff08;遮挡&#xff09;2.1 原理2.2 实现2.3 效果展示 3. Random Erasing&#xff08;随机擦除&#xff09;3.1 原理3.2 实现3.3 效果展示 4. Mixup&…

Spring-Mybatis源码解析--手写代码实现Spring整合Mybatis

文章目录 前言一、引入&#xff1a;二、准备工作&#xff1a;2.1 引入依赖2.2 数据源的文件&#xff1a;2.1 数据源&#xff1a; 2.3 业务文件&#xff1a; 三、整合的实现&#xff1a;3.1 xxxMapper 接口的扫描&#xff1a;3.2 xxxMapper 接口代理对象的生成&#xff1a;3.2 S…

分享83个简历竞聘PPT,总有一款适合您

分享83个简历竞聘PPT&#xff0c;总有一款适合您 83个简历竞聘PPT下载链接&#xff1a;https://pan.baidu.com/s/1iybRAisgWgXhelE1tGpzBw?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整…

java学习part25多线程

132-多线程-程序、进程、线程与并行、并发的概念_哔哩哔哩_bilibili 1.概念 2.共享内容 只有线程间能通信&#xff0c;进程之间不共享内容。 3.继承thread的多线程 相当于golang里先写一个线程函数run(),子类对象调用start()相当于go关键字 相当于go run() package thread;/…

Target、沃尔玛撸卡、采退支付下单如何避免账号关联风险?

近年来&#xff0c;随着跨境电商平台的日益繁荣&#xff0c;越来越多的国内卖家涌入其中&#xff0c;导致竞争异常激烈。为了在竞争中脱颖而出&#xff0c;一些卖家采用自动脚本程序进行浏览和下单&#xff0c;然而这种行为很容易导致账号被批量关联、封号。本文将探讨养号下单…

算法面试题--树与对象数组的转化

1. Array -> Tree var arr [{ id: 12, parentId: 1, name: "朝阳区" },{ id: 241, parentId: 24, name: "田林街道" },{ id: 31, parentId: 3, name: "广州市" },{ id: 13, parentId: 1, name: "昌平区" },{ id: 2421, parentId:…

Java核心知识点整理大全24-笔记

22. 数据结构 22.1.1. 栈&#xff08;stack&#xff09; 栈&#xff08;stack&#xff09;是限制插入和删除只能在一个位置上进行的表&#xff0c;该位置是表的末端&#xff0c;叫做栈顶 &#xff08;top&#xff09;。它是后进先出&#xff08;LIFO&#xff09;的。对栈的基…

2023.11.12 阿里云产品全线故障

阿里云 11.12 故障原因曝光&#xff1a;访问密钥服务 (Access Key) 异常 (baidu.com) 故障原因竟然是因为生成白名单代码逻辑缺陷。

皮肤警告,羊大师讲解身体与环境的默契

皮肤警告&#xff0c;羊大师讲解身体与环境的默契 我们常常忽视身体皮肤所承受的压力和警告信号。皮肤是身体的第一道屏障&#xff0c;也是与外界环境直接接触的组织。我们的皮肤通过各种方式向我们传达信息&#xff0c;警告我们关于身体健康的重要问题。本文小编羊大师将带大…