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 相关文章推荐
将CKfinder整合进CKEditor3.0的新方法
Jan 10 Javascript
jquery的ajax()函数传值中文乱码解决方法介绍
Nov 08 Javascript
JQuery简单实现锚点链接的平滑滚动
May 03 Javascript
js实现简洁的滑动门菜单(选项卡)效果代码
Sep 04 Javascript
实例讲解使用原生JavaScript处理AJAX请求的方法
May 10 Javascript
js中开关变量使用实例
Feb 24 Javascript
vue自定义过滤器创建和使用方法详解
Nov 06 Javascript
10个经典的网页鼠标特效代码
Jan 09 Javascript
vue的安装及element组件的安装方法
Mar 09 Javascript
使用React代码动态生成栅格布局的方法
May 24 Javascript
react的hooks的用法详解
Oct 12 Javascript
React Native登录之指纹登录篇的示例代码
Nov 03 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
10个简化PHP开发的工具
2014/12/25 PHP
jQuery性能优化28条建议你值得借鉴
2013/02/16 Javascript
jQuery封装的获取Url中的Get参数示例
2013/11/26 Javascript
window.onload追加函数使用示例
2014/03/03 Javascript
jQuery移除元素自动解绑事件实现思路及代码
2014/05/31 Javascript
js/jquery判断浏览器的方法小结
2014/09/02 Javascript
jQuery 浮动导航菜单适合购物商品类型的网站
2014/09/09 Javascript
js控制文本框输入的字符类型方法汇总
2015/06/19 Javascript
浅析JavaScript Array和string的转换(推荐)
2016/05/20 Javascript
详解jQuery中的事件
2016/12/14 Javascript
微信小程序 五星评价功能的实现
2017/03/09 Javascript
微信小程序开发之数据存储 参数传递 数据缓存
2017/04/13 Javascript
Angular中自定义Debounce Click指令防止重复点击
2017/07/26 Javascript
es6数值的扩展方法
2019/03/11 Javascript
小程序scroll-view安卓机隐藏横向滚动条的实现详解
2019/05/16 Javascript
简单了解小程序+node梳理登陆流程
2019/06/24 Javascript
vue 实现websocket发送消息并实时接收消息
2019/12/09 Javascript
js实现蒙版效果
2020/01/11 Javascript
[50:05]VGJ.S vs OG 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
使用Python开发windows GUI程序入门实例
2014/10/23 Python
Python读写文件基础知识点
2019/06/10 Python
Python+OpenCV+pyQt5录制双目摄像头视频的实例
2019/06/28 Python
利用pyshp包给shapefile文件添加字段的实例
2019/12/06 Python
Pyecharts 动态地图 geo()和map()的安装与用法详解
2020/03/25 Python
django xadmin action兼容自定义model权限教程
2020/03/30 Python
parser.add_argument中的action使用
2020/04/20 Python
解决Python中导入自己写的类,被划红线,但不影响执行的问题
2020/07/13 Python
canvas 实现 github404动态效果的示例代码
2017/11/15 HTML / CSS
酒店个人培训自我鉴定
2013/12/11 职场文书
厂办主管岗位职责范本
2014/02/28 职场文书
2015年建筑工作总结报告
2015/05/04 职场文书
职场干货:简历中的自我评价应该这样写!
2019/05/06 职场文书
MySQL 如何设计统计数据表
2021/06/15 MySQL
2022年四月新番
2022/03/15 日漫
「魔法少女伊莉雅」美游粘土人开订
2022/03/21 日漫
vue-cli3.0修改打包后的文件名和文件地址,打包后本地运行报错解决
2022/04/06 Vue.js