目录
实现如图的时钟
知识点:
<canvas>标签,以及附带的方法、属性
具体思路:
1.使用canvas的.arc()方法实现每毫秒时钟进度时分秒的绘制
2.通过定时器每一毫秒绘制一次时钟,实现时钟的动画效果
具体结构样式:
<style>
* {
margin: 0;
padding: 0;
background-color: rgb(37, 57, 78);
}
div {
margin: 100px auto;
width: 800px;
height: 800px;
}
</style>
<body>
<div>
<canvas width="800" height="800" style="background-color: rgb(37, 57, 78);"></canvas>
</div>
</body>
js代码(注释详解):
<script>
//获取画板
var myCanvas = document.getElementsByTagName("canvas")[0];
// 获取画笔
var draw = myCanvas.getContext("2d");
function drawClock() {
// 绘制前首先清除画布,否则会造成与之前绘制的图形重合导致模糊
draw.clearRect(0, 0, myCanvas.width, myCanvas.height)
// 取当前时间 时分秒毫秒
var now = new Date();
var miniSec = now.getMilliseconds();
var seconds = now.getSeconds();
var minutes = now.getMinutes();
var hours = now.getHours();
// 将获取到的时间字符串设置为标准的十分秒毫秒时间格式即00:00:00:000
miniSec = miniSec < 10 ? "00" + miniSec : miniSec < 100 ? "0" + miniSec : miniSec;
seconds = seconds < 10 ? "0" + seconds : seconds;
minutes = minutes < 10 ? "0" + minutes : minutes;
hours = hours < 10 ? "0" + hours : hours;
// 获取当前 时/分/秒 各占表盘度数的比例
var secondDeg = seconds * 6 + miniSec * 6 / 1000;
var minuteDeg = minutes * 6 + seconds / 10;
var hourDeg = hours % 12 * 30 + minutes / 2;
// 通过截取字符串的方法获得我们所需的日期字符串
var dayTime = now.toString().slice(0, 16);
// 获取完整的时间显示字符串
var clockTime = hours + ":" + minutes + ":" + seconds + ":" + miniSec;
// 设置渐变色 以及线条样式
var grad = draw.createLinearGradient(0, 0, 800, 800);
grad.addColorStop(0, 'rgb(0,255,255)')
grad.addColorStop(0.5, "rgb(173, 204, 230)")
grad.addColorStop(1, "aliceblue")
draw.lineWidth = 40;
// 设置绘制的文本以及文本样式
draw.textAlign = "center";
draw.fillStyle = grad;
draw.font = "bold 30px 微软雅黑";
draw.fillText(dayTime, 400, 380);
draw.fillText(clockTime, 400, 430);
// 将时/分/秒 各占表盘度数的比例存在数组中
var three = [secondDeg, minuteDeg, hourDeg];
// 遍历使用数组,绘制时/分/秒的进度
for (var i = 0; i < three.length; i++) {
// 首先绘制灰色的路径
draw.strokeStyle = "rgb(111, 112, 117)";
draw.shadowBlur = 0;
draw.beginPath();
draw.arc(400, 400, 180 + i * 80, 0, Math.PI * 2);
draw.stroke();
draw.closePath();
// 绘制进度,并且使用渐变色
draw.shadowColor = "rgb(173, 204, 230)";
draw.shadowBlur = 10;
draw.beginPath();
draw.strokeStyle = grad;
draw.arc(400, 400, 180 + i * 80, -Math.PI / 2, Math.PI / 180 * three[i] - Math.PI / 2, false);
draw.stroke();
draw.closePath();
}
}
// 初始化时钟样式
drawClock();
// 使用定时器实现时钟进度的变化
setInterval(drawClock, 1)
</script>
完整代码
<!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>Document</title>
<style>
* {
margin: 0;
padding: 0;
background-color: rgb(37, 57, 78);
}
div {
margin: 100px auto;
width: 800px;
height: 800px;
}
</style>
</head>
<body>
<div>
<canvas width="800" height="800" style="background-color: rgb(37, 57, 78);"></canvas>
</div>
</body>
<script>
//获取画板
var myCanvas = document.getElementsByTagName("canvas")[0];
// 获取画笔
var draw = myCanvas.getContext("2d");
function drawClock() {
// 绘制前首先清除画布,否则会造成与之前绘制的图形重合导致模糊
draw.clearRect(0, 0, myCanvas.width, myCanvas.height)
// 取当前时间 时分秒毫秒
var now = new Date();
var miniSec = now.getMilliseconds();
var seconds = now.getSeconds();
var minutes = now.getMinutes();
var hours = now.getHours();
// 将获取到的时间字符串设置为标准的十分秒毫秒时间格式即00:00:00:000
miniSec = miniSec < 10 ? "00" + miniSec : miniSec < 100 ? "0" + miniSec : miniSec;
seconds = seconds < 10 ? "0" + seconds : seconds;
minutes = minutes < 10 ? "0" + minutes : minutes;
hours = hours < 10 ? "0" + hours : hours;
// 获取当前 时/分/秒 各占表盘度数的比例
var secondDeg = seconds * 6 + miniSec * 6 / 1000;
var minuteDeg = minutes * 6 + seconds / 10;
var hourDeg = hours % 12 * 30 + minutes / 2;
// 通过截取字符串的方法获得我们所需的日期字符串
var dayTime = now.toString().slice(0, 16);
// 获取完整的时间显示字符串
var clockTime = hours + ":" + minutes + ":" + seconds + ":" + miniSec;
// 设置渐变色 以及线条样式
var grad = draw.createLinearGradient(0, 0, 800, 800);
grad.addColorStop(0, 'rgb(0,255,255)')
grad.addColorStop(0.5, "rgb(173, 204, 230)")
grad.addColorStop(1, "aliceblue")
draw.lineWidth = 40;
// 设置绘制的文本以及文本样式
draw.textAlign = "center";
draw.fillStyle = grad;
draw.font = "bold 30px 微软雅黑";
draw.fillText(dayTime, 400, 380);
draw.fillText(clockTime, 400, 430);
// 将时/分/秒 各占表盘度数的比例存在数组中
var three = [secondDeg, minuteDeg, hourDeg];
// 遍历使用数组,绘制时/分/秒的进度
for (var i = 0; i < three.length; i++) {
// 首先绘制灰色的路径
draw.strokeStyle = "rgb(111, 112, 117)";
draw.shadowBlur = 0;
draw.beginPath();
draw.arc(400, 400, 180 + i * 80, 0, Math.PI * 2);
draw.stroke();
draw.closePath();
// 绘制进度,并且使用渐变色
draw.shadowColor = "rgb(173, 204, 230)";
draw.shadowBlur = 10;
draw.beginPath();
draw.strokeStyle = grad;
draw.arc(400, 400, 180 + i * 80, -Math.PI / 2, Math.PI / 180 * three[i] - Math.PI / 2, false);
draw.stroke();
draw.closePath();
}
}
// 初始化时钟样式
drawClock();
// 使用定时器实现时钟进度的变化
setInterval(drawClock, 1)
</script>
</html>