效果如下图所示:
实现代码如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>时钟</title> <style type="text/css"> div{ width: 500px; height: 500px; background-image: url(d_6.jpg); margin: 0 auto; border: 15px solid skyblue; } </style> </head> <body> <div> <canvas id="mycanvas" width="500px" height="500px"></canvas> </div> <script type="text/javascript"> //通过获取画布ID来获取画布对象 var canvas = document.getElementById('mycanvas'); //获取画布上下文对象context var cxt = canvas.getContext("2d"); //定义一个时钟方法 function drawClock(){ //每次清空画布的布局,使得时针旋转的足迹被清空,仅留下当前运动轨迹 cxt.clearRect(0,0,canvas.width,canvas.height); //定义时钟外圆边框 cxt.strokeStyle="pink"; //设置外圆边框颜色 cxt.lineWidth = 10; //设置外圆边框粗细 cxt.beginPath(); //开始绘制函数 cxt.arc(250,250,200,0*Math.PI/180,360*Math.PI/180,true); //绘制图形(0~360度) cxt.stroke(); //绘制空心圆函数 cxt.closePath(); //结束绘制函数 cxt.clip(); //裁剪圆形 //循环绘制12根时针刻度线 for(var i=0;i<12;i++){ cxt.save(); //保存当前状态,每次循环绘制的线均保存 cxt.lineWidth = 7; //设置时针刻度线的宽度 cxt.strokeStyle="red"; //设置时针刻度线的颜色 cxt.translate(250,250); //设置原点 cxt.rotate(30*i*Math.PI/180); //时针每小时转30度 cxt.beginPath(); cxt.moveTo(0,-175); //时针刻度线的起始点 cxt.lineTo(0,-195); //时针刻度线的经过点 cxt.stroke(); cxt.closePath(); cxt.restore(); //把原始状态恢复回来,保证每次循环起始位置是一致的,确保旋转后不会出错 } //循环绘制60根分针刻度线 for(var i=0;i<60;i++){ cxt.save(); cxt.lineWidth = 3; cxt.strokeStyle="red"; cxt.translate(250,250); cxt.rotate(6*i*Math.PI/180); //时针每小分钟转6度 cxt.beginPath(); cxt.moveTo(0,-185); cxt.lineTo(0,-195); cxt.stroke(); cxt.closePath(); cxt.restore(); } //获取系统时间 var now = new Date(); //获取时间对象 var sec = now.getSeconds(); //获取当前秒数 var min = now.getMinutes(); //获取当前分钟数 var hour = now.getHours(); //获取当前小时数 hour>12?hour-12:hour; //判断小时是否大于12小时,如果大于12小时,就执行hour-12,否则执行hour hour+=(min/60); //非整点时时针显示根据分针计算 // //绘制时针 cxt.save(); cxt.lineWidth = 7; cxt.strokeStyle="red"; cxt.translate(250,250); cxt.rotate(hour*30*Math.PI/180); //每小时旋转30度 cxt.beginPath(); cxt.moveTo(-0,-80); cxt.lineTo(0,10); cxt.stroke(); cxt.closePath(); cxt.restore(); //绘制分针 cxt.save(); cxt.lineWidth = 5; cxt.strokeStyle="pink"; cxt.translate(250,250); cxt.rotate(min*6*Math.PI/180); //每分钟旋转6度 cxt.beginPath(); cxt.moveTo(0,-110); cxt.lineTo(0,10); cxt.stroke(); cxt.closePath(); cxt.restore(); //绘制秒针 cxt.save(); cxt.lineWidth = 5; cxt.strokeStyle="#000"; cxt.translate(250,250); cxt.rotate(sec*6*Math.PI/180); //每分钟旋转6度 cxt.beginPath(); cxt.moveTo(0,-130); cxt.lineTo(0,10); cxt.stroke(); cxt.closePath(); cxt.restore(); } //调用时钟方法 drawClock(); //每秒调用一次时钟方法 setInterval(drawClock,1000); </script> </body> </html>