兼容React的刮刮乐完整代码实现
需要兼容React的刮刮乐完整代码实现
在现代Web开发中,React作为一种流行的前端框架,为开发者提供了构建动态界面的强大工具。刮刮乐效果作为一种趣味性的用户交互,能够显著提升用户体验和参与度。本文将详细介绍如何在React项目中实现一个兼容的刮刮乐效果,并提供完整的代码示例。
1. 需求分析
首先,我们需要明确刮刮乐效果的基本需求:
-
用户可以通过鼠标或触摸(在移动设备上)来刮开涂层,显示下方的内容或奖项。
-
刮开的过程应当流畅且响应迅速。
-
刮开效果应具有视觉吸引力,如渐显、透明度变化等。
2. 技术选型
在React中实现刮刮乐效果,我们可以利用HTML5的<canvas>元素来绘制涂层和响应用户的刮擦操作。<canvas>提供了丰富的绘图API,能够很好地满足我们的需求。
3. 完整代码实现
以下是一个兼容React的刮刮乐效果的完整代码实现:
3.1 组件结构
我们将创建一个名为ScratchCard的React组件,该组件包含<canvas>元素和必要的状态管理逻辑。
import { useEffect } from 'react';
import './scratchCard.less';
import scr from '@assets/images/scratch/scr.png'
export default function Canvas() {function init() {let gj = document.querySelector('.gj');let jp = document.querySelector('#jp') as HTMLElement;let canvas = document.querySelector('#mask') as HTMLCanvasElement;let ctx = canvas?.getContext('2d') as any;// 遮罩层mask设置ctx.fillStyle = 'rgba(0,0,0,0,0)';var img = new Image();img.onload = function() {// 在canvas上绘制图片ctx.drawImage(img, 0, 0, canvas.width, canvas.height);};// 设置图片源地址img.src = scr;ctx.fillRect(0, 0, canvas.width, canvas.height);ctx.fillStyle = '#ffffff';ctx.font = '16px 微软雅黑';ctx?.fillText('刮奖区', 80, 50); // 文字在框中位置// 奖品部分逻辑let arr = ['一等奖', '二等奖', '三等奖', '再来一次'];let randomNum = Math.random() * 100;if (randomNum < 10) {jp.innerHTML = arr[0];} else if (randomNum < 30) {jp.innerHTML = arr[1];} else if (randomNum < 60) {jp.innerHTML = arr[2];} else {jp.innerHTML = arr[3];}// 绘图部分let isDraw = false;// canvas.onmousedown = () => (isDraw = true);// canvas.onmouseup = () => (isDraw = false);// // 兼容移动端// canvas.onmousemove = (e) => {// console.log(9999);// if (isDraw) {// writeText(ctx, e, gj);// }// };//鼠标按下开刮canvas.onmousedown = function () {canvas.onmousemove = function (e) {console.log('55656565656',e)if (isDraw) {writeText(ctx, e, gj);}};};//鼠标抬起不刮开canvas.onmouseup = function () {canvas.onmousemove = () => (isDraw = true);};// 兼容移动端canvas.ontouchstart = function () {canvas.ontouchmove = function (e) {// console.log('zhouuu',isDraw,e.touches);if (isDraw) {writeText(ctx, e.touches[0], gj);}};};canvas.ontouchend = () => (isDraw = true);} function writeText(ctx: any, e: MouseEvent, gj: HTMLElement) {// console.log('zhouhh',e)ctx?.beginPath();let x = e.pageX - gj?.getBoundingClientRect().left;let y = e.pageY - gj?.getBoundingClientRect().top;ctx.globalCompositeOperation = 'destination-out'; // !!! 在后绘制的图形上方显示先绘制的图形, 相交部分由先绘制图形的填充(颜色,渐变,纹理)覆盖ctx?.closePath();ctx?.arc(x, y, 20, 20, Math.PI * 10);ctx?.fill();}useEffect(() => {init();}, []);return (<div className="container"><div className=" text-center text-[16px]">刮刮乐</div><div className="gj mt-4 cursor-pointer"><div id="jp"></div><canvas id="mask" className='canvass'></canvas></div></div>);
}
3.2 样式和动画
为了增强视觉效果,可以在CSS中添加一些简单的样式,如边框、阴影等。此外,刮开效果本身也可以通过globalCompositeOperation属性实现不同的视觉反馈,如渐变透明度等。
4. 注意事项
-
确保在组件卸载时清理所有事件监听器,以避免内存泄漏。
-
考虑到不同设备的兼容性,可能需要添加额外的触摸事件处理逻辑。
-
可以通过调整
<canvas>的大小和涂层颜色等参数,使刮刮乐效果更加符合设计需求。
通过上述步骤,我们可以在React项目中实现一个兼容且功能完整的刮刮乐效果。这个效果不仅提升了用户交互的乐趣,也为网页或应用增添了更多的动态元素。希望这篇文章能够帮助你更好地理解和实现React中的刮刮乐效果
相关文章:
兼容React的刮刮乐完整代码实现
需要兼容React的刮刮乐完整代码实现 在现代Web开发中,React作为一种流行的前端框架,为开发者提供了构建动态界面的强大工具。刮刮乐效果作为一种趣味性的用户交互,能够显著提升用户体验和参与度。本文将详细介绍如何在React项目中实现一个兼…...
PHP程序如何实现限制一台电脑登录?
PHP程序如何实现限制一台电脑登录? 可以使用以下几种方法: 1. IP地址限制:在PHP中,可以通过获取客户端的IP地址,然后与允许登录的IP地址列表进行比对。如果客户端的IP地址不在列表中,就禁止登录。 “php $…...
nodejs fs 模块的简介与相关案例
fs 文件系统模块 什么是 fs 文件系统模块? fs 模块是 Node.js 官方提供的、用来操作文件的模块。它提供了一系列的方法和属性,用来满足用户对文件的操作要求。* 例如: fs.readFile() 方法用来读取文件内容。fs.writeFile() 方法用来写入文…...
计算机毕业设计 基于Flask+Vue的博客系统 Python毕业设计 前后端分离 附源码 讲解 文档
🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…...
基于SSH的酒店管理系统的设计与实现 (含源码+sql+视频导入教程)
👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSH的酒店管理系统拥有两种角色 管理员:房间管理、房型管理、客户管理、预定管理、入住管理(到店入住、预定入住、正在入住)、账单管理、会员管理…...
消息队列10:为RabbitMq添加连接池
环境: win11rabbitmq-3.8.17.net 6.0RabbitMQ.Client 6.8.1vs2022 安装RabbitMq环境参照: window下安装rabbitmqlinux下安装rabbitmq 问题:rabbitmq的c#客户端没有自带连接池,所以需要手动实现。 简易实现如下: usi…...
在使用 Docker 时,用户可能会遇到各种常见的错误和问题
在使用 Docker 时,用户可能会遇到各种常见的错误和问题。以下是一些需要注意的常见错误及其可能的解决方案: 1. 权限问题 在 Linux 系统上运行 Docker 命令时,可能会遇到权限不足的问题。解决这个问题通常有两种方法: 使用 sud…...
MinIO使用客户端进行桶和对象的管理
MinIO使用客户端进行桶和对象的管理 minio安装完成后,除了自带的webui管理界面,还可以使用官方配套的客户端mc进行管理。除此之外,还可以使用第三方客户端s3browser也可以完成对象和桶的生命周期管理。 1. 官方客户端mc MinIO客户端 mc 命…...
数据库管理-第244期 一次无法switchover的故障处理(20240928)
数据库管理244期 2024-09-28 数据库管理-第244期 一次无法switchover的故障处理(20240928)1 问题展现2 问题排查与处理2.1 问题12.2 问题2 3 问题分析4 总结 数据库管理-第244期 一次无法switchover的故障处理(20240928) 作者&…...
太绝了死磕这本大模型神书!
今天给大家推荐一本大模型神书,就是这本:《大语言模型:基础与前沿》 书籍介绍: 本书深入阐述了大语言模型的基本概念和算法、研究前沿以及应用,涵盖大语言模型的广泛主题,从基础到前沿,从方法…...
Kevin‘s notes about Qt---Episode 6 不同类中创建同一对象
问题描述 使用场景 现在在我的Qt界面中需要同时使用采集卡的AI(Analog Input)和AO(Analog Output)功能,均已分别调通,但是像之前一样通过创建两个类,然后分别在两个线程中进行操作的方式并不能实现。 原本写法 头文件 art_ao.h 核心代码如下: #ifndef ART_AO_H #defi…...
YOLOv9改进策略【Conv和Transformer】| AssemFormer 结合卷积与 Transformer 优势,弥补传统方法不足
一、本文介绍 本文记录的是利用AssemFormer优化YOLOv9的目标检测网络模型。传统卷积和池化操作会导致信息丢失和压缩缺陷,且传统的注意力机制通常产生固定维度的注意力图,忽略了背景中的丰富上下文信息。本文的利用AssemFormer改进YOLOv9,以在特征传递和融合过程中增加多尺…...
Git 的安装和配置
Git 是跨平台的,可以在 Windows,Linux、Unix 和 Mac 各几大平台上使用 由于笔者主要是使用 Windows,其他平台下安装 Git 的方法暂且不表(可参考廖雪峰老师的博客:安装 Git) Windows 安装 Git 从 Git…...
InternVL 微调实践
任务 follow 教学文档和视频使用QLoRA进行微调模型,复现微调效果,并能成功讲出梗图. 复现过程 参考教程部署:https://github.com/InternLM/Tutorial/blob/camp3/docs/L2/InternVL/joke_readme.md 训练 合并权重&&模型转换 pyth…...
自然语言处理在人工智能领域的发展历程,以及NLP重点模型介绍
大家好,我是微学AI,今天给大家介绍一下自然语言处理在人工智能领域的发展历程,以及NLP重点模型介绍。本文详细介绍了自然语言处理的发展历程,同时深入探讨了各种自然语言处理模型的原理与应用。文章首先回顾了自然语言处理技术的发…...
Replit Agent:AI驱动的全自动化软件开发革命
目录 引言Replit Agent核心功能使用场景与优势最新版本更新处理复杂项目的能力常见问题解决方案支持的编程语言和技术栈与其他AI编程工具的比较结语 引言 在人工智能快速发展的今天,软件开发领域正经历着前所未有的变革。Replit Agent作为AI初创公司Replit推出的…...
SAP调用发起泛微OA流程
SAP调用泛微Servlet接口,发起流程 编写servlet接口,给SAP调用 public class SAPCreateWorkflow extends HttpServlet{private static final long serialVersionUID 1L;public void doPost(HttpServletRequest request, HttpServletResponse response)…...
JAVA毕业设计184—基于Java+Springboot+vue3的企业信用信息管理系统(源代码+数据库)
毕设所有选题: https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootvue3的企业信用信息管理系统(源代码数据库)184 一、系统介绍 本项目前后端分离(可以改为ssm版本),分为用户、管理员两种角色 1、用户: …...
webshell-HTTP常见特征
一、总体特点 二、蚁剑 数据中可以看到一些明文字符串函数,响应中可以看到响应的明文数据。 ant特征以及对数据base64可以解码 chr类别的会出现大量的chr编码 大量的百分号字符 三、哥斯拉 第一个请求包很大 响应为0 密钥被拆分到数据前后 响应包cookie带…...
docker简单熟悉
Docker 容器和虚拟机区别 Docker容器与虚拟机的主要区别在于虚拟化层次和资源占用: 虚拟化层次:Docker容器在操作系统级别进行虚拟化,共享宿主机的内核;而虚拟机在硬件级别进行虚拟化,每个虚拟机都拥有独立…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...
OCR MLLM Evaluation
为什么需要评测体系?——背景与矛盾 能干的事: 看清楚发票、身份证上的字(准确率>90%),速度飞快(眨眼间完成)。干不了的事: 碰到复杂表格(合并单元…...
Python常用模块:time、os、shutil与flask初探
一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...
用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法
用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法 大家好,我是Echo_Wish。最近刷短视频、看直播,有没有发现,越来越多的应用都开始“懂你”了——它们能感知你的情绪,推荐更合适的内容,甚至帮客服识别用户情绪,提升服务体验。这背后,神经网络在悄悄发力,撑起…...
