使用canvas实现图片轮播抽奖效果,轮播速度由慢到快,然后再到慢

news2024/11/19 15:12:39

整体的效果就是中间的那张图片会连续不断地切换,我部署到github上面了,可以点击链接试一试:canvas在线抽奖系统效果

附上源代码:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Document</title>
        <style>
            .main {
                text-align: center;
            }

            .reset {
                display: block;
                margin: 0 auto;
            }
        </style>
    </head>
    <body>
        <div class="main">
            <div>
                用Canvas实现图片轮播抽奖效果:
                轮播速度由慢到快,然后再到慢,最后锁定到中奖目标
            </div>
            <canvas id="myCanvas" width="325" height="445"></canvas>
            <button class="reset" id="reset">重新抽奖</button>
        </div>
        <script>
            // 获取画布
            var canvas = document.getElementById('myCanvas')

            // 获取画笔
            var context = canvas.getContext('2d')
            // 画线的时候要有起点和终点
            // const img = new Image()
            let imgSrc = [
                'https://img-blog.csdnimg.cn/67fc9799ae8e48749e82cf70b179895b.png',
                'https://img-blog.csdnimg.cn/a5e05258931d480c8f9b3c1f7d5690a0.png',
                'https://img-blog.csdnimg.cn/7eeba09bd6b54ea098835c84f648ec72.png',
                'https://img-blog.csdnimg.cn/ba8cec54e8fc4e0193c100470b1eb24d.png',
                'https://img-blog.csdnimg.cn/88ee56abdc354af79e60b34a6cba9562.png',
                'https://img-blog.csdnimg.cn/2e23029912544b18ae4559ebdbfa37ff.png',
                'https://img-blog.csdnimg.cn/0c2caec87e4a46b788f9bc986a2ba290.png',
                'https://img-blog.csdnimg.cn/cdcfbb8ddcef4b9f8e1c000958cf1e17.png',
                'https://img-blog.csdnimg.cn/5cc7fdc62c01432299089f008c48ca4d.png',
            ]
            let imgObj = []
            let count = 0
            imgSrc.forEach((imgItem) => {
                let myImg = new Image()
                myImg.src = imgItem
                myImg.onload = () => {
                    count++
                    console.log('图片加载完成')
                    imgObj.push(myImg)
                    if (count === imgSrc.length) {
                        // 开始调用绘制图片的函数
                        startDraw()
                    }
                }
            })

            // 开始绘制图片
            let cur = 1
            let timer = -1
            // 相当于抛物线的最高点
            const maxVal = 12500
            // 触发绘制的概率
            const drawFlag = () => {
                const y = -5 * cur * cur + 500 * cur
                const random = Math.round(Math.random() * 5601)
                console.log('二次方程函数和随机数:', y, random)
                if (y === 0) {
                    console.log('清除定时器')
                    clearInterval(timer)
                    // 同时设置最后一张中奖图片
                    // const target = new Image()
                    // target.src =
                    //     'https://img-blog.csdnimg.cn/2e23029912544b18ae4559ebdbfa37ff.png'
                    // target.onload = () => {
                    //     context.drawImage(
                    //         target,
                    //         0,
                    //         0,
                    //         canvas.clientWidth,
                    //         canvas.clientHeight
                    //     )
                    // }
                }
                if (random <= y) {
                    return true
                } else {
                    return false
                }
            }
            const startDraw = () => {
                console.log('开始绘制图片')
                let index = 0
                timer = setInterval(() => {
                    if (index >= imgObj.length) {
                        index = 0
                    }
                    console.log('绘制的图片索引是:', index)
                    if (drawFlag()) {
                        context.drawImage(
                            imgObj[index],
                            0,
                            0,
                            canvas.clientWidth,
                            canvas.clientHeight
                        )
                        cur++
                        index++
                    }
                }, 100)
            }

            const reset = document.querySelector('#reset')
            reset.onclick = () => {
                console.log('重新开始抽奖')
                cur = 1
                startDraw()
            }
        </script>
    </body>
