js canvas实现擦除效果示例代码


Posted in Javascript onApril 26, 2017

关于canvas的定义:

     HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像。

     画布是一个矩形区域,您可以控制其每一像素。

     canvas 拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法。

html代码:

<div class="container">

 <canvas id="canvas" width="200" height="50"></canvas>

 <div class="content">hello world</div>

</div>

设置一个父容器,里面包括canvas标签,用于遮罩,content用于显示擦除遮罩层之后的内容

ps:设置canvas元素需要加上width和height属性,这样绘制的图形才能按照正常尺寸显示,否则在css里面设置宽高,虽然canvas标签的大小会正常显示,绘制的图形则会按照缺省宽高比例放大缩小,缺省的高度是300px,宽度是150px。

创建context对象,getContext("2d") 对象是内建的 HTML5 对象,拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法

var canvas = document.getElementById(id);

var ctx=canvas.getContext('2d');

绘制一个能覆盖容器的矩形,rect() 方法创建矩形,fill()绘制图像,默认颜色为黑色,可以使用fillStyle属性设置其他颜色

ctx.rect(0,0,canvas.width,canvas.height);

ctx.fill();

图像绘制完成,下面是事件绑定,要实现擦除效果,pc上主要绑定鼠标事件,鼠标按下,启动擦除,鼠标松开,关闭擦除

canvas.addEventListener('mousedown', eventDown);

canvas.addEventListener('mouseup', eventUp);

canvas.addEventListener('mousemove', eventMove);

这里先设置一个变量,用以表示,鼠标是否处于按下的状态

var mousedown = false;

鼠标按下松开的事件比较简单,主要是设置状态参数

function eventDown(e){

 e.preventDefault();

 mousedown=true;

}

 

function eventUp(e){

 e.preventDefault();

 mousedown=false;

}

鼠标滑动事件,鼠标滑过的地方,以圆形区域清除图形

首先设置ctx.globalCompositeOperation = 'destination-out';

globalCompositeOperation 属性设置或返回如何将一个源(新的)图像绘制到目标(已有)的图像上。

destination-out 在源图像外显示目标图像。只有源图像外的目标图像部分会被显示,源图像是透明的。

这个属性是在先后绘制图形情况下,设置两个图形的显示方式。

属性值如下

js canvas实现擦除效果示例代码

具体显示效果,红色矩形是(新)目标图像。蓝色矩形是源(旧)图像:

js canvas实现擦除效果示例代码

鼠标移动函数

function eventMove(e){

 e.preventDefault();

 if(mousedown) {

 var x = (e.clientX + document.body.scrollLeft || e.pageX) - offsetX || 0;

 var y = (e.clientY + document.body.scrollTop || e.pageY) - offsetY || 0;

 ctx.beginPath();

 ctx.arc(x, y, 20, 0, Math.PI * 20);

 ctx.fill();

 }

}

arc() 方法创建弧/曲线(用于创建圆或部分圆),context.arc(x,y,r,sAngle,eAngle,counterclockwise);

ps:通过 arc() 来创建圆,请把起始角设置为 0,结束角设置为 2*Math.PI。

js canvas实现擦除效果示例代码

最终效果:

js canvas实现擦除效果示例代码

此方法只用于pc端,因为绑定的是鼠标事件,如果要在移动设备上也实现,需要绑定触摸事件

canvas.addEventListener('touchstart', eventDown);

canvas.addEventListener('touchend', eventUp);

canvas.addEventListener('touchmove', eventMove);

如果是触摸事件,返回的对象中没有直接的坐标相关信息,需要在changedTouches中去取到触摸事件对应的 Touch 对象。

if(e.changedTouches){

e=e.changedTouches[e.changedTouches.length-1];

}

补充更新

这里只实现了使用背景色遮罩的方法,补充一下使用图片作为遮罩的方法

var img = new Image();

img.src = 'cover.png';

创建一个图片对象,并设置图片地址,绘制图片到canvas元素需要使用到drawImage方法,具体使用方法可以参考: HTML5 canvas drawImage() 方法

这里使用的时候需要注意,图片加载是异步的,有时会加载的比较慢,在后续的绘制操作过程中,最好是在图片加载完成后再进行

img.onload = function() {

 ctx.drawImage(img, 0, 0,canvas.width, canvas.height);

 ctx.globalCompositeOperation = 'destination-out'; 

  //其他操作...

}

