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 相关文章推荐
JavaScript Date对象 日期获取函数
Dec 19 Javascript
JQuery动态给table添加、删除行 改进版
Jan 19 Javascript
jquery中的事件处理详细介绍
Jun 24 Javascript
屏蔽IE弹出&quot;您查看的网页正在试图关闭窗口,是否关闭此窗口&quot;的方法
Dec 31 Javascript
js星星评分效果
Jul 24 Javascript
微信小程序 用户数据解密详细介绍
Jan 09 Javascript
webpack学习笔记之优化缓存、合并、懒加载
Aug 24 Javascript
ES6学习笔记之map、set与数组、对象的对比
Mar 01 Javascript
vue最简单的前后端交互示例详解
Oct 11 Javascript
在Web关闭页面时发送Ajax请求的实现方法
Mar 07 Javascript
《javascript设计模式》学习笔记一:Javascript面向对象程序设计对象成员的定义分析
Apr 07 Javascript
详解如何在Canvas中添加事件的方法
Apr 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
php5.5中类级别的常量使用介绍
2013/10/02 PHP
PHP面向对象继承用法详解(优化与减少代码重复)
2016/12/02 PHP
深入浅析PHP的session反序列化漏洞问题
2017/06/15 PHP
JavaScript插入动态样式实现代码
2012/02/22 Javascript
js中的onchange和onpropertychange (onchange无效的解决方法)
2014/03/08 Javascript
JavaScript中对象的不同创建方法
2016/08/12 Javascript
Javascript数组中push方法用法分析
2016/10/31 Javascript
js实现关闭网页出现是否离开提示
2017/12/07 Javascript
axios发送post请求,提交图片类型表单数据方法
2018/03/16 Javascript
vue.js数据绑定操作详解
2018/04/23 Javascript
jQuery 实现倒计时天,时,分,秒功能
2018/07/31 jQuery
详解TypeScript+Vue 插件 vue-class-component的使用总结
2019/02/18 Javascript
你不知道的Vue技巧之--开发一个可以通过方法调用的组件(推荐)
2019/04/15 Javascript
微信小程序实现弹出菜单动画
2019/06/21 Javascript
Javascript 对象(object)合并操作实例分析
2019/07/30 Javascript
Vuex modules模式下mapState/mapMutations的操作实例
2019/10/17 Javascript
js实现适配移动端的拖动效果
2020/01/13 Javascript
elementui更改el-dialog关闭按钮的图标d的示例代码
2020/08/04 Javascript
[02:51]DOTA2英雄基础教程 艾欧
2014/01/13 DOTA
Python Tkinter GUI编程入门介绍
2015/03/10 Python
Python中的数据对象持久化存储模块pickle的使用示例
2016/03/03 Python
深入理解python中函数传递参数是值传递还是引用传递
2017/11/07 Python
python enumerate函数的使用方法总结
2017/11/15 Python
python实现文件助手中查看微信撤回消息
2019/04/29 Python
PyCharm使用之配置SSH Interpreter的方法步骤
2019/12/26 Python
OpenCV中VideoCapture类的使用详解
2020/02/14 Python
Python datetime 格式化 明天,昨天实例
2020/03/02 Python
特步官方商城:Xtep
2017/03/21 全球购物
美国知名保健品网站:LuckyVitamin(支持中文)
2017/08/09 全球购物
YesBabyOnline美国:全球性的在线婚纱礼服工厂
2018/05/05 全球购物
安全资料员岗位职责
2013/12/14 职场文书
业务主管岗位职责范本
2013/12/25 职场文书
经济管理专业自荐信
2013/12/30 职场文书
体育比赛口号
2014/06/09 职场文书
学生偷窃检讨书
2014/09/25 职场文书
党员干部廉政承诺书
2015/04/28 职场文书