分别利用html+js和canvas绘制时钟

分别利用原生JS和画布画出时钟

1.原生JS绘制始终

思路:

1)body中构建好始终的静态DOM结构

2)CSS中设置好DOM结构的样式

3)js文件中设置DOM的运动样式

视图文件:

<div id="warp">
			<div class="clock">
				<!--钟表数字-->
				<div class="number">
					<div><span>1</span></div>
					<div><span>2</span></div>
					<div><span>3</span></div>
					<div><span>4</span></div>
					<div><span>5</span></div>
					<div><span>6</span></div>
					<div><span>7</span></div>
					<div><span>8</span></div>
					<div><span>9</span></div>
					<div><span>10</span></div>
					<div><span>11</span></div>
					<div><span>12</span></div>
				</div>
				<!--时针,分针,秒针-->
				<div id="hour"></div>
				<div id="minute"></div>
				<div id="seconds"></div>
				<div id="center"></div>
</div>

样式表文件:

* {
				margin: 0;
				padding: 0;
			}
			/*产生同心圆*/
			#warp {
				position: relative;
				width: 250px;
				height: 250px;
				margin: 20px auto;
				border-radius: 50%;
				background-image: -webkit-linear-gradient(top,#cee2e9,#777775);
			}
			#warp .clock {
				position: absolute;
				left: 10px;
				top: 10px;
				width: 230px;
				height: 230px;
				border-radius: 50%;
				background: #fff;
			}
			/*设置数字部分样式*/
			#warp .number {
				width: 100%;
				height: 100%;
				position: relative;
			}
			#warp .number div {
				position: absolute;
				left: 10px;
			    top: 112px;
			    width: 210px;
			    text-align: center;
			}
			#warp .number div span {
				display: block;
				width: 10px;
    				height: 22px;
			}
			/*设置时针样式*/
			#warp #hour {
				position: absolute;
				bottom: 110px;
				left: 114px;
				width: 6px;
				height: 80px;
				background: red;
				border-radius: 5px;
				transform-origin: 50% bottom;
			}
			/*设置分针样式*/
			#warp #minute {
				position: absolute;
				bottom: 110px;
				left: 115px;
				width: 4px;
				height: 90px;
				background: black;
				border-radius: 5px;
				transform-origin: 50% bottom;
			}
			/*设置秒针样式*/
			#warp #seconds {
				position: absolute;
				bottom: 110px;
				left: 116px;
				width: 2px;
				height: 110px;
				background: green;
				border-radius: 5px;
				transform-origin: 50% bottom;
			}
			/*设置时钟中心点*/
			#warp #center {
				position: absolute;
				left: 113px;
				bottom:106px ;
				width: 8px;
				height: 8px;
				border-radius: 50%;
				background: black;
	}

Js文件:

window.onload = function(){
//设置数字键
function number(){
		//获取number标签
		var num = document.getElementsByClassName("number")[0];
		var divs = num.getElementsByTagName("div");
		var spans = num.getElementsByTagName("span");
		//每个数字旋转30度
		for (var i = 0;i < divs.length; i ++){
			var deg = i*30 + 120;
			divs[i].style.transform = "rotate("+(deg)+"deg)";
			spans[i].style.transform = "rotate("+(-deg)+"deg)";
		}
};
number();
//设置旋转
function run(){
	setInterval(function(){
		var nowDate = new Date();//获取时间
		var nowHours = nowDate.getHours();//获取小时
		var nowMinutes = nowDate.getMinutes();//获取分钟
		var nowSeconds = nowDate.getSeconds();//获取秒数
		//获取指针
		var hours = document.getElementById("hour");
		var minutes = document.getElementById("minute");
		var secondes = document.getElementById("seconds");
		secondes.style.transform = "rotate("+nowSeconds*6+"deg)";
		minutes.style.transform = "rotate("+nowMinutes*6+"deg)";
		hours.style.transform = "rotate("+(nowHours*30+nowMinutes*6/360*30)+"deg)";//时的度数,加上分钟度数占360的百分比乘以30度等于当前时针的度数
	},1000)
}
run();
}

最终效果:

2.利用canvas绘制时钟

思路:

