Canvas绘制时钟步骤如下:
- 首先绘制时钟的背景,包括小时数已经代表分钟的点。
<style type="text/css">
div {
text-align: center;
margin-top: 150px;
}
#can {
border: 1px solid black;
}
</style>
</head>
<body>
<div>
<canvas id="can" width="200px" height="200px"></canvas>
</div>
<script type="text/javascript">
var canvas = document.getElementById("can");
var ctx = canvas.getContext("2d");
var width = canvas.width;
var height = canvas.height;
var r = width / 2;
//绘制时钟背景
function drawBackground() {
ctx.translate(r, r);
//绘制时钟圆圈
ctx.beginPath();
ctx.arc(0, 0, r - 5, 0, Math.PI*2);
ctx.lineWidth = 10;
ctx.stroke();
//绘制小时数
var num = [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2];
ctx.font = "18px Arial";
ctx.textAlign = "center";
ctx.textBaseline = "middle";
num.forEach(function(number, i) {
var rad = (Math.PI * 2 / 12) * i;
var x = Math.cos(rad) * (r - 30);
var y = Math.sin(rad) * (r - 30);
ctx.fillText(number, x, y);
});
//绘制分钟圆点
for(let i = 0; i < 60; i++) {
var rad = (Math.PI * 2 / 60) * i;
var x = Math.cos(rad) * (r - 18);
var y = Math.sin(rad) * (r - 18);
ctx.beginPath();
ctx.arc(x, y, 2, 0, Math.PI * 2);
if (i % 5 === 0) {
ctx.fillStyle = "#000";
} else {
ctx.fillStyle = "#ccc";
}
ctx.fill();
}
}
drawBackground();
</script>
</body>
效果图:
2.绘制时针、分针、秒针,技巧是先让针指向十二点,然后通过旋转弧度来调整。
//时针
function drawHour(hour) {
ctx.save();
ctx.beginPath();
ctx.moveTo(0, 10);
ctx.lineTo(0, -r / 2);
ctx.lineWidth = 6;
ctx.lineCap = "round";
ctx.stroke();
ctx.restore();
}
drawBackground();
drawHour(4);
先让它固定在12点,然后通过传入的hour计算弧度即可
//时针
function drawHour(hour) {
ctx.save();
var rad = (Math.PI * 2 / 12) * hour;
ctx.rotate(rad);
ctx.beginPath();
ctx.moveTo(0, 10);
ctx.lineTo(0, -r / 2);
ctx.lineWidth = 6;
ctx.lineCap = "round";
ctx.stroke();
ctx.restore();
}
drawBackground();
drawHour(4);
效果图:
同理,分针和秒针的函数如下:
//时针
function drawHour(hour, minute) {
ctx.save();
var rad = (Math.PI * 2 / 12) * hour;
//时针需要随着分针的转动而转动相应的角度
var minuteRad = (Math.PI * 2 / 12 / 60) * minute;
ctx.rotate(rad + minuteRad);
ctx.beginPath();
ctx.moveTo(0, 10);
ctx.lineTo(0, -r / 2);
ctx.lineWidth = 6;
ctx.lineCap = "round";
ctx.stroke();
ctx.restore();
}
//分针
function drawMinute(minute) {
ctx.save();
var rad = (Math.PI * 2 / 60) * minute;
ctx.rotate(rad);
ctx.beginPath();
ctx.moveTo(0, 10);
ctx.lineTo(0, -r + 30);
ctx.lineWidth = 3;
ctx.lineCap = "round";
ctx.stroke();
ctx.restore();
}
//秒针
function drawSeconds(seconds) {
ctx.save();
var rad = (Math.PI * 2 / 60) * seconds;
ctx.rotate(rad);
ctx.beginPath();
ctx.moveTo(2, 20);
ctx.lineTo(-2, 20);
ctx.lineTo(-1, -r + 18);
ctx.lineTo(1, -r + 18);
ctx.fillStyle = "red";
ctx.fill();
}
drawBackground();
drawHour(4, 30);
drawMinute(30);
drawSeconds(20);
效果图:
3.绘制时钟中心圆点
//中心圆点
function drawDot() {
ctx.save();
ctx.beginPath();
ctx.arc(0, 0, 3, 0, Math.PI * 2);
ctx.fillStyle = "#fff";
ctx.fill();
ctx.restore();
}
drawBackground();
drawHour(4, 30);
drawMinute(30);
drawSeconds(40);
drawDot();
效果图:
4.最后就是将时间作为参数传入
//动态时间函数
function drawTime() {
var now = new Date();
var hour = now.getHours();
var minute = now.getMinutes();
var seconds = now.getSeconds();
drawBackground();
drawHour(hour, minute);
drawMinute(minute);
drawSeconds(seconds);
drawDot();
ctx.restore();
}
drawTime();
setInterval(drawTime, 1000);
效果图:
最终函数:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style type="text/css">
div {
text-align: center;
margin-top: 150px;
}
#can {
border: 1px solid black;
}
</style>
</head>
<body>
<div>
<canvas id="can" width="200px" height="200px"></canvas>
</div>
<script type="text/javascript">
var canvas = document.getElementById("can");
var ctx = canvas.getContext("2d");
var width = canvas.width;
var height = canvas.height;
var r = width / 2;
//绘制时钟背景
function drawBackground() {
ctx.save();
ctx.clearRect(0, 0, width, height);
ctx.translate(r, r);
//绘制时钟圆圈
ctx.beginPath();
ctx.arc(0, 0, r - 5, 0, Math.PI*2);
ctx.lineWidth = 10;
ctx.stroke();
//绘制小时数
var num = [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2];
ctx.font = "18px Arial";
ctx.textAlign = "center";
ctx.textBaseline = "middle";
num.forEach(function(number, i) {
var rad = (Math.PI * 2 / 12) * i;
var x = Math.cos(rad) * (r - 30);
var y = Math.sin(rad) * (r - 30);
ctx.fillText(number, x, y);
});
//绘制分钟圆点
for(let i = 0; i < 60; i++) {
var rad = (Math.PI * 2 / 60) * i;
var x = Math.cos(rad) * (r - 18);
var y = Math.sin(rad) * (r - 18);
ctx.beginPath();
ctx.arc(x, y, 2, 0, Math.PI * 2);
if (i % 5 === 0) {
ctx.fillStyle = "#000";
} else {
ctx.fillStyle = "#ccc";
}
ctx.fill();
}
}
//时针
function drawHour(hour, minute) {
ctx.save();
var rad = (Math.PI * 2 / 12) * hour;
//时针需要随着分针的转动而转动相应的角度
var minuteRad = (Math.PI * 2 / 12 / 60) * minute;
ctx.rotate(rad + minuteRad);
ctx.beginPath();
ctx.moveTo(0, 10);
ctx.lineTo(0, -r / 2);
ctx.lineWidth = 6;
ctx.lineCap = "round";
ctx.stroke();
ctx.restore();
}
//分针
function drawMinute(minute) {
ctx.save();
var rad = (Math.PI * 2 / 60) * minute;
ctx.rotate(rad);
ctx.beginPath();
ctx.moveTo(0, 10);
ctx.lineTo(0, -r + 30);
ctx.lineWidth = 3;
ctx.lineCap = "round";
ctx.stroke();
ctx.restore();
}
//秒针
function drawSeconds(seconds) {
ctx.save();
var rad = (Math.PI * 2 / 60) * seconds;
ctx.rotate(rad);
ctx.beginPath();
ctx.moveTo(2, 20);
ctx.lineTo(-2, 20);
ctx.lineTo(-1, -r + 18);
ctx.lineTo(1, -r + 18);
ctx.fillStyle = "red";
ctx.fill();
ctx.restore();
}
//中心圆点
function drawDot() {
ctx.save();
ctx.beginPath();
ctx.arc(0, 0, 3, 0, Math.PI * 2);
ctx.fillStyle = "#fff";
ctx.fill();
ctx.restore();
}
//动态时间函数
function drawTime() {
var now = new Date();
var hour = now.getHours();
var minute = now.getMinutes();
var seconds = now.getSeconds();
drawBackground();
drawHour(hour, minute);
drawMinute(minute);
drawSeconds(seconds);
drawDot();
ctx.restore();
}
drawTime();
setInterval(drawTime, 1000);
</script>
</body>
</html>