H5 Canvas实现转盘效果,控制指定数字

效果图

实现思路:

用Canvas画圆,然后再画扇形,然后中奖的开始用一张图片代替,点击的时候触发转动效果。

实现代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>活动中心</title>
    <meta name="viewport" content="maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,width=device-width,initial-scale=1.0" />
    <meta name="format-detection" content="telephone=no,email=no,date=no,address=no">
    <style type="text/css">
        * {
            margin: 0px;
            padding: 0px;
            border: none;
            width: 100%;
        }

        body {
            background-color: #F6FBF7;
        }
    </style>
</head>
<body>
    <div style="border: solid 1px #ECECEC;font-weight:bold;background-color:white;line-height:50px;text-align:center;margin:0px auto;width:80%;margin-top:20px;">幸运转盘</div>
    <div id="number" style="line-height: 50px; font-weight: bold; text-align: center; margin: 0px auto; width: 80%; margin-top: 50px;">????</div>
    <div style="width: calc(100wh); margin: 0px auto 0 auto; text-align: center;">
        <img onClick="spin();" src="~/Content/H5Game/click.jpg" style="width: 100px; height: 100px; margin: 0px auto; display: block; position: absolute; left: calc(50% - 50px); top: 315px " />
        <canvas id="wheelcanvas" width="500" height="500"></canvas>
    </div>
    <script type="text/javascript">
        //颜色
        var colors = ["#ED6E40", "#D7363C", "#D5386B", "#B731C4", "#7936D4", "#215ACD", "#4192BE", "#82AD49"];
        var restaraunts = [];
        var number = 48;//数字,需要12的倍数
        for (var i = 1; i <= number; i++) {
            restaraunts.push(i);
        }
        var startAngle = 0;
        var arc = Math.PI / (number / 2);
        var spinTimeout = null;
        var spinArcStart = 10;
        var spinTime = 0;
        var spinTimeTotal = 0;
        // 你指定的数字
        var targetNumber = 37;//1=37 2=36 .....37=1, 38=48 39=47.....48=38
        //不出现的数据
        var hideNumber = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30];
        //数字的对应关系
        var targetKeyValue = {};
        var ctx;

        //初始化数字和对应关系,如果你要得到1,那么数字就是targetKeyValue.1得到的37
        for (var i = 1; i <= 37; i++) {
            targetKeyValue[i] = 38 - i;
        }
        for (var i = 1; i <= 11; i++) {
            targetKeyValue[37 + i] = 49 - i;
        }

        //获取随机数
        function randomNumber() {
            var randomNumber = getRandomInt(1, 48);
            //判断如果在不出现的数字内,继续生成一个其他的
            while (hideNumber.includes(randomNumber)) {
                randomNumber = getRandomInt(1, 48);
            }
            return targetKeyValue[randomNumber];
        }

        function getRandomInt(min, max) {
            return Math.floor(Math.random() * (max - min + 1)) + min;
        }

        function draw() {
            drawRouletteWheel();
        }

        function drawRouletteWheel() {
            var canvas = document.getElementById("wheelcanvas");
            if (canvas.getContext) {
                var outsideRadius = 200;//外圈大小
                var textRadius = 170;//数字显示的位置
                var insideRadius = 40;//内圈大小
                ctx = canvas.getContext("2d");
                ctx.clearRect(0, 0, 500, 500);
                ctx.strokeStyle = "white";//两个圈圈的边框颜色
                ctx.lineWidth = 6;//外面圈圈的边框,会影响到显示
                ctx.font = ' 14px Microsoft YaHei';//转盘数字,字体,微软雅黑
                var colorIndex = 0;
                for (var i = 0; i < number; i++) {
                    var angle = startAngle + i * arc;
                    ctx.fillStyle = colors[colorIndex];
                    colorIndex++;
                    if (colorIndex == colors.length - 1) {
                        colorIndex = 0;
                    }
                    ctx.beginPath();

                    ctx.arc(250, 250, 0, 0, 0, true);//扇形区域的间隔

                    ctx.arc(250, 250, outsideRadius, angle, angle + arc, false);
                    ctx.arc(250, 250, insideRadius, angle + arc, angle, true);
                    ctx.stroke();
                    ctx.fill();
                    ctx.save();
                    ctx.shadowOffsetX = 0;
                    ctx.shadowOffsetY = 0;
                    ctx.shadowBlur = 0;
                    ctx.shadowColor = "";//"rgb(220,220,220)";//字体的阴影
                    ctx.fillStyle = "#FFFFFF"; //字体颜色
                    //-2调整字体的位置
                    ctx.translate(250 + Math.cos(angle + arc / 2) * textRadius, 250 + Math.sin(angle + arc / 2) * textRadius);
                    ctx.rotate(angle + arc / 2 + Math.PI / 2);
                    var text = restaraunts[i];
                    ctx.fillText(text, -ctx.measureText(text).width / 2, 0);
                    ctx.restore();
                }

                箭头
                //ctx.fillStyle = "black";
                //ctx.beginPath();
                //ctx.moveTo(250 - 4, 250 - (outsideRadius + 5));
                //ctx.lineTo(250 + 4, 250 - (outsideRadius + 5));
                //ctx.lineTo(250 + 4, 250 - (outsideRadius - 5));
                //ctx.lineTo(250 + 9, 250 - (outsideRadius - 5));
                //ctx.lineTo(250 + 0, 250 - (outsideRadius - 13));
                //ctx.lineTo(250 - 9, 250 - (outsideRadius - 5));
                //ctx.lineTo(250 - 4, 250 - (outsideRadius - 5));
                //ctx.lineTo(250 - 4, 250 - (outsideRadius + 5));
                //ctx.fill();
            }
        }

        function spin() {

            init();

            //点击的时候,指定一个数据
            targetNumber = randomNumber();

            document.getElementById("number").innerText = "????";

            // 计算总旋转角度
            //var targetNumber = 1; // 你指定的数字
            var targetIndex = restaraunts.indexOf(targetNumber);
            var targetAngle = targetIndex * arc;
            var totalRotations = 10; // 10圈
            var totalAngle = totalRotations * 2 * Math.PI + targetAngle;

            spinTime = 0;
            spinTimeTotal = 6000; // 旋转时间
            rotateWheel(totalAngle);
        }

        function rotateWheel(totalAngle) {
            spinTime += 30;

            var degrees = startAngle * 180 / Math.PI + 90;
            var arcd = arc * 180 / Math.PI;
            var index = Math.floor((360 - degrees % 360) / arcd);
            var finalNumber = restaraunts[index];
            console.log(finalNumber);

            startAngle += (totalAngle - startAngle) * 0.05; // 平滑旋转

            drawRouletteWheel();

            if (spinTime < spinTimeTotal) {
                spinTimeout = setTimeout(function () {
                    rotateWheel(totalAngle);
                }, 30);
            } else {
                document.getElementById("number").innerText = finalNumber;
            }
        }

        function init() {
            // 确保默认停在数字1
            var targetIndex = restaraunts.indexOf(37);
            var targetAngle = targetIndex * arc;
            startAngle = targetAngle;

            draw();

        }

        init();
    </script>
