0

0

canvas动画时钟

高洛峰

高洛峰

发布时间:2016-11-08 14:38:45

|

1707人浏览过

|

来源于php中文网

原创

最近在学canvas,然后根据mdn上的例子做了个动画时钟(为什么要造个轮子,因为丑。。)

这是MDN上的例子,怎么说呢,比较复古吧。

2422145834-58213fc77124124c_articlex.png

首先,找一张时钟的图片,就是下面这张了。

3432261377-582029d95e00a_articlex.png

——来自bigger than bigger的dribbble网站,图片来源(侵删)

然后就开始用canvas实现这个逼格满满的时钟吧。在html代码中插入canvas标签

在js文件中创建画布(假设我们使用的都是现代浏览器)。

function clock() {
  var ctx = document.getElementById('canvas').getContext('2d');
}

先来绘制时钟表盘,我们看到这张图是带有光线阴影效果的,画成一样难度太高。于是就用颜色的渐变来让时钟看起来稍微立体一点。在canvas中用createLinearGradient来创建一个新的渐变,并用addColorStop上色,最后把颜色赋给strokeStyle。详见运用样式与颜色 by MDN

//绘制表盘底色
ctx.translate(200, 200); //将坐标原点移到画布中心
ctx.rotate(-Math.PI/2); //将坐标轴逆时针旋转90度,x轴正方向对准12点方向
var lingrad = ctx.createLinearGradient(150, 0, -150, 0);
lingrad.addColorStop(0, '#242f37');
lingrad.addColorStop(1, '#48585c');
ctx.fillStyle = lingrad;
ctx.beginPath();
ctx.arc(0, 0, 150, 0, Math.PI * 2, true);
ctx.fill();

比较关键的一点是画布的坐标轴x轴正方向是时钟3点钟方向,为了方便起见,我们把它逆时针旋转90度让它指向十二点钟方向。

易标AI
易标AI

告别低效手工,迎接AI标书新时代!3分钟智能生成,行业唯一具备查重功能,自动避雷废标项

下载

绘制刻度要用到旋转rotate(变形 Transformations by MDN),小时刻度有12个,相邻两个刻度与圆心连线的角度就是Math.PI/6,这里用的是弧度表示,也就是30度。那么我们就用for循环来画出小时的刻度。

for (var i = 0; i < 12; i++) {
  ctx.beginPath();
  ctx.strokeStyle = '#fff';
  ctx.lineWidth = 3;
  ctx.rotate(Math.PI / 6);
  ctx.moveTo(140, 0);
  ctx.lineTo(120, 0);
  ctx.stroke();
}

同理,分钟的刻度也一样。

ctx.beginPath();
for (i = 0; i < 60; i++) {
  if (i % 5 !== 0) { //去掉与小时刻度重叠的部分
    ctx.beginPath();
    ctx.strokeStyle = '#536b7a';
    ctx.lineWidth = 2;
    ctx.moveTo(140, 0);
    ctx.lineTo(130, 0);
    ctx.stroke();
  }
  ctx.rotate(Math.PI / 30);
}

表盘大致画好了,刻度也画好了,接下来就是绘制指针并让它指向正确的时间,是不是?不就就是画一条直线么。关键是指针rotate的角度是多少呢?其实也是比较简单的。先获取当前的时间,把小时转换为12小时制的。

var now = new Date(),
    sec = now.getSeconds(),
    min = now.getMinutes(),
    hr = now.getHours();
hr = hr > 12 ? hr - 12 : hr;

那么,时针的位置就是(相对于x轴正方向转过的角度):

ctx.rotate(hr * (Math.PI / 6) + min * (Math.PI / 360) + sec * (Math.PI / 21600));

同理,分针和秒针的位置:

ctx.rotate(min * (Math.PI / 30) + sec * (Math.PI/1800));
 //分针ctx.rotate(sec * (Math.PI /30)); //秒针

最后,最关键的让指针转动起来,这里要用到的是requestAnimationFrame方法,用来重绘页面,得到连贯逐帧的动画,实现最佳的动画效果。

window.requestAnimationFrame(callback);

这个callback就是我们的绘制时钟的clock()函数。需要注意的是每次执行完requestAnimationFrame后需要清除画布,不然出现重叠交错的现象,我们把它放在clock函数开始的地方。

ctx.clearRect(0, 0, canvas.width, canvas.height);

到这里,动画时钟就OK了 效果图如下:

2422145834-58213fc77124124c_articlex.png

演示地址http://codepen.io/lifeng1893/pen/ALPamR

相关专题

更多
ip地址修改教程大全
ip地址修改教程大全

本专题整合了ip地址修改教程大全,阅读下面的文章自行寻找合适的解决教程。

86

2025.12.26

压缩文件加密教程汇总
压缩文件加密教程汇总

本专题整合了压缩文件加密教程,阅读专题下面的文章了解更多详细教程。

50

2025.12.26

wifi无ip分配
wifi无ip分配

本专题整合了wifi无ip分配相关教程,阅读专题下面的文章了解更多详细教程。

100

2025.12.26

漫蛙漫画入口网址
漫蛙漫画入口网址

本专题整合了漫蛙入口网址大全,阅读下面的文章领取更多入口。

293

2025.12.26

b站看视频入口合集
b站看视频入口合集

本专题整合了b站哔哩哔哩相关入口合集,阅读下面的文章查看更多入口。

589

2025.12.26

俄罗斯搜索引擎yandex入口汇总
俄罗斯搜索引擎yandex入口汇总

本专题整合了俄罗斯搜索引擎yandex相关入口合集,阅读下面的文章查看更多入口。

725

2025.12.26

虚拟号码教程汇总
虚拟号码教程汇总

本专题整合了虚拟号码接收验证码相关教程,阅读下面的文章了解更多详细操作。

63

2025.12.25

错误代码dns_probe_possible
错误代码dns_probe_possible

本专题整合了电脑无法打开网页显示错误代码dns_probe_possible解决方法,阅读专题下面的文章了解更多处理方案。

30

2025.12.25

网页undefined啥意思
网页undefined啥意思

本专题整合了undefined相关内容,阅读下面的文章了解更多详细内容。后续继续更新。

94

2025.12.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
uni-app电商系统实战精讲课程
uni-app电商系统实战精讲课程

共66课时 | 15.3万人学习

H5页面设计项目实战
H5页面设计项目实战

共32课时 | 3.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号