共计 2974 个字符,预计需要花费 8 分钟才能阅读完成。
<!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>
<script>
window.onload = function () {var canvas = document.querySelector('canvas')
var context = canvas.getContext('2d')
function clock() {
// 绘制圆盘
context.beginPath()
context.arc(300, 300, 200, 0, Math.PI * 2)
context.fillStyle = 'yellow'
context.fill()
// 完结门路
context.closePath()
// 绘制时刻度
for (i = 1; i <= 12; i++) {// save(): 将以后的绘画状态进行保留并存入状态栈
// 简而言之就是保留画刻度之前的状态 和 restore() 一起用
context.save()
context.lineWidth = 4
context.beginPath()
// 将原点平移 圆心地位
context.translate(300, 300)
// 旋转 30 度 小时的刻度
// angle: 旋转角度,旋转的中心点就是坐标轴的原点
context.rotate(i * (Math.PI / 6))
// 绘制时刻度 从内向里画(反过来则要正数)context.moveTo(0, 200)
context.lineTo(0, 180)
context.stroke()
context.fillStyle = 'black'
// 调整数字的大小
context.font = '20px bold'
// 数半径
context.fillText(i, -10, -150)
context.closePath()
// restore(): 该办法每次调用只会回滚到上一次 save 的状态
// 回退到画刻度之前的 save() 状态,不影响前面的时针,分针等等的绘制
context.restore()}
// 绘制分刻度 分针要转 60 次
for (i = 1; i <= 60; i++) {context.save()
// 平移原点 新的原点就是圆心
context.translate(300, 300)
// 分针要转 60 次的 6 度 Math.PI 相当于 180 度
context.rotate(i * (Math.PI / 30))
context.beginPath()
// 绘制分刻度 从里往外画
context.moveTo(0, -190)
context.lineTo(0, -200)
context.stroke()
context.closePath()
// 反复分刻度
context.restore()}
// 利用内置函数 Date() 获取以后工夫
var date = new Date()
// 打印看一下
console.log(date);
// 获取以后的小时
var hours = date.getHours()
// 获取以后分钟
var minutes = date.getMinutes()
// 获取以后秒数
var seconds = date.getSeconds()
// 打印看一下
console.log(hours, minutes, seconds);
// 以后的小时数
hours = hours + minutes / 60;
// 绘制时针 仍旧要保留绘画时针前的状态而后画完后回退
context.save()
// 平移原点
context.translate(300, 300)
// 小时乘以 30 度
// rotate(angle): 旋转角度,旋转的中心点就是坐标轴的原点
context.rotate(hours * (Math.PI / 6))
context.beginPath()
context.lineWidth = 5
context.moveTo(0, 10)
context.lineTo(0, -90)
context.stroke()
context.closePath()
context.restore()
// 绘制分针
context.save()
// 平移原点 新原点就是圆心
context.translate(300, 300)
// 先依据以后分钟旋转到那个地位 找到坐标
context.rotate(minutes * (Math.PI / 30))
// 再绘制分针
context.beginPath()
// 调整时针线宽
context.lineWidth = 3
// 开始绘制 moveTo() 是挪动到分针的起始地位
context.moveTo(0, 10)
//lineTo() 是画直线 (0, -120) 是完结坐标点 这个坐标点是绝对圆心来说的,因为后面 translate(300, 300) 曾经把原点平移到圆心的地位了
context.lineTo(0, -120)
context.strokeStyle = 'blue'
context.stroke()
context.closePath()
context.restore()
// 绘制秒针
context.save()
context.translate(300, 300)
// 小时乘以 30 度
// angle: 旋转角度,旋转的中心点就是坐标轴的原点
context.rotate(seconds * (Math.PI / 30))
context.beginPath()
// 调整线宽 也就是秒针的宽度
context.lineWidth = 2
// 绘制秒针
context.moveTo(0, 10)
context.lineTo(0, -170)
// 扭转秒针款式
context.strokeStyle = 'red'
// 画的是轮廓图形
context.stroke()
// 完结门路
context.closePath()
// 回退状态
context.restore()
// 绘制交叉处
// save(): 将以后的绘画状态进行保留并存入状态栈
context.save()
context.translate(300, 300)
// 开始门路
context.beginPath()
// 绘制时钟两头的小圆 xy 轴开始地位 小圆半径 开始弧度 完结弧度 360 度
context.arc(0, 0, 5, 0, Math.PI * 2)
// 填充圆设置为红色
context.fillStyle = 'white'
// 轮廓圆设置红色
context.strokeStyle = 'red'
// 绘制填充圆
context.fill()
// 绘制轮廓圆
context.stroke()
// 完结门路
context.closePath()
context.restore()
// 超时模仿间歇 防止载入时 时钟先隐没一小会儿再呈现
setTimeout(clock, 1000)
}
clock()}
</script>
</head>
<body>
<canvas width="600px" height="600px" style="background-color: rgb(154, 233, 243);"></canvas>
</body>
</html>
正文完