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

简介: 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>

效果图:

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

相关文章
|
3月前
|
前端开发
用html+javascript打造公文一键排版系统3:获取参数设置、公文标题排版
用html+javascript打造公文一键排版系统3:获取参数设置、公文标题排版
|
1月前
|
JavaScript 前端开发 开发者
如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查代码规范并自动格式化 Vue.js 代码,包括安装插件、配置 ESLint 和 Prettier 以及 VSCode 设置的具体步骤
随着前端开发技术的快速发展,代码规范和格式化工具变得尤为重要。本文介绍了如何在 Visual Studio Code (VSCode) 中使用 ESLint 和 Prettier 检查代码规范并自动格式化 Vue.js 代码,包括安装插件、配置 ESLint 和 Prettier 以及 VSCode 设置的具体步骤。通过这些工具,可以显著提升编码效率和代码质量。
449 4
|
2月前
|
JavaScript 前端开发
Javascript:获取、设置复选框的勾选状态
Javascript:获取、设置复选框的勾选状态
55 1
|
4月前
|
JavaScript 前端开发
使用js对文本框设置字数限制
使用js对文本框设置字数限制
73 0
|
4月前
|
JavaScript 前端开发 Ubuntu
如何在 VPS 上安装 Express(Node.js 框架)并设置 Socket.io
如何在 VPS 上安装 Express(Node.js 框架)并设置 Socket.io
66 0
|
4月前
|
缓存 JavaScript 前端开发
微信 JS-SDK Demo “分享信息设置” API 及数字签名生成方法(NodeJS版本)
微信 JS-SDK Demo “分享信息设置” API 及数字签名生成方法(NodeJS版本)更新时间(2020-10-29)
|
5月前
|
JavaScript
JS代码动态打印404页面源码
源码由HTML+CSS+JS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面,重定向这个界面
32 0
JS代码动态打印404页面源码
|
5月前
|
JavaScript
js好用的动态分页插件
js好用的动态分页插件是一款简单的分页样式插件,支持样式类型,当前页,每页显示数量,按钮数量,总条数,上一页文字,下一页文字,输入框跳转等功能。
45 1
|
5月前
|
JavaScript 前端开发 网络架构
JavaScript编码之路【对象的增强、ES6新特性之函数的默认值设置 、rest参数 (剩余参数)、拓展运算符、对象与数组的解构赋值】
JavaScript编码之路【对象的增强、ES6新特性之函数的默认值设置 、rest参数 (剩余参数)、拓展运算符、对象与数组的解构赋值】
60 1
|
5月前
|
JavaScript 前端开发
vue 模拟随机变速的动态打字特效【支持多行文本】(含css实现闪烁光标,js动态改变setInterval定时器的时间间隔)
vue 模拟随机变速的动态打字特效【支持多行文本】(含css实现闪烁光标,js动态改变setInterval定时器的时间间隔)
99 1