【html】canvas实现一个时钟 - 实践
2025-10-15 18:39 tlnshuju 阅读(0) 评论(0) 收藏 举报前言
“一行代码能做什么?”——有人用一行代码写出圣诞树,有人用一行代码写出 3D 隧道。
今天我想带你回到最原始的画布:HTML5 Canvas。
我们只用 一个 <canvas>
标签 + 一份被注释到“膨胀”的源码,做一只实时跳动的机械时钟。
读完你不仅能照抄代码,还能彻底搞懂:
- 为什么
requestAnimationFrame
比setInterval
更适合动画 - 三角函数在前端到底怎么用
- 如何把“时间”映射成“角度”再映射成“坐标”
在线预览
把下面 60 行“真身”粘进任意 .html
文件,双击即可运行:
(我已经把注释写成了“伪 600 行”——每行都带中文讲解,复制即食)
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8" /><title>Canvas Clock | 注释版</title><style>/* 让时钟水平居中,再给个浅灰背景+深色边框,高级感拉满 */canvas {display: block;margin: 50px auto;background: #f4f4f4;border: 2px solid #333;border-radius: 50%; /* 圆表盘当然要圆角 */box-shadow: 0 0 20px rgba(0,0,0,.15);}</style></head><body><!-- 600×600 像素的画布,id 叫“clock”,后面 JS 就靠它画画 --><canvas id="clock" width="600" height="600"></canvas><script>/* 主绘制函数:每帧擦掉旧画面 -> 重新画新画面,形成动画 */function drawClock() {const canvas = document.getElementById('clock');const ctx = canvas.getContext('2d'); // 拿到 2D 画笔const cx = 300, cy = 300, r = 250; // 圆心(cx,cy) 半径 r/* 1. 清屏:把上一帧的画面整个擦掉,避免拖影 */ctx.clearRect(0, 0, 600, 600);/* 2. 表盘:一个灰色大圆 */ctx.beginPath();ctx.arc(cx, cy, r, 0, Math.PI * 2);ctx.fillStyle = '#ccc';ctx.fill();/* 3. 拿到当前时分秒 */const now = new Date();const h = now.getHours();const m = now.getMinutes();const s = now.getSeconds();/* 4. 角度换算:把“时间”转成“顺时针角度”,再减去 90° 让 0° 指向 12 点 */const hAngle = ((h % 12) + m / 60) * 30 - 90; // 每小时 30°const mAngle = (m + s / 60) * 6 - 90; // 每分钟 6°const sAngle = s * 6 - 90; // 每秒 6°/* 5. 画三根指针:颜色、长度、线宽各不相同,秒针用骚红色 */drawHand(ctx, hAngle, 100, 12, '#333'); // 时针drawHand(ctx, mAngle, 150, 8, '#555'); // 分针drawHand(ctx, sAngle, 180, 3, '#e74c3c'); // 秒针/* 6. 中心小圆点:盖住三根指针的尾巴,显得更像实物 */ctx.beginPath();ctx.arc(cx, cy, 10, 0, Math.PI * 2);ctx.fillStyle = '#333';ctx.fill();/* 7. 请求下一帧:浏览器会在下一次重绘前再调 drawClock(),形成无限循环 */requestAnimationFrame(drawClock);}/* 工具函数:画一根指针angle:旋转角度(度) length:长度 width:线宽 color:颜色 */function drawHand(ctx, angle, length, width, color) {const rad = (angle * Math.PI) / 180; // 角度转弧度const x = 300 + Math.cos(rad) * length;const y = 300 + Math.sin(rad) * length;ctx.beginPath();ctx.moveTo(300, 300);ctx.lineTo(x, y);ctx.lineWidth = width;ctx.strokeStyle = color;ctx.lineCap = 'round'; // 圆角线帽,更柔和ctx.stroke();}/* 启动!第一次手动调用,后面就靠 requestAnimationFrame 自动循环 */drawClock();</script></body></html>
关键知识点拆解
步骤 | 前端技巧 | 一句话记忆 |
---|---|---|
清屏 | ctx.clearRect | 动画第一定律:先擦后画 |
角度 | -90° 修正 | 数学 0° 指向 3 点,时钟 0° 指向 12 点 |
弧度 | Math.PI / 180 | 角度给人类看,弧度给三角函数看 |
指针终点 | cos 管 x,sin 管 y | 高中三角函数终于还给了体育老师 |
动画节流 | requestAnimationFrame | 浏览器帮你匹配屏幕刷新率,60 fps 不丢帧 |
还能怎么玩?
- 换皮肤:把表盘改成深色霓虹,秒针加 glow 阴影,瞬间赛博朋克。
- 加刻度:用
for
循环画 60 个小圆点,12 个粗点代表小时。 - 加数字:
ctx.fillText
把 1~12 画到对应位置,注意同样要转角度。 - 响应式:把
600
改成min(window.innerWidth, window.innerHeight)
,再动态算圆心。 - 音效:每秒播放一次“滴答”采样,Web Audio API 只要 5 行。
结语
Canvas 像一张永远干不掉的水彩纸:
通过你行在上面画像素、画粒子、画星空,也能够画一只最朴素的时钟。
“会动”的不只是指针,还有你对前端世界的好奇心。
把这份代码存进收藏夹,下次面试被问到“如何实现平滑动画”时,
把 requestAnimationFrame + 三角函数
这套组合拳打出来,
面试官大概率会点点头:嗯,基础很扎实。
源码仓库
GitHub 完整仓库
gitter.com/koreation/canvas-clock欢迎 Star & PR!
如果这篇文章帮到你,记得点个赞,
让你的时间,也像 Canvas 里的秒针一样,优雅前行。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/937706.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!相关文章
一行代码也能行?极简实现GPIO按键关机(支持短按/长按)
别被复杂的逻辑吓到!其实用极简代码就能实现GPIO按键的短按与长按识别。本文介绍一种高效、稳定、易懂的实现方式,适合快速集成到你的项目中。
本文将以Air8000核心板为例,分享如何使用GPIO控制预留的POWER_ON按键,…
2025年太阳能板趋势与智能选择指南
文章摘要
本文深入分析2025年太阳能板市场趋势,包括效率提升、成本变化和行业展望,并提供实用选择指南,帮助家庭和工业用户做出明智决策。基于权威数据,我们探讨太阳能板的环保优势、安装维护技巧,以及如何通过性…
抖音麒麟福袋软件操作指南
抖音麒麟福袋软件操作指南第一步:
电脑安装比特浏览器
比特官网地址:https://www.bitbrowser.cn/?code=9b70975d
安装好之后打开注册,并且实名第二步:点击分组管理,创建一个自己的分组,点击确认第三步:创建浏览…
2025 印尼物流专线公司推荐榜:聚焦合规高效,深圳恒翔物流凭实力登榜
近年来,中国与印尼贸易往来持续升温,制造业外贸出口、跨境电商等领域的蓬勃发展,带动印尼物流专线需求大幅增长。海运、空运等专线服务已从外贸企业专属,逐步延伸至电商卖家、生产制造等多个群体。2025 年,随着中…
国金证券 QMT 云服务器上 重启后 无法自动登录,如何解决?
国金证券 QMT 云服务器上 重启后 无法自动登录,如何解决?2025-10-15 18:24
Kyle_Lee
阅读(0)
评论(0) 收藏
举报国金证券的QMT真恶心啊,有自动登录的勾选框,
也有倒计时但就是没有记住密码,不让登录,
非要…
人文创新研究:在意义的边界探寻新境
人文创新研究:在意义的边界探寻新境
——声明Ai研究
引言
在人类文明演进进程中,人文创新作为一种独特的创新形态,承载着探索精神世界、重构意义系统的重要使命。与技术创新关注物质改造不同,人文创新的核心在于意…
平面图最小割与对偶图最短路 - 干
平面图
即所有边都不相交的图。
例:对偶图
将平面图中的面转为点,每条边连接其左右的两个面,一个朴素的例子:其对偶图为:对偶图最短路
所以对偶图与最小割有什么关系呢?
在最小割问题中,我们经常会遇到面对平面…
深入解析:Nodejs开发环境搭建
深入解析:Nodejs开发环境搭建pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…
项目管理:PERT/CPM
网络计划图
概念
表示整个项目的网络图,成为项目网络。描述一个项目需要三方面的信息:活动、次序、时间。通常有两类网络:用弧表示活动的项目网络(双代号法,AOA);用节点表示活动的项目网络(单代号法,AON)。
…
mysql版本升级 8.0.22升级到8.0.34
mysql版本升级 8.0.22升级到8.0.341.使用mysqldump全量备份所有数据库
输入mysqldump -uroot -p --all-databases > all_databases.sql
输入密码
查看当前所在目录是否产生all_databases.sql (因为是小版本升级所…
智能物联网的实时通信之钥——WebSocket
要实现设备间的无缝协同与实时反馈,离不开一个高效可靠的通信协议。WebSocket正是开启智能物联网实时交互之门的“钥匙”,它让数据流动不再等待,为智能家居、智慧城市等场景注入即时生命力。
一、WebSocket基础知识…
2025 苏州注册公司服务机构实用推荐:选择深度解析
2025 年上半年苏州新增市场主体达 8.2 万家,初创企业占比超 6 成,注册代理服务需求持续攀升。面对繁杂的市场选择,结合服务效率、政策适配、风险防控等核心维度,我们实测筛选出 5 家综合实力突出的机构,为创业者提…
可信AI研究获资助,10位博士生探索算法公平与隐私
某机构向宾夕法尼亚大学10名工程博士提供资助,支持其开展可信人工智能研究。研究重点包括算法公平性、隐私保护、可解释性及神经符号学习等技术方向,旨在构建安全可靠的人工智能系统。某机构资助10名工程博士生开展可…
LeetCode | 45. 跳跃游戏 II(转载)
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
示例:输入: [2,3,1,1,4]
输出: 2
解释: 跳到最后一…
实用指南:【在Ubuntu 24.04.2 LTS上安装Qt 6.9.2】
实用指南:【在Ubuntu 24.04.2 LTS上安装Qt 6.9.2】pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…
实用指南:mysql_query函数:数据库世界的信使
pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …