zoukankan      html  css  js  c++  java
  • 实现刮刮乐的效果

    <!DOCTYPE html>
    <html>
    
    	<head>
    		<meta charset="utf-8">
    		<title></title>
    		<style type="text/css">
    			* {
    				margin: 0;
    				padding: 0;
    			}
    		</style>
    	</head>
    
    	<body>
    		<div id="box">
    			<img src="img/1.jpg" style=" 700px;height: 500px;" />
    			<canvas id="myCanvas" width="700" height="500" style="position: absolute; left: 0px;top: 0px;"></canvas>
    		</div>
    	</body>
    	<script type="text/javascript">
    		var myCanvas = document.getElementById('myCanvas');
    		var context = myCanvas.getContext('2d');
    		//设置一个灰色矩形的画布 将图片盖住
    		context.fillStyle = 'gray';
    		context.fillRect(0, 0, 700, 500);
    
    		myCanvas.onmousedown = function(e) {
    			//获取鼠标按下时鼠标的坐标
    			var X = e.clientX - box.offsetLeft;
    			var Y = e.clientY - box.offsetTop;
    			//绘制起点
    			context.beginPath();
    			context.moveTo(X, Y);
    			myCanvas.onmousemove = function(e) {
    				//移动的时候开始绘制 获取此时的鼠标坐标
    				var x = e.clientX - box.offsetLeft;
    				var y = e.clientY - box.offsetTop;
    				//让绘制区域重合部分显示透明
    				context.globalCompositeOperation = "destination-out";
    
    				context.lineTo(x, y);
    				//修饰一下线条 
    				context.lineCap = 'round';
    				context.lineWidth = 30;
    				context.stroke();
    
    				//当刮到一半的时候,显示全图
    				//获取画布上的所有数据
    				var imgData = context.getImageData(0, 0, 700, 500);
    				//从图片数据中把像素获取出来
    				var pixels = imgData.data;
    				var num = 0;
    				//被刮的区域显示透明  遍历一下所有色素块 用num存一下有多少个像素显示透明(即被刮区域)
    				for(var i = 0; i < pixels.length; i += 4) {
    					if(pixels[i + 3] == 0) {
    						num++;
    					}
    				}
    			//当(被刮区域)超过 百分之多少时 让整个刮刮乐 全部显示
    				if(num / (pixels.length / 4) > 0.3) {
    					myCanvas.style.opacity = 0;
    				}
    
    			}
    		};
    	//当鼠标抬起时 让移动事件失效
    		myCanvas.onmouseup = function() {
    			myCanvas.onmousemove = null;
    		}
    	</script>
    
    </html>
    

      开始用用矩形或球形来当笔触,如果移动的过快浏览器有一个反应时间,会让刮的区域中间形成间隙.用线条来当笔触,适当的修饰笔触,可避免这个现象.

  • 相关阅读:
    js禁止鼠标右键功能
    js判断客户端是pc还是手机及获取浏览器版本
    js实现深拷贝的一些方法
    python使用requests请求的数据乱码
    PyCharm引入python需要使用的包
    几个常见用于解决nginx负载均衡的session共享问题的办法
    面试最让你手足无措的一个问题:你的系统如何支撑高并发?
    Linux/Windows 平台最容易安装 Composer教程
    Laravel一些常用命令整理
    nginx下重写隐藏index.php文件
  • 原文地址:https://www.cnblogs.com/wangziye/p/6014196.html
Copyright © 2011-2022 走看看