最终实现效果:

js canvas实现擦除效果示例代码

完整代码下载:

github地址: https://github.com/Martian1/erase.js

本地下载:http://xiazai.3water.com/201704/yuanma/erase.js-master(3water.com).rar

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
使用js实现按钮控制文本框加1减1应用于小时+分钟
Dec 09 Javascript
JavaScript中的console.profile()函数详细介绍
Dec 29 Javascript
html的DOM中document对象images集合用法实例
Jan 21 Javascript
实例讲解JS中setTimeout()的用法
Jan 28 Javascript
JavaScript 对象字面量讲解
Jun 06 Javascript
jquery实现提示语淡入效果
May 05 jQuery
Node.js环境下Koa2添加travis ci持续集成工具的方法
Jun 19 Javascript
Django使用多数据库的方法
Sep 06 Javascript
CSS3结合jQuery实现动画效果及回调函数的实例
Dec 27 jQuery
深入浅析Vue 中 ref 的使用
Apr 29 Javascript
JavaScript实现矩形块大小任意缩放
Aug 25 Javascript
利用 JavaScript 构建命令行应用
Nov 17 Javascript
vue-cli如何快速构建vue项目
Apr 26 #Javascript
Vue制作Todo List网页
Apr 26 #Javascript
bootstrap table表格使用方法详解
Apr 26 #Javascript
node.js中实现kindEditor图片上传功能的方法教程
Apr 26 #Javascript
windows下vue-cli导入bootstrap样式
Apr 25 #Javascript
windows下vue-cli及webpack搭建安装环境
Apr 25 #Javascript
Vue+axios 实现http拦截及路由拦截实例
Apr 25 #Javascript
You might like
十大催泪虐心动漫电影,有几部你还没看
2020/03/04 日漫
?算你??的 PHP 程式大小
2006/12/06 PHP
Blitz templates 最快的PHP模板引擎
2010/04/06 PHP
比较strtr, str_replace和preg_replace三个函数的效率
2013/06/26 PHP
大家都应该掌握的PHP关联数组使用技巧
2015/12/25 PHP
Laravel5中Cookie的使用详解
2017/05/03 PHP
JS高级笔记
2011/07/13 Javascript
JavaScript中用字面量创建对象介绍
2014/12/31 Javascript
AngularJS中$interval的用法详解
2016/02/02 Javascript
js弹出框、对话框、提示框、弹窗实现方法总结(推荐)
2016/05/31 Javascript
JS实现放大、缩小及拖拽图片的方法【可兼容IE、火狐】
2016/08/23 Javascript
jQuery实现立体式数字动态增加(animate方法)
2016/12/21 Javascript
javascript基于牛顿迭代法实现求浮点数的平方根【递归原理】
2017/09/28 Javascript
基于Vue2的独立构建与运行时构建的差别(详解)
2017/12/06 Javascript
微信小程序多音频播放进度条问题
2018/08/28 Javascript
VSCode使用之Vue工程配置eslint
2019/04/30 Javascript
小程序实现投票进度条
2019/11/20 Javascript
微信小程序实现吸顶效果
2020/01/08 Javascript
js回到页面指定位置的三种方式
2020/12/17 Javascript
[36:54]Mineski vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python使用三角迭代计算圆周率PI的方法
2015/03/20 Python
Python下线程之间的共享和释放示例
2015/05/04 Python
python3+PyQt5自定义视图详解
2018/04/24 Python
pandas实现将dataframe满足某一条件的值选出
2019/06/12 Python
python从zip中删除指定后缀文件(推荐)
2019/12/05 Python
opencv python图像梯度实例详解
2020/02/04 Python
PyQt5连接MySQL及QMYSQL driver not loaded错误解决
2020/04/29 Python
python中常用的数据结构介绍
2021/01/12 Python
英国领先的体验日提供商:Buyagift
2019/04/19 全球购物
积极分子思想汇报
2014/01/04 职场文书
优秀班主任经验交流材料
2014/06/02 职场文书
上课不认真检讨书
2014/09/17 职场文书
Pytorch反向传播中的细节-计算梯度时的默认累加操作
2021/06/05 Python
Python虚拟环境virtualenv是如何使用的
2021/06/20 Python
Spring Cloud 中@FeignClient注解中的contextId属性详解
2021/09/25 Java/Android
Win11快速关闭所有广告推荐
2022/04/19 数码科技