<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>canvas 时钟转动</title> </head> <body> <!-- 实现思路: 1、找到canvas的中心,画出表盘 2、根据当前时间计算角度,画出时针,分针,秒针,和刻度 3、使用定时器,每过一秒获取新的时间,并重新绘图,达到时钟转动的效果 --> <canvas id="canvas" width="600" height="600"></canvas> <script> const canvas = document.getElementById('canvas'); const context = canvas.getContext('2d'); function drawClock() { context.save(); context.clearRect(0, 0, 600, 600); //每次更新视图的时候都要把上一次的画布清除,再开始画新的视图 context.translate(300,300); // 设置中心点,此时300,300变成了坐标的0,0 context.rotate(-Math.PI/2); //将坐标轴逆时针旋转90度,x轴正方向对准12点方向 context.save(); // 画表盘 context.beginPath(); context.arc(0, 0, 100, 0, 2 * Math.PI); context.stroke(); context.closePath(); // 时针刻度 context.lineWidth = 5; for(let i = 0; i < 12; i++) { context.rotate(2 * Math.PI / 12); context.beginPath(); context.moveTo(100, 0); context.lineTo(85,0); context.stroke(); context.closePath(); } context.restore(); context.save(); // 分针刻度 context.lineWidth = 1 for (let i = 0; i < 60; i++) { context.rotate(2 * Math.PI / 60); context.beginPath(); context.moveTo(100, 0); context.lineTo(90, 0); context.stroke(); context.closePath(); } context.restore(); context.save(); // 获取当前 时,分,秒 let time = new Date(); let hour = time.getHours() % 12; //将24小时转换为12小时 let min = time.getMinutes(); let sec = time.getSeconds(); // 时针 context.lineWidth = 5; context.rotate(2 * Math.PI / 12 * hour + 2 * Math.PI / 12 * (min / 60)); context.beginPath(); context.moveTo(0, 0); context.lineTo(50, 0); context.stroke(); context.closePath(); context.restore(); // 恢复成上一次save的状态 context.save(); // 恢复完再保存一次 //分针 context.lineWidth = 3; context.rotate(2 * Math.PI / 60 * min + 2 * Math.PI / 60 * (sec / 60)); context.beginPath(); context.moveTo(0, 0); context.lineTo(70, 0); context.stroke(); context.closePath(); context.restore(); context.save(); //秒针 context.lineWidth = 1; context.rotate(2 * Math.PI / 60 * sec); context.beginPath(); context.moveTo(0, 0); context.lineTo(90, 0); context.stroke(); context.closePath(); context.restore(); context.restore(); } //使用setinterval();让时钟动起来 setInterval(drawClock,1000); </script> </body> </html>