美文网首页前端进阶之路前端风暴
使用canvas实现擦除效果

使用canvas实现擦除效果

作者: 水一川 | 来源:发表于2018-01-08 15:49 被阅读93次

w3c关于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 在源图像外显示目标图像。只有源图像外的目标图像部分会被显示,源图像是透明的。
这个属性是在先后绘制图形情况下,设置两个图形的显示方式。
属性值如下



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



鼠标移动函数
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。


最终效果:

此方法只用于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];
}

2017.4.23更新

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

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'; 
   //其他操作...
}

最终实现效果:


原博客备份

相关文章

  • 使用canvas实现擦除效果

    w3c关于canvas的定义: HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像。画...

  • 2017-12-28

    使用canvas和js实现烟花的效果 效果如下:

  • 前端效果链接

    canvas canvas实现各种点线效果 Canvas设置width与height 的问题!

  • 自定义日历控件

    效果图 使用 实现 MonthView 通过drawHeaderSpace(canvas)方法绘制顶灰色部间隔 通...

  • canvas环形倒计时组件

    效果如下图一: Canvas环形倒计时组件 Canvas环形倒计时是基于Canvas实现的倒计时,建议于移动端使用...

  • canvas中通过globalAlpha实现渐隐效果

    canvas 想要实现渐隐效果,首先要理解显示,隐藏效果的原理,在canvas中怎么实现显示或者隐藏的效果呢?ca...

  • 使用canvas实现粒子流动效果

    使用canvas实现粒子流动效果 首先我们先来看下实现的效果吧~ (简书不支持插入视频,只能点击链接查看[htt...

  • canvas大转盘

    下面再介绍一个canvas实例,使用canvas技术实现一个大转盘,在抽奖中用的比较多,实现后的效果如果所示: 第...

  • 纯Canvas事件按钮点击按下效果

    使用纯Canvas实现一个按钮点击按下的效果,类似下图 使用到的API阴影偏移: shadowOffsetX = ...

  • 基于canvas画板原理(H5)

    一个简单的小事例,利用canvas实现画板效果。实现原理:鼠标事件+canvas效果图: 代码: 如有问题欢迎交流...

网友评论

    本文标题:使用canvas实现擦除效果

    本文链接:https://www.haomeiwen.com/subject/laebnxtx.html