用canvas实现钟表展示当前时间

结构

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<canvas id="canvas" width="600" height="400"></canvas>
	</body>
</html>

js

		let canvas = document.getElementById('canvas');
		canvas.style.border = '1px solid #000';
		canvas.style.display = 'block';
		canvas.style.margin = '50px auto';
		let cvs = canvas.getContext('2d');
		play();
		cvs.save();
		//开始创建钟表
		function play() {
			cvs.clearRect(0, 0, canvas.width, canvas.height);
			cvs.save();
			cvs.translate(300, 200);
			text();
			cvs.rotate(-90 * Math.PI / 180);
			yuan();
			move();
			cvs.restore();
			requestAnimationFrame(play);
		}
		//画圆
		function yuan() {
			cvs.beginPath();
			cvs.lineWidth = 12;
			cvs.arc(0, 0, 180, 0 * Math.PI / 180, 360 * Math.PI / 180);
			cvs.strokeStyle = '#111';
			cvs.stroke();
			for (let i = 0; i < 60; i++) {
				cvs.rotate(2 * Math.PI / 60);
				cvs.beginPath();
				cvs.lineCap = 'round';
				cvs.lineWidth = 4;
				cvs.strokeStyle = '#ccc'
				cvs.moveTo(170, 0);
				cvs.lineTo(158, 0)
				cvs.stroke();
			}
			for (let i = 0; i < 12; i++) {
				cvs.rotate(2 * Math.PI / 12);
				cvs.beginPath();
				cvs.lineCap = 'round';
				cvs.lineWidth = 3;
				cvs.strokeStyle = '#E43141'
				cvs.moveTo(170, 0);
				cvs.lineTo(153, 0)
				cvs.stroke();
			}
		}
		//运动之前先清除(覆盖)上一次的canvas样式
		function move() {
			let d = new Date(),
				m = d.getSeconds(),
				f = d.getMinutes(),
				s = d.getHours();
			cvs.save();
			cvs.save();
			cvs.save();
			cvs.beginPath();
			cvs.rotate((m * 6) * Math.PI / 180);
			cvs.moveTo(137, 0);
			cvs.lineTo(-30, 0);
			cvs.lineWidth = 4;
			cvs.strokeStyle = '#ccc';
			cvs.stroke();
			cvs.restore();
			cvs.beginPath();
			cvs.rotate(((f+m/60) * 6) * Math.PI / 180);
			cvs.moveTo(105, 0);
			cvs.lineTo(-30, 0);
			cvs.lineWidth = 4;
			cvs.strokeStyle = '#000';
			cvs.stroke();
			cvs.restore();
			let num = f / 60;
			cvs.beginPath();
			cvs.rotate(((s + num) * 30) * Math.PI / 180);
			cvs.moveTo(90, 0);
			cvs.lineTo(-30, 0);
			cvs.lineWidth = 4;
			cvs.strokeStyle = '#E43141';
			cvs.stroke();
			cvs.restore();
			cvs.beginPath();
			cvs.fillStyle = '#fff';
			cvs.arc(0, 0, 8, 0 * Math.PI / 180, 360 * Math.PI / 180);
			cvs.fill();
			cvs.beginPath();
			cvs.fillStyle = '#000';
			cvs.arc(0, 0, 3, 0 * Math.PI / 180, 360 * Math.PI / 180);
			cvs.fill();
			cvs.restore();
		}
		/*创建当前时间文本*/
		function text(){
			for(let i=0;i<12;i++){
				let arrtext=[3,4,5,6,7,8,9,10,11,12,1,2];
				cvs.beginPath();
				cvs.font = '20px 楷体';
				cvs.fillStyle = '#E43141';
				cvs.textAlign='center';
				cvs.textBaseline = 'middle';
				let x=Math.cos(i*30*Math.PI/180)*146;
				let y=Math.sin(i*30*Math.PI/180)*135;
				cvs.fillText(arrtext[i],x,y);
				cvs.stroke();
			}
		}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值