Canvas绘制时钟

Canvas绘制时钟步骤如下:

  1. 首先绘制时钟的背景,包括小时数已经代表分钟的点。

 

 

	<style type="text/css">
	  div {
	    text-align: center;
	    margin-top: 150px;
	  }

	  #can {
	    border: 1px solid black;
	  }
	</style>
</head>
<body>
	<div>
	  <canvas id="can" width="200px" height="200px"></canvas>
	</div>
	<script type="text/javascript">
		var canvas = document.getElementById("can");
		var ctx = canvas.getContext("2d");
		var width = canvas.width;
		var height = canvas.height;
		var r = width / 2;

		//绘制时钟背景
		function drawBackground() {
		  ctx.translate(r, r);

		  //绘制时钟圆圈
		  ctx.beginPath();
		  ctx.arc(0, 0, r - 5, 0, Math.PI*2);
		  ctx.lineWidth = 10;
		  ctx.stroke();
          //绘制小时数
          var num = [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2];
          ctx.font = "18px Arial";
          ctx.textAlign = "center";
          ctx.textBaseline = "middle";
          num.forEach(function(number, i) {
            var rad = (Math.PI * 2 / 12) * i;
            var x = Math.cos(rad) * (r - 30);
            var y = Math.sin(rad) * (r - 30);
            ctx.fillText(number, x, y);
          });
 	      //绘制分钟圆点
 		  for(let i = 0; i < 60; i++) {
 			var rad = (Math.PI * 2 / 60) * i;
 			var x = Math.cos(rad) * (r - 18);
 			var y = Math.sin(rad) * (r - 18);
 			ctx.beginPath();
 			ctx.arc(x, y, 2, 0, Math.PI * 2);
 			if (i % 5 === 0) {
 			  ctx.fillStyle = "#000";
 			} else {
 			  ctx.fillStyle = "#ccc";
 			}
 			  ctx.fill(); 
 			}

		}

		drawBackground();
	</script>
</body>

效果图:

 


2.绘制时针、分针、秒针,技巧是先让针指向十二点,然后通过旋转弧度来调整。

		//时针
		function drawHour(hour) {
			ctx.save();
			ctx.beginPath();
			ctx.moveTo(0, 10);
			ctx.lineTo(0, -r / 2);
			ctx.lineWidth = 6;
			ctx.lineCap = "round";
			ctx.stroke();
			ctx.restore();
		}

		drawBackground();
		drawHour(4);

先让它固定在12点,然后通过传入的hour计算弧度即可

		//时针
		function drawHour(hour) {
			ctx.save();
			var rad = (Math.PI * 2 / 12) * hour;
			ctx.rotate(rad);
			ctx.beginPath();
			ctx.moveTo(0, 10);
			ctx.lineTo(0, -r / 2);
			ctx.lineWidth = 6;
			ctx.lineCap = "round";
			ctx.stroke();
			ctx.restore();
		}

		drawBackground();
		drawHour(4);

效果图:

同理,分针和秒针的函数如下:

		//时针
		function drawHour(hour, minute) {
			ctx.save();
			var rad = (Math.PI * 2 / 12) * hour;
			//时针需要随着分针的转动而转动相应的角度
			var minuteRad = (Math.PI * 2 / 12 / 60) * minute;
			ctx.rotate(rad + minuteRad);
			ctx.beginPath();
			ctx.moveTo(0, 10);
			ctx.lineTo(0, -r / 2);
			ctx.lineWidth = 6;
			ctx.lineCap = "round";
			ctx.stroke();
			ctx.restore();
		}

		//分针
		function drawMinute(minute) {
			ctx.save();
			var rad = (Math.PI * 2 / 60) * minute;
			ctx.rotate(rad);
			ctx.beginPath();
			ctx.moveTo(0, 10);
			ctx.lineTo(0, -r + 30);
			ctx.lineWidth = 3;
			ctx.lineCap = "round";
			ctx.stroke();
			ctx.restore();
		}

		//秒针
		function drawSeconds(seconds) {
			ctx.save();
			var rad = (Math.PI * 2 / 60) * seconds;
			ctx.rotate(rad);
			ctx.beginPath();
			ctx.moveTo(2, 20);
			ctx.lineTo(-2, 20);
			ctx.lineTo(-1, -r + 18);
			ctx.lineTo(1, -r + 18);
			ctx.fillStyle = "red";
			ctx.fill();
		}
		drawBackground();
		drawHour(4, 30);
		drawMinute(30);
		drawSeconds(20);

效果图:


