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

  • 相关阅读:
    关于组建“智彩足球技术研究团队”的说明
    2次成功投诉EMS和中国移动的经验
    为什么选择玩足球彩票以及玩彩票的心态?
    【原创】机器学习之PageRank算法应用与C#实现(1)算法介绍
    【原创】开源Math.NET基础数学类库使用(17)C#计算矩阵条件数
    【原创】开源Math.NET基础数学类库使用(16)C#计算矩阵秩
    【文章】本站收集与转载文章目录
    【原创】.NET读写Excel工具Spire.Xls使用(3)单元格控制
    分享一个Visual Studio的背景插件,让堆码更富情趣
    【原创】开源Math.NET基础数学类库使用(15)C#计算矩阵行列式
  • 原文地址:https://www.cnblogs.com/libinblog/p/4398814.html
Copyright © 2011-2022 走看看