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中String和StringBuffer的速度之争
Apr 01 Javascript
兼容FF和IE的动态table示例自写
Oct 21 Javascript
js中replace的用法总结
Dec 27 Javascript
HTML页面弹出居中可拖拽的自定义窗口层
May 07 Javascript
jQuery的one()方法用法实例
Jan 19 Javascript
jquery实现可点击伸缩与展开的菜单效果代码
Aug 31 Javascript
js判断手机号运营商的方法
Oct 23 Javascript
基于BootStrap Metronic开发框架经验小结【一】框架总览及菜单模块的处理
May 12 Javascript
JS实现获取进今年第几天是周几的方法分析
Jun 27 Javascript
layui复选框的全选与取消实现方法
Sep 02 Javascript
手写Spirit防抖函数underscore和节流函数lodash
Mar 22 Javascript
JS class语法糖的深入剖析
Jul 07 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
Mysql中分页查询的两个解决方法比较
2013/05/02 PHP
计算php页面运行时间的函数介绍
2013/07/01 PHP
PHP include任意文件或URL介绍
2014/04/29 PHP
php的api数据接口书写实例(推荐)
2016/09/22 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
2017/11/10 PHP
PHP微信企业号开发之回调模式开启与用法示例
2017/11/25 PHP
jquery 实现的全选和反选
2009/04/15 Javascript
一个用javascript写的select支持上下键、首字母筛选以及回车取值的功能
2009/09/09 Javascript
讨论javascript(一)工厂方式 js面象对象的定义方法
2009/12/15 Javascript
jQuery验证插件validate使用方法详解
2020/09/13 Javascript
Vue.js每天必学之指令系统与自定义指令
2016/09/07 Javascript
基于jQuery对象和DOM对象和字符串之间的转化实例
2017/08/08 jQuery
浅谈Vue 数据响应式原理
2018/05/07 Javascript
react实现antd线上主题动态切换功能
2019/08/12 Javascript
浅谈layui 数据表格前后台传值的问题
2019/09/12 Javascript
[02:11]DOTA2上海特级锦标赛主赛事第二日RECAP
2016/03/04 DOTA
python使用新浪微博api上传图片到微博示例
2014/01/10 Python
初步探究Python程序的执行原理
2015/04/11 Python
举例讲解Python中的Null模式与桥接模式编程
2016/02/02 Python
Python 的描述符 descriptor详解
2016/02/27 Python
使用Python读写文本文件及编写简单的文本编辑器
2016/03/11 Python
Python用Pillow(PIL)进行简单的图像操作方法
2017/07/07 Python
Python网络爬虫中的同步与异步示例详解
2018/02/03 Python
Selenium定位元素操作示例
2018/08/10 Python
CentOS 7 安装python3.7.1的方法及注意事项
2018/11/01 Python
不到40行代码用Python实现一个简单的推荐系统
2019/05/10 Python
python 如何使用find和find_all爬虫、找文本的实现
2020/10/16 Python
详解css3 Transition属性(平滑过渡菜单栏案例)
2017/09/05 HTML / CSS
广州品高软件.net笔面试题目
2012/04/18 面试题
求职自荐书范文
2013/12/04 职场文书
开业主持词
2014/03/21 职场文书
《中国梦我的梦》大学生演讲稿
2014/08/20 职场文书
营销经理工作检讨书
2014/11/03 职场文书
数学教师个人总结
2015/02/06 职场文书
Python 读写 Matlab Mat 格式数据的操作
2021/05/19 Python
虚拟机linux端mysql数据库无法远程访问的解决办法
2021/05/26 MySQL