`
chenjie1121
  • 浏览: 12718 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

刮刮卡效果

 
阅读更多

实现刮刮卡效果,刮层下面是文字;

 

<canvas id="canvas_background" width="145px" height="35px"></canvas>
<canvas id="score"></canvas>
<script type="text/javascript">
	(function (bodyStyle) {
		
		// 在FF浏览器环境中,通过修改CSS3属性,使子元素中所有的文字都不能选择。
		bodyStyle.mozUserSelect = 'none';
		// 在Google浏览器环境中,通过修改CSS3属性,使子元素中所有的文字都不能选择。
		bodyStyle.webkitUserSelect = 'none';
		
		var canvas_score = document.querySelector('#score'), ctx_score = canvas_score.getContext('2d');
		var canvas = document.querySelector('#canvas_background'), ctx = canvas.getContext('2d');
		
		var mousedown = false;
		var trigger = true;
		var w = 145, h = 35;
		
		//中奖文字信息
		var winInfo = "谢谢参与";
		ctx_score.font = 'Normal 60px 宋体';
		ctx_score.fillStyle = '#000000';
		ctx_score.fillText(winInfo, 30, 90);
		
		//添加灰色刮层
		ctx.fillStyle = 'gray';
		ctx.fillRect(0, 0, 145, 35);
		
		// 在已有内容和新图形不重叠的地方,已有内容保留,所有其他内容成为透明。
		ctx.globalCompositeOperation = 'destination-out';
		// 处理“鼠标”或“手指”按下时的动作。
		function eventDown(e){
			// 通知浏览器不要执行与事件关联的默认动作。
			e.preventDefault();
			
			// 得到中奖图片的像素数据(像素计算非常耗费CPU和内存,可能会导致浏览器崩溃)。
			var data = ctx.getImageData(0, 10, w, h).data;
			// 通过计算每一个像素,得知还有多少“遮挡区域”。
			for (var i = 0, j = 0; i < data.length; i += 4) {
				if (data[i] && data[i + 1] && data[i + 2] && data[i + 3]) {
					j++;
				}
			}
			// 存在遮挡区域时才触发刮奖事件。
			if (j <= 0) {
				trigger = false;
			}
			mousedown = true;
		}
		// 处理“鼠标”或“手指”按下后移动时的动作。
		function eventMove(e){
			e.preventDefault();
			if (mousedown) {
				// 如果存在涉及当前事件的手指的一个列表(这里是指正在移动中的手指)。
				if (e.changedTouches){
					// 取得涉及当前事件中众多手指中的最后一个。
					e = e.changedTouches[e.changedTouches.length - 1];
				}
				
				// 计算当前“鼠标”或“手指”在canvas中的坐标(注意,计算的坐标是canvas里的坐标)。
				var x = (e.clientX + document.body.scrollLeft || e.pageX) - canvas.offsetLeft || 0,
					y = (e.clientY + document.body.scrollTop || e.pageY) - canvas.offsetTop || 0;

				with (ctx) {
					beginPath();
					arc(x, y, 10, 0, Math.PI * 2);
					fill();
				}
			}
		}
		// 处理“鼠标”或“手指”按下后抬起时的动作。
		function eventUp(e){
			e.preventDefault();
			mousedown = false;
			if(trigger){
				// 得到中奖图片的像素数据(像素计算非常耗费CPU和内存,可能会导致浏览器崩溃)。
				var data = ctx.getImageData(0, 10, w, h).data;
				// 通过计算每一个像素,得知还有多少“遮挡区域”。
				for (var i = 0, j = 0; i < data.length; i += 4) {
					if (data[i] && data[i + 1] && data[i + 2] && data[i + 3]) {
						j++;
					}
				}
				// 当还只剩下20%的遮挡区域时弹出中奖信息,同时撤掉遮挡区域。
				if (j <= w * h * 0.35) {
					ctx.clearRect(0, 0, w, h);				
				}
			}
		}
		
		// 监听“触摸的开始、移动与抬起”事件。
		canvas.addEventListener('touchstart', eventDown);
		canvas.addEventListener('touchend', eventUp);
		canvas.addEventListener('touchmove', eventMove);
		// 监听“鼠标的开始、移动与抬起”事件。
		canvas.addEventListener('mousedown', eventDown);
		canvas.addEventListener('mouseup', eventUp);
		canvas.addEventListener('mousemove', eventMove);
	
	})(document.body.style);
		
</script>

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics