• 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>
      );
    }
    
    
    • 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
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    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%);
          }
        } 
    }
    
    
    • 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
  • 相关阅读:
    【uiautomation】获取微信好友名单,可指定标签 & 全部
    hello world的本质是什么?
    数据可视化实验一:Panda数据处理及matplotlib绘图初步
    [附源码]计算机毕业设计springboot小区物业管理系统
    安卓手机安装Linux然后在其中安装(jdk,MySQL,git)
    安装Conda和配置Jupiter
    llvm-ir之核心类设计
    /etc/sysctl.conf的参数
    yolov5系列-yolov5模型部署到web端
    重构学习(四):代码的坏味道
  • 原文地址:https://blog.csdn.net/zxo_apple/article/details/136229149