前端实战小案例--canvas之移动端刮刮卡效果

前端实战小案例--canvas之移动端刮刮卡效果

想练习更多前端案例,请进个人主页,点击前端实战案例->传送门

觉得不错的记得点个赞?支持一下我0.0!谢谢了!

不积跬步无以至千里,不积小流无以成江海。

效果图如下:

代码如下(若显示不全,请复制到IDE中运行查看代码): 

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
		<title></title>
		<script>
			window.onload = function(){
				var canvas  = document.querySelector('canvas');
				canvas.width = document.documentElement.clientWidth;
				canvas.height = document.documentElement.clientHeight;
				//这里是做浏览器兼容,有这个方法则创建画笔,没有则不创建
				if(canvas.getContext){
					var ctx = canvas.getContext('2d');
					var img = new Image();
					img.src = './imgs/scratch-card01.jpg';
					img.onload = function(){
						draw();
					}
					
					function draw(){
						var count=0;
						ctx.drawImage(img,0,0,canvas.width,canvas.height);
						//设置手指点击事件
						canvas.ontouchstart = function(ev){
							ev = ev||event;
							var oTouch = ev.changedTouches[0];
							var x = oTouch.clientX;
							var y = oTouch.clientY;
							
							ctx.lineWidth = 40;
							ctx.lineCap = "round";
							ctx.lineJoin = "round";
							ctx.globalCompositeOperation = "destination-out"
							ctx.save();
							ctx.beginPath();
							ctx.moveTo(x,y);
							ctx.lineTo(x+1,y+1);
							ctx.stroke();
							ctx.restore();
						}
						//设置手指滑动事件
						canvas.ontouchmove = function(ev){
							ev = ev||event;
							var oTouch = ev.changedTouches[0];
							var x = oTouch.clientX;
							var y = oTouch.clientY;
							
							ctx.save();
							ctx.lineTo(x,y);
							ctx.stroke();
							ctx.restore();
						}
						//设置手指拿起事件,并判断刮刮卡已经刮掉的面积是否大于50%,若真,则直接显示全图
						canvas.ontouchend = function(){
							var imgData = ctx.getImageData(0,0,canvas.width,canvas.height);
							var allPix = canvas.width * canvas.height;
							for(let i=0;i<allPix;i++){
								// 这里4*i的意思是一个像素点有rgba四个属性(0-255),在加3就是a即透明度.
								if(imgData.data[4*i+3] === 0){
									count++;
								}
							}
							if(count >= allPix/2){
								//当刮刮卡已经刮掉的面积大于50%,则直接设置透明度为0,显示里面的图
								canvas.style.opacity = 0;
							}
						}
                        //当结束动画时,去除canvas动画,让用户能够操作li元素,后续可以在li添加多个页面
						canvas.addEventListener("transitionend",function(){
							this.remove();
						})
					}
				}
			}
		</script>
		<style>
			*{
				margin: 0;
				padding: 0;
			}
			.scratch-card{
				height: 100vh;
			}
			canvas{
				position: absolute;
				top: 0;
				left: 0;
				transition: 1.2s;
			}
			.scratch-card ul,ul>li{
				height: 100%;
				
			}
			.scratch-card ul>li{
				background: url(./imgs/scratch-card02.jpg) no-repeat;
				background-size:100% 100%;
			}
		</style>
	</head>
	<body>
		<div class="scratch-card">
			<canvas>
				<span>您的浏览器不支持画布元素,请使用谷歌浏览器</span>
			</canvas>
			<ul>
				<li></li>
			</ul>
		</div>
	</body>
</html>

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值