如何用canvas实现刮刮乐自助

简介: 如何用canvas实现刮刮乐自助

精心布局

准备一个canvas元素, 在准备一个显示中奖结果的盒子,让两个元素叠在一起,刮卡的时候,再让ggl盒子里面的内容显示出来


<!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>
        #c1 {
            position: absolute;
            top: 0;
            left: 0;
            z-index: 10
        }
        .ggl {
            position: absolute;
            top: 0;
            left: 0;
            background: gray;
            width: 600px;
            height: 400px;
            line-height: 400px;
            font-size: 50px;
            font-weight: 700;
            text-align: center;
        }
    </style>
</head>
<body>
    <canvas id="c1" width="600" height="400"></canvas>
    <div class="ggl">谢谢惠顾</div>
</body>
</html>


获取canvas元素,并创建图片对象,将卡片渲染出来


<script>
        /**
         * @type {HTMLCanvasElement}
         */
        const c1 = document.querySelector('#c1')
        const ggl = document.querySelector('.ggl')
        const ctx = c1.getContext('2d')
        const img = new Image()
        img.src = './ggl.jpg'
        img.onload = function () {
            ctx.drawImage(img, 0, 0, 600, 400)
        }
    </script>


执行计划

我们再点击鼠标并且移动时才可以刮刮,通过鼠标对象,创建一个圆,向外辐射,从而模拟刮卡的过程


通过canvas图像合成 globalCompositeOperation 为其设置destination-out, 将背后的中奖结果展示出来


let isDraw = false
        c1.onmousedown = function () {
            isDraw = true
        }
        c1.onmouseup = function () {
            isDraw = false
        }
        c1.onmousemove = function (e) {
            let x = e.pageX
            let y = e.pageY
            if (isDraw) {
                ctx.globalCompositeOperation = 'destination-out'
                ctx.arc(x, y, 30, 0, Math.PI * 2)
                ctx.fill()
            }
        }


通过这样,我们的刮刮乐就制作完毕了。


image.png

QQ录屏20230712180427


如果再添点乐趣,可以这样


let random = Math.random()
        if (random < 0.2) {
            ggl.innerHTML = '恭喜您中了iphone13 Pro'
        }

image.png

相关文章
教大家用 Python 绘制几棵圣诞树~
今天分享五种用 Python 绘制圣诞树的方法,从基础到高级,效果也不断攀升分为 1 到 5 五个 Level 水平;
教大家用 Python 绘制几棵圣诞树~
|
缓存 监控 负载均衡
如何提升 API 性能:来自 Java 和测试开发者的优化建议
本文探讨了如何优化API响应时间,提升用户体验。通过缓存(如Redis/Memcached)、减少数据负载(REST过滤字段或GraphQL精确请求)、负载均衡(Nginx/AWS等工具)、数据压缩(Gzip/Brotli)、限流节流、监控性能(Apipost/New Relic等工具)、升级基础设施、减少第三方依赖、优化数据库查询及采用异步处理等方式,可显著提高API速度。快速响应的API不仅让用户满意,还能增强应用整体性能。
|
存储 安全 iOS开发
内存卡怎么格式化?6个格式化方法供你选
随着使用时间的增加,内存卡可能会因为数据积累、兼容性或是文件系统损坏等原因需要进行格式化。那么怎样正确格式化内存卡呢?格式化内存卡的时候需要注意什么呢?本文会给大家提供详细的步骤,帮助大家轻松完成格式化内存卡的操作。
|
监控 安全 算法
龙蜥衍生版KeyarchOS国密应用、eBPF安全技术实践介绍|龙蜥大讲堂107期
龙蜥衍生版KeyarchOS国密应用及eBPF安全技术实践介绍。本次分享由浪潮信息的霍文和甄鹏主讲,涵盖全栈国密、国密密钥证书、国密通信等内容,并介绍了基于eBPF技术的新一代零侵入安全防御组件KSecure。通过实际案例展示了敏感信息传输加密、虚拟机热迁移等应用场景,以及如何利用eBPF实现进程注入检测等安全功能。该技术方案有效提升了操作系统的安全性与合规性,为服务器提供了强大的安全保障。
516 12
龙蜥衍生版KeyarchOS国密应用、eBPF安全技术实践介绍|龙蜥大讲堂107期
|
监控 安全 API
非人类身份安全高危警报:OWASP首份NHI十大风险指南揭示企业隐形危机
非人类身份安全高危警报:OWASP首份NHI十大风险指南揭示企业隐形危机
|
前端开发 应用服务中间件 nginx
前端服务器部署方式
【8月更文挑战第25天】前端服务器部署方式
943 1
|
网络架构
一文带你了解 Next Route 使用
一文带你了解 Next Route 使用
399 1
|
数据采集 自然语言处理 搜索推荐
通义千问赋能CACA指南:构建智慧肿瘤诊疗新生态
本文探讨了如何利用阿里云通义千问大模型,结合中国抗癌协会(CACA)编撰的《中国肿瘤整合诊治指南》,打造新一代智能化临床决策支持系统。该系统通过分层架构设计,实现智能问答、临床决策支持和患者管理等功能,显著提升了医生的工作效率和治疗方案的科学性。
1090 1
|
消息中间件 Linux API
Linux c/c++之IPC进程间通信
这篇文章详细介绍了Linux下C/C++进程间通信(IPC)的三种主要技术:共享内存、消息队列和信号量,包括它们的编程模型、API函数原型、优势与缺点,并通过示例代码展示了它们的创建、使用和管理方法。
512 0
Linux c/c++之IPC进程间通信
|
人工智能 搜索推荐 大数据
VR社交平台的发展与前景:技术革新与未来展望
【8月更文挑战第26天】VR社交平台作为虚拟现实技术的重要应用之一,正逐步改变着人们的社交方式。通过技术革新和应用场景的拓展,VR社交平台将为用户带来更加真实、自然和丰富的社交体验。未来,随着技术的不断进步和市场需求的持续增长,VR社交平台将迎来更加广阔的发展前景。