MDN--canvas--动态时钟

效果图:
在这里插入图片描述

这里主要讲一下时针旋转角度的处理
时钟上有12个小时,那么每过一个小时,需要旋转时针360/12=30度,即rotate(30Math.PI/180)
但是这样时针的问题是只有在下一个小时的瞬间才会转动,而不会随着时间的流逝转动,因此加上每过一分钟和一秒钟需要转动的时针的度数
1.对于分钟的情况,1h=60min
现在一小时所占的弧度是30
Math.PI/180,那么一分钟在一小时内所占的弧度为(30Math.PI/180)/60
2. 同理对于秒的情况,1h=3600s 那么一秒钟在一小时内所占的弧度为(30
Math.PI/180)/3600

代码如下:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<canvas id="canvas" width="200" height="200"></canvas>
		<script type="text/javascript">
			var ctx = document.querySelector('#canvas').getContext('2d');
			function clock(){
				ctx.clearRect(0,0,200,200);
				ctx.save();
				ctx.translate(100,100);
				
				ctx.beginPath();
				ctx.save();
				var rad1 = ctx.createLinearGradient(-100,0,100,0);
				rad1.addColorStop(0,'#fff');
				rad1.addColorStop(1,'#000');
				ctx.fillStyle = rad1;
				ctx.arc(0,0,100,0,Math.PI*2,true);
				ctx.fill();
				ctx.restore();
				
				ctx.beginPath();
				ctx.save();
				var rad2 = ctx.createLinearGradient(-90,0,90,0);
				rad2.addColorStop(0,'#000');
				rad2.addColorStop(1,'#39452D');
				ctx.fillStyle = rad2;
				ctx.arc(0,0,90,0,2*Math.PI,true);
				ctx.fill();
				ctx.restore();
				
				ctx.beginPath();
				ctx.save();
				var rad2 = ctx.createLinearGradient(-83,0,83,0);
				rad2.addColorStop(0,'#E17101');
				rad2.addColorStop(1,'#FFF507');
				ctx.fillStyle = rad2;
				ctx.arc(0,0,83,0,2*Math.PI,true);
				ctx.fill();
				ctx.restore();
				
				// 画大刻度
				ctx.save();
				ctx.beginPath();
				for(var i = 0; i < 12; i++){
					// i * 30 * Math.PI/180
					ctx.rotate(Math.PI/6);
					ctx.moveTo(0,-80);
					ctx.lineTo(0,-70);
					ctx.stroke();
				}
				// 画小刻度
				for(var i = 0; i < 60;i++){
					if(i%5 !== 0){
						ctx.moveTo(0,-80);
						ctx.lineTo(0,-76);
						ctx.stroke();
					}
					ctx.rotate(Math.PI/30);
				}
				ctx.restore();
				
				// 画数字
				ctx.save();
				ctx.beginPath();
				ctx.font = '17px Arial';
				ctx.textAlign = 'center';
				ctx.textBaseline = 'middle';
				var r = 60;
				for(var i = 0 ; i < 12; i++){
					ctx.fillText(i+1,r*Math.sin((i+1)*(Math.PI/6)),-r*Math.cos((i+1)*(Math.PI/6)));
					
				}
				ctx.restore();
				
				// 画指针
				ctx.save();
				ctx.beginPath();
				ctx.lineCap = 'round';
				var time = new Date();
				// 时针
				ctx.save()
				ctx.lineWidth = 10;
				var h = time.getHours() > 12 ? time.getHours() - 12 : time.getHours();
				// 			差0~30度 	差0~0.5 
				ctx.rotate(h*Math.PI/6+ time.getMinutes()*Math.PI/360 + time.getSeconds()*Math.PI/(180*120));
				ctx.moveTo(0,10);
				ctx.lineTo(0,-40);
				ctx.stroke();
				ctx.restore();
				// 分针
				ctx.save();
				ctx.lineWidth = 5;
				ctx.rotate(time.getMinutes()*Math.PI/30 + time.getSeconds()*Math.PI/1800);
				ctx.moveTo(0,15);
				ctx.lineTo(0,-55);
				ctx.stroke();
				ctx.restore();
				// 秒针
				ctx.save();
				ctx.lineWidth = 3;
				ctx.rotate(time.getSeconds()*Math.PI/30);
				ctx.moveTo(0,30);
				ctx.lineTo(0,-65);
				ctx.stroke();
				ctx.restore();
				ctx.restore();
				
				// 指针中心
				ctx.save();
				ctx.beginPath();
				ctx.fillStyle = '#f00';
				ctx.arc(0,0,5,0,2*Math.PI,true);
				ctx.fill();
				ctx.restore();
				
				ctx.restore();
				window.requestAnimationFrame(clock);
			}
			
			window.requestAnimationFrame(clock);
		</script>
	</body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值