</html>

 

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

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

相关文章

【C++那些事儿】初识C++ 命名空间,C++中的输入输出以及缺省函数

君兮_的个人主页 即使走的再远&#xff0c;也勿忘启程时的初心 C/C 游戏开发 Hello,米娜桑们&#xff0c;这里是君兮_&#xff0c;数据结构和算法初阶更新完毕&#xff0c;我们继续来扩充我们的知识面&#xff0c;今天我们从认识C开始来带大家学习C&#xff0c;我之前看过一套…

半导体测试方法主要有哪几种?

外观检测&#xff1a;对半导体外观质量的评估&#xff0c;包括检查芯片的平整度、颜色、镜面度等。 电性能测试&#xff1a;测量半导体的电导率、电阻率、电流和电压特性等&#xff0c;以评估其电性能。 温度测试&#xff1a;用于测量半导体在不同温度下的电性能表现&#xf…

软件测试过程中如何有效的开展接口自动化测试

一.简介 接口自动化测试是指使用自动化测试工具和脚本对软件系统中的接口进行测试的过程。其目的是在软件开发过程中&#xff0c;通过对接口的自动化测试来提高测试效率和测试质量&#xff0c;减少人工测试的工作量和测试成本&#xff0c;并且能够快速发现和修复接口错误&…

37 WEB漏洞-反序列化之PHPJAVA全解(上)

目录 PHP反序列化演示案例&#xff1a;先搞一把PHP反序列化热身题稳住-无类问题-本地在撸一把CTF反序列化小真题压压惊-无类执行-实例最后顶一把网鼎杯2020青龙大真题舒服下-有类魔术方法触发-实例 https://www.cnblogs.com/zhengna/p/15661109.html 代码在线测试平台&#xff…

相机镜头选择与机器视觉控制

相机镜头选择与机器视觉控制 在机器视觉领域&#xff0c;除了图像处理和算法&#xff0c;还需要关注硬件方面的选型和控制。相机镜头的选择是其中重要的一部分&#xff0c;需要考虑像素大小、镜头焦距等因素以满足项目需求。此外&#xff0c;编程技能也包括相机的调用和使用&a…

django建站过程(1)

django建站过程&#xff08;1&#xff09; 使用pycharm创建过程运行项目创建数据库创建超级用户登录生成的后台&#xff1a;界面本地化 准备以django,bootstrap来做一个过程记录&#xff0c;文章主要阐述过程的细节。 使用pycharm创建过程 创建项目“schoolapps”&#xff0c;…

基于openHarmony实现本地UDP通信

知识补充 简介 套接字(Socket)&#xff0c;就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端&#xff0c;提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲&#xff0c;套接字上联应用进程&#xff0c;下联…

MMDP: A Mobile-IoT Based Multi-Modal Reinforcement Learning Service Framework

框架 AHTT可被定义为 AHTT的元素表示智能体在动作为 a l m n a_{lmn} almn​的情况下从张量状态 s i j k s_{ijk} sijk​转移到另一个张量状态 s i j k ′ s_{ijk}^{} sijk′​的概率 通过数理统计首先得到多变量频率张量 状态 s i j k s_{ijk} sijk​的值函数等于策略 π…

凌恩快讯 | 凌恩生物联手墨卓生物,为中国科研注入国人力量!

金秋十月&#xff0c;丹桂飘香。 凌恩生物又添新设备&#xff0c;成功引进墨卓生物科技高稳定、高性价比的MobiNova单细胞解决方案&#xff0c;构建凌恩单细胞组学产线&#xff0c;这一产品线的构建&#xff0c;将极大拓展凌恩生物在农学、医学相关科研领域的服务范围&#xff…

全国400电话办理,简单步骤帮您申请成功

