首页 > 其他分享 >js实现画布绘图、橡皮擦除、刮刮卡效果

js实现画布绘图、橡皮擦除、刮刮卡效果

时间:2023-04-21 12:13:41浏览次数:32  
标签:function 橡皮擦 100% beginDrew canvas 刮刮卡 js pen let

关键节点只有两处

  1. pen.globalCompositeOperation = 'destination-out';
  2. 通过背景图片实现擦除后仍保留底层图片效果
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .mainCanvas{
            -moz-background-size:100% 100%; background-size:100% 100%;
        }
    </style>
  
</head>
<body>
    <canvas id="mainCanvas" width="244" height="182" class="mainCanvas" >
Your browser does not support the HTML5 canvas tag.
</canvas>
<div>

    <img src="test.png" id="testimg" style="margin-left:0px; float: left;"/>
    <canvas style="float: left; "></canvas>
</div>

<script>
    let beginDrew=false;
    let canvas=document.getElementById("mainCanvas");
    let lastX,lastY;//点击时相对画布位置
    let pen=canvas.getContext("2d");
    canvas.style.backgroundImage='URL(test.png)';

    canvas.onmousedown=function(e){
        beginDrew=true;

        lastX=e.offsetX-canvas.clientLeft;
        lastY=e.offsetY-canvas.clientTop;

        pen.moveTo(lastX,lastY);
    }
    document.getElementById("testimg").onload=function(){ 
        var img=document.getElementById("testimg");
        console.log(img)
        pen.fillRect(0,0,canvas.width,canvas.height);
    };

    canvas.onmousemove=function(e){
        if(!beginDrew){
            return;
        }

        drew(pen,e);
    }
    canvas.onmouseup=function(e){
        beginDrew=false;
    }
    canvas.onmouseout=function(e){
        beginDrew=false;
    }

    function drew(pen, e){
        pen.fillStyle="red";
        pen.strokeStyle="red";
        pen.lineWidth=10;
        pen.globalCompositeOperation = 'destination-out';
        pen.lineTo(e.offsetX,e.offsetY);
        pen.stroke();
    }
</script>
</body>
</html>

标签:function,橡皮擦,100%,beginDrew,canvas,刮刮卡,js,pen,let
From: https://www.cnblogs.com/ives/p/17339900.html

相关文章

  • js 实现字符串反转
    1.情景展示在JavaScript当中,如何实现字符串倒转(倒置、反转)?2.具体分析数组Array实现元素倒转,有专门的函数reserve(),我们直接调用即可。为了使用这个功能,我们可以把字符串先拆分成数组,然后,再调用反转函数,最后再拼成字符串。3.解决方案以字符串:Marydon的博客园为例进行说明。......
  • js find 方法,查找到所需数值,立即返回,不会再继续循环
    注意和filter区别......
  • JS课堂笔记(4.11-4.16)
    一、简单了解JS1.JavaScript(简称JS)是作为开发Web页面的脚本语言。2.JS是从1995年由网景公司的布兰德开发。3.JavaScript的标准是ECMAScript。4.JS代码是从上往下执行的。 二、变量1.变量名的值可以重复赋值(值可以修改),变量可以重复声明。2.JS中“+”号很特殊,只要是和......
  • 对kotlin友好的现代 JSON 库 moshi 基本使用和实战
    对kotlin友好的现代JSON库moshi基本使用和实战blog.csdn.net成就一亿技术人!前言上一篇博客我们聊了下gson在处理kotlindataclass时的一些坑,感兴趣的可以了解一下:gson反序列化成dataclass时的坑总结一下有一下两点属性声明时值不能为null,结果反序列化后值为null,跟预......
  • 原来这就是所谓的 JSR!
    相信大家在学习Java的过程中,或多或少都见过JSR这个词。本篇文章就科普下什么是JSR。什么是JSR?JSR(JavaSpecificationRequests),是指Java规范请求(或者活规范提案)。这个请求(提案)是提给JCP的(JavaCommunityProcess)。那什么是JCP呢?JCP官网在这:https://jcp.org/en/hom......
  • js的forEach()方法,获取索引值index
    forEach()方法用于调用数组的每个元素,并将元素传递给回调函数。用法:1、forEach有3个参数:第一个参数可以获取循环一遍的值;第二个参数可以获取当前元素的索引值(下标);第三个参数可以获取当前数组;例:vararr=[1,2,3,4]arr.forEach(function(val,index,array){consol......
  • Day 26 26.1 JS进阶之JS对象
    JS进阶之JS对象【一】、字符串对象字符串创建(两种方式)变量=“字符串”字串对象名称=newString(字符串)varstr1="helloworld";//推荐varstr1=newString("helloword");//字符串对象的操作varstr="hello";//这就是字符串对象console.log(str);//......
  • node.js使用Nodemailer发送邮件
    引言--常常看到一些网站有邮箱获取验证码验证注册或者修改密码等,今天也来了解一下在nodejs+express怎么发送电子邮件。使用模块Nodemailer。这里以qq邮箱举例子。安装模块--npminstallNodemailer--save创建一个SMTP客户端配置--//引入模块nodemailerconstnodemai......
  • json字符串格式化工具
    publicclassJsonFormatTool{/***单位缩进字符串。*/privatestaticStringSPACE="";/***返回格式化JSON字符串。**@paramjson未格式化的JSON字符串。*@return格式化的JSON字符串。*/publicstat......
  • JSch - 配置SFTP服务器SSH免密登录
    目录1.什么是SFTP2.什么是Jsch以及它的作用3.sftp服务器认证机制4.publickey和password两种方式登录sftp的API调用需求:做一个通过ssh免密登录的需求,是基于原先密码登录sftp服务器的代码上进行改造1.什么是SFTPSFTP是一个安全文件传送协议,可以为传输文件提供一种安全的加......