【canvas 动态时钟】

  • 画一个动态时钟,显示 当前时间
<!DOCTYPE html>
<html>
	<body>
	
		<canvas id="canvas" width="350" height="350" style="border:1px solid">
		Your browser does not support the canvas element.
		</canvas>
		
		<script type="text/javascript">
			  function clock(){
			  var now = new Date();//创建一个时间对象
			  var ctx = document.getElementById('canvas').getContext('2d');
			  ctx.save();//保存状态 栈1
			  ctx.clearRect(0,0,350,350); //清空画布
			  //ctx.scale(0.4,0.4);缩小整个图形,根据需要使用
			 
			  ctx.translate(180,180);//移动原点 到(180,180)
			  ctx.rotate(-Math.PI/2);//逆时针旋转90°
			  ctx.strokeStyle = "black";//绘线颜色,黑色
			  ctx.fillStyle = "white";//填充颜色白色
			  ctx.lineWidth = 5;//线宽 5
			  ctx.lineCap = "square";//线帽为正方形
			  ctx.save();//保存状态,栈2 原点为(180,180)
			
			  // 12个表示小时的线段 Hour marks
			  for (var i=0;i<12;i++){
			    ctx.beginPath();//新建路径
			    ctx.rotate(Math.PI/6);//顺时针旋转30°
			    ctx.moveTo(100,0);//起始点
			    ctx.lineTo(120,0);//终点
			    ctx.stroke();//绘线
			  }
			  
			  // (60-12)=48个 表示分针的线段 Minute marks
			  ctx.restore();//恢复状态,当前状态 = 状态2 = 原点=(180,180)
			  ctx.save();//保存状态2=栈2
			  ctx.lineWidth = 5;
			  
			  for (i=0;i<60;i++){
			    if (i%5!=0) {//当i对5的余数,不为0时,5的倍数,余数为0时,正好是12个时针的位置,不需要画了,不加这一句,效果也区别不大
			      ctx.beginPath();
			      ctx.moveTo(117,0);
			      ctx.lineTo(120,0);
			      ctx.stroke();
			    }
			    ctx.rotate(Math.PI/30);
			  }
			  ctx.restore();//恢复状态
			 
			  var sec = now.getSeconds();//获得当前时间的秒
			  var min = now.getMinutes();//获得当前时间的分
			  var hr  = now.getHours();//获得当前时间的小时
			  hr = hr>=12 ? hr-12 : hr;//三目运算符,hr >=12 ?是否成立 成立执行后面的 hr-12 不成立 执行:后面的hr 再把值赋给 hr;运算符的优先级  先执行三目 在赋值给hr
			
			  ctx.fillStyle = "black";
			
			  // 时针转动 write Hours
			  ctx.save();
			  ctx.rotate( hr*(Math.PI/6) + (Math.PI/360)*min + (Math.PI/21600)*sec )
			  ctx.lineWidth = 14;
			  ctx.beginPath();
			  ctx.moveTo(-20,0);
			  ctx.lineTo(80,0);
			  ctx.stroke();
			  ctx.restore();
			
			  // 分针转动 write Minutes
			  ctx.save();
			  ctx.rotate( (Math.PI/30)*min + (Math.PI/1800)*sec )
			  ctx.lineWidth = 10;
			  ctx.beginPath();
			  ctx.moveTo(-28,0);
			  ctx.lineTo(112,0);
			  ctx.stroke();
			  ctx.restore();
			 
			  // 秒针转动Write seconds
			  ctx.save();
			  ctx.rotate(sec * Math.PI/30);
			  ctx.strokeStyle = "#D40000";
			  ctx.fillStyle = "#D40000";
			  ctx.lineWidth = 6;
			  
			  ctx.beginPath();
			  ctx.moveTo(-30,0);
			  ctx.lineTo(83,0);
			  ctx.stroke();
			  
			  ctx.beginPath();
			  ctx.arc(0,0,10,0,Math.PI*2,true);
			  ctx.fill();
			  
			  ctx.beginPath();
			  ctx.arc(95,0,10,0,Math.PI*2,true);
			  ctx.stroke();
			  
			  ctx.fillStyle = "rgba(0,0,0,0)";
			  ctx.arc(0,0,3,0,Math.PI*2,true);
			  ctx.fill();
			  ctx.restore();
			
			  ctx.beginPath();
			  ctx.lineWidth = 14;
			  ctx.strokeStyle = '#325FA2';
			  ctx.arc(0,0,142,0,Math.PI*2,true);
			  ctx.stroke();
			
			  ctx.restore();
			
			  window.requestAnimationFrame(clock);
			}
			
			window.requestAnimationFrame(clock);
		</script>
	
	</body>
</html>

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值