</body>
</html>

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

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

相关文章

UNDO 表空间使用率高 active段占用高 无对应事务执行

UNDO表空间使用率告警&#xff0c;查看占用情况 active段占比很高 select tablespace_name,status,sum(bytes/1024/1024) mb from dba_undo_extents group by tablespace_name,status;不同状态的含义&#xff1a;**ACTIVE **&#xff1a;有活动事务在使用 Undo&#xff0c;这…

【JavaSE】数据类型与变量

目录 1. 字面常量 2. 数据类型 3. 变量 3.1 变量概念 3.2 语法格式 3.3 整型变量 3.3.1 整型变量 3.3.2 长整型变量 3.3.3 短整型变量 3.3.4 字节型变量 3.4 浮点型变量 3.4.1 双精度浮点型 3.4.2 单精度浮点型 3.5 字符型变量 3.6 布尔型变量 3.7 类型转换 3…

WEB安全-靶场

1 需求 2 语法 3 示例 男黑客|在线渗透测试靶场|网络安全培训基地|男黑客安全网 4 参考资料

windows 7 安装IPP协议,支持Internet打印

1 windows 7 安装IPP协议,支持Internet打印 #控制面板--打开或关闭Windows功能 3 复制Printers 文件夹 到 c:\inetpub\wwwroot\,复制msw3prt.dll到c:\windows\system32\ 4 打开IIs管理器 #报错:模块列表中不存在此处理程序所需的指定模块。如果您添加脚本映射处理程序映射&…

【力扣】数组中的第K个最大元素