3.绘制时钟中心圆点

		//中心圆点
		function drawDot() {
			ctx.save();
			ctx.beginPath();
			ctx.arc(0, 0, 3, 0, Math.PI * 2);
			ctx.fillStyle = "#fff";
			ctx.fill();
			ctx.restore();
		}
		drawBackground();
		drawHour(4, 30);
		drawMinute(30);
		drawSeconds(40);
		drawDot();

效果图:


4.最后就是将时间作为参数传入

		//动态时间函数

		function drawTime() {
			var now = new Date();
			var hour = now.getHours();
			var minute = now.getMinutes();
			var seconds = now.getSeconds();
			drawBackground();
			drawHour(hour, minute);
			drawMinute(minute);
			drawSeconds(seconds);
			drawDot();
			ctx.restore();
		}
		drawTime();
		setInterval(drawTime, 1000);

效果图:

 


最终函数:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<style type="text/css">
	  div {
	    text-align: center;
	    margin-top: 150px;
	  }

	  #can {
	    border: 1px solid black;
	  }
	</style>
</head>
<body>
	<div>
	  <canvas id="can" width="200px" height="200px"></canvas>
	</div>
	<script type="text/javascript">
		var canvas = document.getElementById("can");
		var ctx = canvas.getContext("2d");
		var width = canvas.width;
		var height = canvas.height;
		var r = width / 2;

		//绘制时钟背景
		function drawBackground() {
			ctx.save();
			ctx.clearRect(0, 0, width, height);
		  ctx.translate(r, r);
		  //绘制时钟圆圈
		  ctx.beginPath();
		  ctx.arc(0, 0, r - 5, 0, Math.PI*2);
		  ctx.lineWidth = 10;
		  ctx.stroke();
      //绘制小时数
      var num = [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2];
      ctx.font = "18px Arial";
      ctx.textAlign = "center";
      ctx.textBaseline = "middle";
      num.forEach(function(number, i) {
        var rad = (Math.PI * 2 / 12) * i;
        var x = Math.cos(rad) * (r - 30);
        var y = Math.sin(rad) * (r - 30);
        ctx.fillText(number, x, y);
      });
 			//绘制分钟圆点
 			for(let i = 0; i < 60; i++) {
 			  var rad = (Math.PI * 2 / 60) * i;
 			  var x = Math.cos(rad) * (r - 18);
 			  var y = Math.sin(rad) * (r - 18);
 			  ctx.beginPath();
 			  ctx.arc(x, y, 2, 0, Math.PI * 2);
 			  if (i % 5 === 0) {
 			  	ctx.fillStyle = "#000";
 			  } else {
 			    ctx.fillStyle = "#ccc";
 			  }
 			  ctx.fill(); 
 			}
		}

		//时针
		function drawHour(hour, minute) {
			ctx.save();
			var rad = (Math.PI * 2 / 12) * hour;
			//时针需要随着分针的转动而转动相应的角度
			var minuteRad = (Math.PI * 2 / 12 / 60) * minute;
			ctx.rotate(rad + minuteRad);
			ctx.beginPath();
			ctx.moveTo(0, 10);
			ctx.lineTo(0, -r / 2);
			ctx.lineWidth = 6;
			ctx.lineCap = "round";
			ctx.stroke();
			ctx.restore();
		}

		//分针
		function drawMinute(minute) {
			ctx.save();
			var rad = (Math.PI * 2 / 60) * minute;
			ctx.rotate(rad);
			ctx.beginPath();
			ctx.moveTo(0, 10);
			ctx.lineTo(0, -r + 30);
			ctx.lineWidth = 3;
			ctx.lineCap = "round";
			ctx.stroke();
			ctx.restore();
		}

		//秒针
		function drawSeconds(seconds) {
			ctx.save();
			var rad = (Math.PI * 2 / 60) * seconds;
			ctx.rotate(rad);
			ctx.beginPath();
			ctx.moveTo(2, 20);
			ctx.lineTo(-2, 20);
			ctx.lineTo(-1, -r + 18);
			ctx.lineTo(1, -r + 18);
			ctx.fillStyle = "red";
			ctx.fill();
			ctx.restore();
		}

		//中心圆点
		function drawDot() {
			ctx.save();
			ctx.beginPath();
			ctx.arc(0, 0, 3, 0, Math.PI * 2);
			ctx.fillStyle = "#fff";
			ctx.fill();
			ctx.restore();
		}

		//动态时间函数

		function drawTime() {
			var now = new Date();
			var hour = now.getHours();
			var minute = now.getMinutes();
			var seconds = now.getSeconds();
			drawBackground();
			drawHour(hour, minute);
			drawMinute(minute);
			drawSeconds(seconds);
			drawDot();
			ctx.restore();
		}
		drawTime();
		setInterval(drawTime, 1000);
	</script>
</body>
</html>

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值