使用原生js做刮一刮功能

该效果可应用于刮一刮,涂抹图层等地方,使用canvas的globalCompositeOperation属性的destination-out值,根据手指移动画线,使之变透明,代码如下:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>刮一刮</title>
        <style>
            p{font-size: 30px;line-height: 60px;}
            #mycanvas{position: absolute;top: 0;left: 0;}
        </style>
        <!--<script src="http://code.jquery.com/jquery-1.11.1.min.js"></script>-->
    </head>
    <body>
        <p>哇,你看到我了吗?</p>
        <p>哇,你看到我了吗?</p>
        <p>哇,你看到我了吗?</p>
        <p>哇,你看到我了吗?</p>
        <p>哇,你看到我了吗?</p>
        <p>哇,你看到我了吗?</p>
        <canvas id="mycanvas"></canvas>

        <script>
            //可视区域的宽高
        var width = document.documentElement.clientWidth
        var height = document.documentElement.clientHeight;
        console.log(width,height);
        var boxTop = 0;//canvas的top值
        var boxLeft = 0;//canvas的left值
        console.log(boxTop)
        var device = /android|iphone|ipad|ipod|webos|iemobile|opear mini|linux/i.test(navigator.userAgent.toLowerCase());
        var startEvtName = device ? "touchstart" : "mousedown";
        var moveEvtName = device ? "touchmove" : "mousemove";
        var endEvtName = device ? "touchend" : "mouseup";

        var canvas=document.getElementById("mycanvas");
        //定义画布的大小
        canvas.height = height;
        canvas.width = width;
        can=canvas.getContext("2d");

        //进行画布的图片
//      var oImg = new Image();
//      oImg.src = "img/p702.png";
//      oImg.onload = function () {
//          can.beginPath();
//          can.drawImage(oImg, 0, 0, width, height);
//          can.closePath();
//      }
            can.fillStyle="#000";
            can.fillRect(0,0,width,height);
         /* 根据手指移动画线,使之变透明*/
        function draw(event) {
            var x = device ? event.touches[0].clientX : event.clientX;
            var y = device ? event.touches[0].clientY : event.clientY;
            console.log(x,y);

            can.beginPath();
            can.globalCompositeOperation = "destination-out";
            can.arc(x-boxLeft, y-boxTop, 40, 0, Math.PI * 2, false);
            can.fill();
            can.closePath();
        }
        /* 增加触摸监听*/
        //true  捕获 false  冒泡
        canvas.addEventListener(startEvtName, function () {
            console.log("touch1");

            canvas.addEventListener(moveEvtName, draw, false);
        }, false);

        canvas.addEventListener(endEvtName, function () {
            console.log("touch2");
            canvas.removeEventListener(moveEvtName, draw, false);
        }, false);
        document.addEventListener(endEvtName, function () {
            /* 获取imageData对象*/
            var imageDate = can.getImageData(0, 0, canvas.width, canvas.height);
            /* */
            var allPX = imageDate.width * imageDate.height;

            var iNum = 0;//记录刮开的像素点个数

            for (var i = 0; i < allPX; i++) {
                if (imageDate.data[i * 4 + 3] == 0) {
                    iNum++;
                }
            }
            if (iNum >= allPX * 1 / 3 ) {
                canvas.style.display = "none";
                alert("擦干净了");
            }
        }, false);
        </script>
    </body>
</html>
复制代码


转载于:https://juejin.im/post/5ca1c6cbf265da30d1035bfe

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值