一、题目描述 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1: 输入: [3,2,1,5,…

记一次EasyExcel的错误使用导致的频繁FullGC

记一次EasyExcel的错误使用导致的频繁FullGC 一、背景描述二、场景复现三、原因分析四、解决方案五、思考复盘 一、背景描述 繁忙的校招结束了&#xff0c;美好的大学四年也结束了&#xff0c;作者也有10个月没有更新了。拿到心仪的offer之后也开始了苦B的打工生活。 最近接到…

汽车信息安全--欧盟汽车法规

目录 General regulation 信息安全法规 R155《网络安全及网络安全管理系统》解析 R156《软件升级与软件升级管理系统》解析 General regulation 欧洲的汽车行业受到一系列法律法规的约束&#xff0c;包括 各个方面包括&#xff1a; 1.安全要求&#xff1a;《通用安全条例&a…

10.x86游戏实战-汇编指令lea

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

SpringBoot之内容协商

现象演示 假设有一个需求是根据终端的不同&#xff0c;返回不同形式的数据&#xff0c;比如 PC 端需要以 HTML 格式返回数据&#xff0c;APP、小程序端需要以 JSON 格式返回数据。这时我们是 coding 几个相似的接口&#xff1f;还是在一个接口里面做复杂判断处理&#xff1f;两…

测试驱动开发(TDD)方法详解

目录 前言1. 什么是测试驱动开发1.1 TDD的基本原则1.2 TDD的优势 2. 测试驱动开发的流程2.1 编写测试2.2 运行测试2.3 编写实现代码2.4 重构代码 3. 常用工具和框架3.1 单元测试框架3.2 Mock框架3.3 集成工具 4. TDD在实际项目中的应用4.1 应用场景4.2 面临的挑战4.3 最佳实践 …

计算机的错误计算(二十二)

摘要 计算机的错误计算&#xff08;十九&#xff09;展示了计算机的一个错误计算&#xff1a;本应该为 0的算式的结果不为0. 那么&#xff0c;增加计算精度&#xff0c;能确定是0吗&#xff1f;不一定。 计算机的错误计算&#xff08;十九&#xff09;展示了计算机对 的错误计…

liunx清理服务器内存和日志

1、查看服务器磁盘占用情况 # 查看磁盘占用大小 df -h 2、删除data文件夹下面的日志 3、查看每个服务下面的日志输出文件&#xff0c;过大就先停掉服务再删除out文件再重启服务 4、先进入想删除输入日志的服务文件夹下&#xff0c;查看服务进程&#xff0c;杀掉进程&#xff…

代码随想录算法训练营第二天|【数组】209.长度最小的子数组

题目 给定一个含有 n 个正整数的数组和一个正整数 s &#xff0c;找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组&#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0。 示例&#xff1a; 输入&#xff1a;s 7, nums [2,3,1,2,4,3] 输出&#…

FPGA开发笔试1

1. 流程简介 我是两天前有FPGA公司的HR来问我实习的事情&#xff0c;她当时问我距离能不能接受&#xff0c;不过确实距离有点远&#xff08;地铁通勤要将近一个半小时&#xff09;&#xff0c;然后她说给我约个时间&#xff0c;抽空做1个小时的题目&#xff08;线上做&#xf…

使用flask的web网页部署介绍

使用flask的web网页部署介绍 文章目录 前言一、网页介绍二、数据库设计介绍总结 前言 flaskbootstrapjquerymysql搭建三叶青在线识别网站&#xff0c;使用nginxgunicorn将网站部署在腾讯云上&#xff0c;配置SSL证书。网站地址&#xff1a;https://www.whtuu.cn 三叶青图像识…

51单片机(STC8051U34K64)_RA8889_SPI4参考代码(v1.3)

硬件&#xff1a;STC8051U34K64 RA8889开发板&#xff08;硬件跳线变更为SPI-4模式&#xff0c;PS101&#xff0c;R143&#xff0c;R141短接&#xff0c;R142不接&#xff09; STC8051U34K64是STC最新推出来的单片机&#xff0c;主要用于替换传统的8051单片机&#xff0c;与标…

【计算机网络】物理层(作业)

1、若信道在无噪声情况下的极限数据传输速率不小于信噪比为30dB 条件下的极限数据传输速率&#xff0c;则信号状态数至少是&#xff08;D&#xff09;。 A. 4B. 16C. 8D. 32 解析&#xff1a;可用奈奎斯特采样定理计算无噪声情况下的极限数据传输速率&#xff0c;用香农第二定…

Qt篇——让子部件忽略父部件的样式表

举例&#xff1a;有一个QGroupBox父部件&#xff0c;在布局中添加了样式QGroupBox{......}&#xff0c;它的有一个子部件QGroupBox&#xff0c;也会沿用父部件的样式。 其实在布局中给父部件添加了样式之后&#xff0c;没有直接让子部件忽略父部件的样式的方法&#xff0c;但是…

SQL Server 2022数据库对象

《SQL Server 2022从入门到精通&#xff08;视频教学超值版&#xff09;》图书介绍-CSDN博客 数据库对象是数据库的组成部分&#xff0c;数据表、视图、索引、存储过程以及触发器等都是数据库对象。 &#xff08;1&#xff09;数据库的主要对象是数据表&#xff0c;数据表是一…

JavaDS预备知识

集合框架 Java 集合框架 Java Collection Framework &#xff0c;又被称为容器 container &#xff0c;是定义在 java.util 包下的一组接口 interfaces和其实现类 classes 。 其主要表现为将多个元素 element 置于一个单元中&#xff0c;对数据进行创建(Create)、读取(Retrieve…