react+canvas实现刮刮乐效果

在这里插入图片描述
在这里插入图片描述

话不多说,直接看代码吧
import { useEffect } from 'react';
import styles from './index.less';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 = '#e0e0e0';ctx.fillRect(0, 0, 200, 100);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) => {if (isDraw) {writeText(ctx, e, gj);}};} function writeText(ctx: any, e: MouseEvent, gj: HTMLElement) {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, 10, 0, Math.PI * 2);ctx?.fill();}useEffect(() => {init();}, []);return (<div className={styles.container}><div className="  text-center  text-[16px]">刮刮乐</div><div className="gj mt-4 cursor-pointer"><div id="jp"></div><canvas id="mask" width={200} height={100}></canvas></div></div>);
}
index.less部分
.container {padding: 20px;box-shadow: 4px 4px 4px 4px #eee;overflow: hidden; .gj {margin: 16px auto;width: 200px;height: 100px;#jp {position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);font-size: 20px;color: black;}#mask {position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);}} 
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

零感佩戴的开放式耳机,音质悦耳更耐听,西圣Air体验

每天都用蓝牙耳机的朋友应该不少&#xff0c;我平时也经常戴&#xff0c;不过最近我用的不是常规的入耳式耳机&#xff0c;因为它佩戴不舒适&#xff0c;戴久了耳朵特别难受。所以现在我换上了开放式耳机&#xff0c;这种耳机叫做OWS&#xff0c;我的这款是西圣Air&#xff0c;…

如何使用 Docker 搭建 Jenkins 环境?从安装到精通

最近有不少同学搭 jenkins 环境有问题&#xff0c;有的同学用 window, 有的同学用 mac&#xff0c; 有的同学用 linux。 还有的同学公司用 window, 家里用 mac&#xff0c;搭个环境头发掉了一地。。。 这回我们用 docker 去搭建 jenkins 环境&#xff0c;不管你是用的是什么系…

【黑马程序员】3、TypeScript常用类型_黑马程序员前端TypeScript教程,TypeScript零基础入门到实战全套教程

课程地址&#xff1a;【黑马程序员前端TypeScript教程&#xff0c;TypeScript零基础入门到实战全套教程】 https://www.bilibili.com/video/BV14Z4y1u7pi/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 目录 3、TypeScript常用类型 3.1 类型注解 …

基础知识常见算法识别

特征值识别 很多常见的算法&#xff0c;如AES、DES等&#xff0c;在运算过程中会使用一些常量&#xff0c;而为了提高运算效率&#xff0c;这些常量往往被硬编码在程序中 通过识别这些特征值&#xff0c;可以对算法进行一个大致判断 算法特征值&#xff08;无特殊说明为十六…

双向链表(1)

前面说过在需要不停的找前驱时&#xff08;删除要找前驱等等&#xff09;&#xff0c;其时间复杂度很大。 这个图就是双向链表&#xff0c;相当于2个&#xff08;方向相反的&#xff09;单链表合起来 所以双向链表的结构设计就是比单链表多了一个指针域&#xff0c;以空间换时间…

Linux提权—服务漏洞,以MySQL-UDF提权为例

UDF(user defined function&#xff0c;用户自定义函数) 利用条件&#xff1a; 有对MySQL数据库进行创建&#xff0c;插入&#xff0c;删除的权限 secure_file_priv为空 利用过程 secure_file_priv的值为空或者是我们恰巧需要用到的目录&#xff0c;如下&#xff1a; 提权成…

Flink代码单词统计 ---批处理

flatMap&#xff1a;一对多转换操作&#xff0c;输入句子&#xff0c;输出分词后的每个词groupBy&#xff1a;按Key分组&#xff0c;0代表选择第1列作为Keysum&#xff1a;求和&#xff0c;1代表按照第2列进行累加print&#xff1a;打印最终结果 1.WordCount代码编写 需求&am…

Docker基础(一)

文章目录 1. 基础概念2. 安装docker3. docker常用命令3.1 帮助命令3.2 镜像命令3.3 容器命令3.4 其他命令 4. 使用案例 1. 基础概念 镜像&#xff08;Image&#xff09;&#xff1a;Docker 镜像&#xff08;Image&#xff09;&#xff0c;就相当于是一个 root 文件系统。比如官…

精酿啤酒:酵母的选择与发酵时间的影响

酵母是啤酒酿造过程中不可或缺的微生物&#xff0c;其选择和发酵时间对啤酒的口感、品质和风格产生着重要影响。Fendi Club啤酒在酵母的选择与发酵时间的控制方面有着与众不同的技巧和经验。 首先&#xff0c;酵母的选择对啤酒的发酵过程和品质重要。Fendi Club啤酒选用品质、高…

kubectl 命令行管理K8S

目录 陈述式资源管理方法 1.基本信息查看 查看版本信息 查看资源对象简写 查看集群信息 配置kubectl自动补全 node节点查看日志 查看 master 节点状态 查看命名空间 查看default命名空间的所有资源 创建命名空间yy 删除命名空间yy 在命名空间kube-public 创建副本…

vue2实现无感刷新token

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 &#x1f4d8; 引言&#xff1a; &#x1f4…

力扣用例题:2的幂

此题的解题方法在于根据用例调整代码 bool isPowerOfTwo(int n) {if(n1){return true;}if(n<0){return false;}while(n>2){if(n%21){return false;}nn/2; }if(n1){return false;}return true;}