用canvas来实现动态时钟

之前用简单的css与js来实现动态的时钟,发现直接用canvas也可以画时钟,只不过时钟圈和指针应该要放在不同的画布canvas中比较好,因为指针所在的画布是要一直旋转的,详细代码如下(如有问题,望大家指出,一起进步哈!)

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>时钟(canvas)</title>
</head>
<body>
	<canvas class="ctx" width="300" height="300" style="border:1px solid red;position: absolute;top: 0;left:0;"></canvas>
	<canvas class="dial" width="300" height="300" style="border:1px solid red;position: absolute;top: 0;left:0;"></canvas>
	

	<script type="text/javascript">
		var canvas=document.querySelector('.ctx');
		var ctx=canvas.getContext('2d');
		ctx.translate(150,150);  //将画布坐标移到中间去
//画圆形
		ctx.beginPath();
		ctx.arc(0,0,100,0,2*Math.PI,true);
		ctx.closePath();
		ctx.strokeStyle='#FF7F24';
		ctx.lineWidth=3;
		ctx.stroke();

//画表盘的12个刻度
		for(var i=0;i<12;i++){
			ctx.save();   //保存当前的绘图状态;
			ctx.rotate(i*Math.PI/6); //一般都是以坐标(0,0)点旋转,因此在此之前要把坐标移到中间去
			ctx.moveTo(0,100);  //移动结束点到表盘6点处
			ctx.lineTo(0,90);  //画长度为10的刻度
			ctx.stroke();
			ctx.restore();  //恢复之前的绘图状态
		};
//画表盘每个刻度上的时刻数字,但是有个小问题,旋转之后数字也会旋转甚至倒立,该怎么处理呢???
		var Numbers=[6,7,8,9,10,11,12,1,2,3,4,5];
		for(var i=0;i<Numbers.length;i++){
			ctx.save();
			ctx.rotate(i*Math.PI/6);
			ctx.font='bold 12px 宋体';
			ctx.textBaseline='bottom';
			ctx.fillText(Numbers[i],-3,85);
			ctx.restore();
		}

//画时分秒针,因为时分秒要通过每隔一秒旋转来转动,所以要save保存当前状态,在restore恢复之前状态再去画其他的针
	// //画时针
		// ctx.save()
		// ctx.beginPath();
		// ctx.moveTo(-1,2);
		// ctx.lineTo(40,0);
		// ctx.lineTo(-1,-2);
		// ctx.lineTo(-1,2);
		// ctx.fillstyle='black';
		// ctx.fill();
		// ctx.closePath();	
		// ctx.restore();
	// //画分钟
		// ctx.save()
		// ctx.beginPath();
		// ctx.moveTo(-1,2);
		// ctx.lineTo(55,0);
		// ctx.lineTo(-1,-2);
		// ctx.lineTo(-1,2);
		// ctx.fill();
		// ctx.closePath();
		// ctx.restore();
	// //秒针
		// ctx.save()
		// ctx.beginPath();
		// ctx.moveTo(-2,2);
		// ctx.lineTo(80,0);
		// ctx.lineTo(-2,-2);
		// ctx.lineTo(-2,2);
		// ctx.fill();
		// ctx.closePath();
		// ctx.restore();

		//获得画时分秒的画布,对于指针和圆圈不能使用同一个canvas,使用两个canvas性能也会提高不少
		var dial=document.querySelector('.dial');  
		var dial_ctx=dial.getContext('2d');
		dial_ctx.translate(150,150);  //同样要把坐标移到中间去
		//封装一下
		function Move(context){
			context.clearRect(-150,-150,300,300); //先清除当前的绘图再旋转画针

			var nowTime=new Date();
			var h=nowTime.getHours(),
				m=nowTime.getMinutes(),
				s=nowTime.getSeconds();


			//画时针
			context.save();
			context.beginPath();
			context.rotate((2*Math.PI/12)*h+(2*Math.PI/12)*(m/60)-Math.PI/2);
			context.moveTo(-1,2);
			context.lineTo(35,0);
			context.lineTo(-1,-2);
			context.lineTo(-1,2);
			context.fillstyle='black';
			context.fill();
			context.closePath();	
			context.restore();

			//画分钟
			context.save();
			context.beginPath();
			context.rotate((2*Math.PI/60)*m-Math.PI/2);  //因为坐标系的问题要减去一个Π/2
			context.moveTo(-1,2);
			context.lineTo(55,0);
			context.lineTo(-1,-2);
			context.lineTo(-1,2);
			context.fill();
			context.closePath();
			context.restore();

			//秒针
			context.save()
			context.beginPath();
			context.rotate((2*Math.PI/60)*s-Math.PI/2);
			context.moveTo(-2,2);
			context.lineTo(80,0);
			context.lineTo(-2,-2);
			context.lineTo(-2,2);
			context.fill();
			context.closePath();
			context.restore();
		}

	//通过一个计时器来实现动画
		var timer=setInterval(function(){
			Move(dial_ctx);
			console.log('1')
		},1000)
	</script>
</body>
</html>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值