zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    1300多万条数据30G论坛大数据优化实战经验小结(转)
    spring 攻略第二版文摘
    关于extjs中动态添加TabPanel的tab项并以iframe显示的整理(转)
    effective_java_2nd_endition文摘
    软件开发中常见的十大系统瓶颈(转)
    浅谈JAVA集合框架(转)
    java EE设计模式spring企业级开发最佳实践文摘
    layout 布局(转)
    COM高手总结的八个经验和教训
    IShellLink应用(创建快捷方式)
  • 原文地址:https://www.cnblogs.com/libinblog/p/4398814.html
Copyright © 2011-2022 走看看