1)在画布上绘制出时钟轮廓和秒格和小时格,以及数字

2)分别计算时针、分针和秒针运动角度

3)将绘制视图函数和运动函数封装到时针函数,在计时器中调用,每间隔1s重置画布

代码如下:

<body>
		<canvas id="can1" width="800" height="800"></canvas>
		<script type="text/javascript">
			var can1 = document.getElementById("can1");
			var ctx = can1.getContext("2d");//获取画笔
			//重置画布函数
			function reSet(){
				can1.height = can1.height;//每次清除画布,然后变化后的时间补上
				ctx.translate(400, 400);//设置坐标轴
				ctx.save();//保存中点坐标1
			}
			//绘制中心圆和外圆
			function circle(){
				//外面大圆
				ctx.lineWidth = 3;
				ctx.beginPath();
				ctx.arc(0, 0, 320, 0, 2 * Math.PI, true);
				ctx.closePath();
				ctx.stroke();
				//中心园
				ctx.beginPath();
				ctx.arc(0, 0, 10, 0, 2 * Math.PI, true);
				ctx.closePath();
				ctx.stroke();
			}
			//绘制字体
			function num(){
				var R = 270;//设置文字距离时钟中心点距离
				ctx.font = "32px arial";//设置字体样式		
				ctx.textBaseline = "middle";//字体上下居中,绘制时间
				for(var i = 1; i < 13; i++) {
					//利用三角函数计算字体坐标表达式
					var x = R * Math.cos(i * Math.PI / 6 - Math.PI / 2);
					var y = R * Math.sin(i * Math.PI / 6 - Math.PI / 2);
					var len = ctx.measureText(i);
					ctx.fillText(i, x - len.width / 2, y);//绘制字体,x-len.width/2使字体居中
				}
			}
			//绘制小格
			function smallGrid(){
				ctx.rotate(-Math.PI/2);//时间从3点开始,倒转90度
				for(var i = 0; i < 60; i++) {
					ctx.beginPath();
					ctx.rotate(Math.PI / 30);
					ctx.moveTo(300, 0);
					ctx.lineTo(320, 0);
					ctx.stroke();
				}
			}
			//绘制大格
			function bigGrid(){
				for(var i = 0; i < 12; i++) {
					ctx.lineWidth = 8;
					ctx.beginPath();
					ctx.rotate(Math.PI / 6);
					ctx.moveTo(310, 0);
					ctx.lineTo(290, 0);
					ctx.stroke();
				}
			}
			//指针运动函数
			function move(){		
				var t = new Date();//获取当前时间	
				var h = t.getHours();//获取小时
				h = h>12?(h-12):h;//将24小时制转化为12小时制	
				var m = t.getMinutes();//获取分针		
				var s = t.getSeconds();//获取秒针			
				ctx.save();//再次保存2
				ctx.lineWidth = 8;
				//旋转角度=30度*(h+m/60+s/3600)
				//分针旋转角度=6度*(m+s/60)
				//秒针旋转角度=6度*s
				ctx.beginPath();
				//绘制时针
				ctx.rotate((Math.PI/6)*(h+m/60+s/3600));
				ctx.moveTo(-20,0);
				ctx.lineTo(150,0);
				ctx.stroke();
				ctx.restore();//恢复到2,(最初未旋转状态)避免旋转叠加
				ctx.save();//3
				//画分针
				ctx.lineWidth = 5;
				ctx.beginPath();
				ctx.rotate((Math.PI/30)*(m+s/60));
				ctx.moveTo(-20,0);
				ctx.lineTo(250,0);
				ctx.stroke();
				ctx.restore();//恢复到3,(最初未旋转状态)避免旋转叠加
				ctx.save();
				//绘制秒针
				ctx.lineWidth = 2;
				ctx.beginPath();
				ctx.rotate((Math.PI/30)*s);
				ctx.moveTo(-20,0);
				ctx.lineTo(270,0);
				ctx.stroke();
			}
			//定义时钟函数
			function clock() {	
				reSet();
				num();
				smallGrid();
				bigGrid();
				circle();
				move();			
			}		
			//设置定时器,每1秒执行一次时钟函数
			setInterval(clock,1000);
		</script>
</body>

最终效果:



  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值