canvas 擦除、刮刮卡效果

基于HTML5 Canvas技术实现的擦除、刮刮卡效果,轻轻刮去图层就可以模拟真实的效果。

原理:利用画布Canvas及其它自身API,在Canvas元素上绘制一个灰色蒙层,然后通过监听用户鼠标移到或手势来绘制一个透明的图形,这样就能看到Canvas背景下的真实图片(或背景图),即达到擦除效果。

HTML:(注意canvas元素是HTML5才有的元素,运行在支持HTML5的现代浏览器上)

<canvas></canvas>
Javascript:
-- 1、禁用页面的鼠标选中拖动(不选中)的事件
var bodyStyle = document.body.style; 
bodyStyle.mozUserSelect = 'none'; 
bodyStyle.webkitUserSelect = 'none'; 
-- 2、定义图片类,获取canvas元素,并设置背景和位置属性
var img = new Image(); 
var canvas = document.querySelector('canvas'); 
canvas.style.backgroundColor = 'transparent'; 
canvas.style.position = 'absolute';  
img.src = 'img/img.png';   
-- 3、检测到图片加载完时,定义一些属性和函数,
  ( 
    layer():绘制一个灰色的正方形
    eventDown():按下事件,
eventUp():松开事件,
eventMove():移动事件,
arc(x, y, 10, 0, Math.PI * 2):绘制小圆点
  )
img.addEventListener('load', function(e) {     // 我的理解:在确保canvas画布后的图片或背景图加载完成后,才可进行擦除行为。
    var ctx; 
    var w = img.width, h = img.height; 
    var offsetX = canvas.offsetLeft, offsetY = canvas.offsetTop; 
    var mousedown = false; 
 
    function layer(ctx) { 
        ctx.fillStyle = 'gray'; 
        ctx.fillRect(0, 0, w, h); 
    } 
    function eventDown(e) { 
        e.preventDefault(); 
        mousedown = true; 
    }  
    function eventUp(e) { 
        e.preventDefault(); 
        mousedown = false; 
    }  
    function eventMove(e) { 
        e.preventDefault(); 
        if(mousedown) { 
             if(e.changedTouches){ 
                 e = e.changedTouches[e.changedTouches.length-1]; 
             } 
             var x = (e.clientX + document.body.scrollLeft || e.pageX) - offsetX || 0, 
                 y = (e.clientY + document.body.scrollTop || e.pageY) - offsetY || 0;   // 鼠标按下或移动时的,坐标位置
             with(ctx) { 
                 beginPath() 
                 arc(x, y, 10, 0, Math.PI * 2);      // 绘制圆点 -- (10:为圆点大小)
                 fill(); 
             } 
        } 
    } 
    // 监听事件...
});
-- 4、canvas通过调用以上函数,绘制图形,并且监听触控及鼠标事件
canvas.width = w; 
canvas.height = h; 
canvas.style.backgroundImage = 'url(' + img.src + ')'; 
ctx = canvas.getContext('2d'); 
ctx.fillStyle = 'transparent'; 
ctx.fillRect(0, 0, w, h);    // 绘制矩形
layer(ctx); // 绘制函数
ctx.globalCompositeOperation = 'destination-out'; 
canvas.addEventListener('touchstart', eventDown); 
canvas.addEventListener('touchend', eventUp); 
canvas.addEventListener('touchmove', eventMove); 
canvas.addEventListener('mousedown', eventDown); 
canvas.addEventListener('mouseup', eventUp); 
canvas.addEventListener('mousemove', eventMove); 

水平有限,文中错误不妥在所难免,欢迎批评指正建议评论。文章将不定期修改完善。谢谢!


canvas 相关博文:


canvas 推荐学习:

       阮一峰《JavaScript 标准参考教程(alpha)》  Canvas API -- http://javascript.ruanyifeng.com/htmlapi/canvas.html  

       HTML5画布(CANVAS)速查简表   http://www.webhek.com/misc/html5-canvas-cheat-sheet

原文地址:https://www.cnblogs.com/libinblog/p/4398814.html