canvas实现移动端和PC端刮刮卡效果
2016-07-13 14:54
483 查看
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"> <title>H5刮刮卡</title> <style> *{ padding:0; margin:0; border:none; } .card_view{ width: 200px; height: 100px; line-height: 100px; font-size: 30px; text-align: center; font-weight: bold; position: absolute; color: red; top:100px; left: 100px; } #cardCanvas{ border:1px solid #ccc; position: absolute; top:100px; left: 100px; } </style> </head> <body> <div class="card_view"> 10000元 </div> <canvas id="cardCanvas"></canvas> <script> document.querySelector('body').addEventListener('touchstart', function (e) { var e=e||window.event; e.preventDefault(); }); var c=document.getElementById('cardCanvas'); var ctx=c.getContext('2d'); c.width=200; //画布宽 c.height=100; //画布高 ctx.beginPath(); //画布的第一层 ctx.fillStyle="#888"; ctx.fillRect(0,0,200,100); ctx.closePath(); //画布的第二层 ctx.font="bold 50px Microsoft Yahei"; ctx.textAlign="left"; ctx.fillStyle="#666666"; ctx.fillText("刮一刮",25,60); ctx.globalCompositeOperation="destination-out"; //新图像和原图像重合部分变透明 //移动端 c.addEventListener('touchstart',function(e){ var e=e||window.event; var x=e.touches[0].clientX-c.offsetLeft; var y=e.touches[0].clientY-c.offsetTop; ctx.moveTo(x,y) c.addEventListener('touchmove',gmove,false) },false) c.addEventListener('touchend',function(){ clearC(); },false) //PC端 c.addEventListener('mousedown',function(e){ var e=e||window.event; var x=e.clientX-c.offsetLeft; var y=e.clientY-c.offsetTop; ctx.moveTo(x,y) c.addEventListener('mousemove',gmove,false) },false) c.addEventListener('mouseup',function(){ clearC(); c.removeEventListener('mousemove',gmove,false) },false) function gmove(e){ //刮卡函数 if(typeof e.touches!='undefined'){ e=e.touches[0]; } var mx=e.clientX-c.offsetLeft; var my=e.clientY-c.offsetTop; ctx.strokeStyle="white"; ctx.lineCap="round"; //绘制的线结束时为圆形 ctx.lineJoin="round"; //当两条线交汇时创建圆形边角 ctx.lineWidth=20; ctx.lineTo(mx,my); ctx.stroke(); } function clearC(){ //刮开一定面积执行擦除画布函数 var data=ctx.getImageData(0,0,c.width,c.height).data; for(var i=0,j=0;i<data.length;i+=4){ //data.length=c.width*c.heigth*4,一个像素块是一个对象RGBA四个值,A范围为0~255 if(data[i]&&data[i+1]&&data[i+2]&&data[i+3]){ //存在imageData对象时j加1 PS:该像素区域透明即为不存在该对象 j++; } } if(j<=c.width*c.height*0.2){ //超过canvas面积的20%,就清除画布 ctx.clearRect(0,0,c.width,c.height); } } </script> </body> </html>
相关文章推荐
- JQuery1——基础($对象,选择器,对象转换)
- Android学习笔记(二九):嵌入浏览器
- Android java 与 javascript互访(相互调用)的方法例子
- JavaScript演示排序算法
- javascript实现10进制转为N进制数
- HTML5中在客户端验证文件上传的大小
- html5 web数据存储
- 最后一次说说闭包
- Ajax
- HTML5调用摄像头实例
- 页面元素查找之Selectors API
- 使用ajax实现用户登录验证(升级版)
- 2019年开发人员应该学习的8个JavaScript框架
- HTML中的script标签研究
- 对一个分号引发的错误研究
- 异步流程控制:7 行代码学会 co 模块
- ES6 走马观花(ECMAScript2015 新特性)
- JavaScript拆分字符串时产生空字符的原因