导语&#xff1a;随着企业业务的扩展和市场需求的增加&#xff0c;越来越多的企业开始关注全国400电话的申请。本文将为您介绍全国400电话的办理步骤&#xff0c;帮助您顺利完成申请过程。 正文&#xff1a; 一、了解全国400电话 全国400电话是一种虚拟电话号码&#xff0c;…

Uniapp 电子签名 包含 返回 撤回 颜色 线条等功能

请观看 使用教程 第一步 引入图标 在项目中的App.vue内添加下面代码 <style>/*引入图标路径 */import uni_modules/TC-qianming/libs/css/iconfont.css; </style> 第二步 引入组件即可 <template><view><TC-qianming></TC-qianming>&l…

Eolink Apikit 接口自动化测试流程

自动化测试是一种软件测试方法&#xff0c;利用自动化工具和脚本来执行测试用例&#xff0c;以验证软件应用程序的功能、性能、稳定性等特性。自动化测试的主要目的是提高测试效率、减少测试成本&#xff0c;并确保软件的质量和可靠性。 作为测试人员&#xff0c;在进行比较大…

定制AI问答机器人前需要准备什么数据来训练AI模型?

AI问答机器人利用自然语言处理&#xff08;NLP&#xff09;技术来理解和回应用户的查询&#xff0c;能通过分析大量数据提供准确和相关的答案。要定制一个AI问答机器人&#xff0c;收集必要的资源和工具是至关重要的。获取用于训练模型的数据集是个关键的基础&#xff0c;然后通…

uniapp(uncloud) 使用生态开发接口详情4(wangeditor 富文本, 云对象, postman 网络请求)

wangeditor 官网: https://www.wangeditor.com/v4/pages/01-%E5%BC%80%E5%A7%8B%E4%BD%BF%E7%94%A8/01-%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8.html 这里用vue2版本,用wangeditor 4 终端命令: npm i wangeditor --save 开始使用 在项目pages > sy_news > add.vue 页面中…

线程池扩容和拒绝策略(CallerRunsPolicy)验证

结论&#xff1a; 1、线程池队列容量满了后&#xff0c;迅速扩容至maxPoolSize 2、队列满后&#xff0c;再进来任务&#xff0c;则主线程执行任务 3、任务执行完后&#xff0c;等待&#xff08;keepAliveSeconds&#xff09;&#xff0c;主线程数然后恢复至corePoolSize 1、…

【音视频|ALSA】基于alsa-lib开发ALSA应用层程序--附带源码

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

【前端学习】—let const var之间的区别(十三)

【前端学习】—let const var之间的区别&#xff08;十三&#xff09; 一、let const var之间的区别 二、代码演示 <script>// 1、const let不存在变量提升 var 存在变量提升//var console.log(fullName,fullName);//fullName undefined //var fullNamecai; /* var 声明…

YOLO目标检测——肺结节数据集【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;肺结节检测数据集主要应用于医学影像分析领域&#xff0c;特别是在肺结节检测和恶性风险评估方面。数据集说明&#xff1a;YOLO目标检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富。使用lableimg标注软件标注&#xff0c;标…

浅谈智能操控及无线测温产品在马来西亚理文造纸雪邦热电站项目中的应用

摘要&#xff1a;为避免因电线接头松动、电缆老化等引发高温造成火灾&#xff0c;所造成的的经济损失巨大&#xff0c;在一些电气设备如大电流电缆设备节点、电力设备局部异常升温部位、开关柜的动静触头&#xff0c;进线与出线母排接点、整流柜中的电气接点、变压器节点、变电…

win11 电脑 使用 python 连接USB 海康工业相机 运行示例程序 BasicDemo.py

win11 电脑 使用 python 连接USB 海康工业相机 运行示例程序 BasicDemo.py 1.下载海康的mvs客户端和mvs_sdk驱动 官网链接&#xff1a; https://www.hikrobotics.com/cn/machinevision/service/download?module0 下载这两个东西&#xff0c;然后安装 1.1 我的mvs安装在 F:\…