动态阴影极简风时钟用Canvas原生实现,核心是时间驱动shadow属性变化:秒针阴影模糊与偏移正弦波动,时/分针阴影明度随小时渐变,悬停暂停、点击切换单针模式,配合性能优化与响应式适配。

在Canvas中实现动态阴影的极简风时钟,关键不在“画多复杂”,而在“用好阴影属性+时间驱动重绘+精简视觉逻辑”。不需要第三方库,纯原生Canvas即可完成。
设置Canvas与基础时钟结构
先创建一个正方形Canvas,设为响应式尺寸(如400×400),并启用抗锯齿。时钟主体只需三个同心圆:表盘外圈、中心圆点、以及三根指针(时/分/秒)——全部用stroke()绘制,不填色,符合极简风格。
- 用
ctx.lineWidth = 1.5统一描边粗细,避免视觉冗余 - 表盘刻度仅保留12、3、6、9四个数字,或改用短竖线(
moveTo/lineTo),长度控制在8px以内 - 中心圆点直径设为6px,填充纯黑或深灰,作为阴影锚点
让阴影“动起来”的核心技巧
Canvas阴影不是CSS那种自动跟随的层叠效果,而是每次绘制前手动设置shadowColor、shadowBlur、shadowOffsetX/Y。要实现“动态”,就得随时间改变这些值:
-
秒针阴影:
shadowBlur设为8~12之间随秒数正弦波动(Math.sin(Date.now() * 0.002) * 4 + 10),偏移量轻微左右摇摆(shadowOffsetX = Math.cos(Date.now() * 0.003) * 2) -
时/分针阴影:保持固定模糊值(如6),但
shadowColor随小时变化明度——例如hsl(210, 15%, ${60 + hour * 2}%),让凌晨偏暗、正午偏亮 - 每次绘制新帧前调用
ctx.shadowColor = 'transparent'清空上一帧阴影,防止叠加污染
交互增强:悬停暂停 + 点击切换模式
添加轻量交互提升可用性,不破坏极简感:
- 鼠标悬停Canvas时,停止
requestAnimationFrame循环,指针静止;移出后恢复——用canvas.addEventListener('mouseenter/mouseleave')控制 - 点击Canvas切换“标准模式”与“单针模式”(只显示秒针+呼吸式阴影),通过布尔变量
isSingleMode控制绘制逻辑 - 所有交互反馈仅靠阴影变化体现:悬停时全局
shadowBlur降为2,营造“凝固感”;点击切换瞬间让中心点短暂放大至10px并带0.15s缩放过渡(用scale()配合setTransform()重置)
性能与适配要点
极简≠低效,动态阴影易引发重绘开销:
- 使用
ctx.save()/ctx.restore()包裹指针绘制块,避免反复设置全局属性 - 阴影参数全部预计算,不放在
draw()里实时调用new Date()——改用performance.now()一次获取时间戳再分解 - 移动端需监听
resize并重新设置canvas.width/height(非CSS宽高),确保像素比正确;可加window.devicePixelRatio缩放补偿
不复杂但容易忽略:动态阴影的本质是“用时间函数调制绘图状态”,而非给图形加滤镜。极简风恰恰靠克制的参数变化来传递生命力。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











