深夜,用canvas画一个时钟
深夜,用canvas画一个时钟
这几天准备阿里巴巴的笔试,可以说已经是心力交瘁,自从阿里和蘑菇街的内推被刷掉之后,开始越来越怀疑起自己的能力来,虽然这点打击应该是微不足道的。毕竟校招在刚刚开始拉开帷幕,精彩的还在后头,内推不过,还有机会去秋招,这次秋招不过,还有明年的春招。但是明年的春招我可能等不起了,我迫不及待地需要一份工作,需要一份我向往的工作。
今天看书看到canvas部分,便用它来写了一个时钟,原理很简单,用context.arc(100, 100, 99, 0, Math.PI*2, false);绘制圆形作为表盘,context.fillText(i, textX, textY);绘制表盘上的数字,context.lineTo(secondsX, secondsY);绘制秒针,时针和分针的原理与此相同。接着就是正弦和余弦函数的运用。
开代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>canvas时钟</title>
</head>
<body>
<canvas id="drawing" width="400" height="400"></canvas>
<script>
var draw = document.getElementById('drawing');
var time = null;
var seconds = 0;
var minutes = 0;
var hours = 0;
var secondsAngle = 0;
var minutesAngle = 0;
var hoursAngle = 0;
var secondsX = 0;
var secondsY = 0;
var minutesX = 0;
var minutesY = 0;
var hoursX = 0;
var hoursY = 0;
if (draw.getContext) {
var context = draw.getContext('2d');
// 绘制外圆
context.arc(100, 100, 99, 0, Math.PI*2, false);
// 绘制内圆
context.moveTo(194, 100);
context.arc(100, 100, 94, 0, Math.PI*2, false);
context.stroke();
context.font = "bold 14px Arial";
context.textAlign = 'center';
context.textBaseline = 'middle';
// context.fillText('12', 100, 20);
var i = 1;
var textAngle = 0;
var textX = 0;
var textY = 0;
for (i = 1; i < 13; i++) {
textAngle = i * (Math.PI*2/12);
textY = 100 - 83*Math.cos(textAngle);
textX = 100 + 83*Math.sin(textAngle);
context.fillText(i, textX, textY);
}
drawClock();
setInterval(drawClock, 1000);
}
function getTime() {
var date = new Date();
var res = {};
res.seconds = date.getSeconds();
res.minutes = date.getMinutes();
res.hours = date.getHours();
return res;
}
function drawClock() {
// 开始路径
context.beginPath();
context.clearRect(35, 35, 130, 130);
time = getTime();
seconds = time.seconds;
minutes = time.minutes;
hours = time.hours > 12 ? time.hours-12: time.hours;
// 绘制秒针
// context.rePaint();
context.moveTo(100, 100);
secondsAngle = (seconds/60)*Math.PI*2;
secondsY = 100 - 65*Math.cos(secondsAngle);
secondsX = 100 + 65*Math.sin(secondsAngle);
context.lineTo(secondsX, secondsY);
// 绘制分针
context.moveTo(100, 100);
minutesAngle = ((minutes*60+seconds)/(60*60))*Math.PI*2;
minutesY = 100 - 50*Math.cos(minutesAngle);
minutesX = 100 + 50*Math.sin(minutesAngle);
context.lineTo(minutesX, minutesY);
// 绘制时针
context.moveTo(100, 100);
hoursAngle = ((hours*60*60+minutes*60+seconds)/(12*60*60))*Math.PI*2;
hoursY = 100 - 35*Math.cos(hoursAngle);
hoursX = 100 + 35*Math.sin(hoursAngle);
context.lineTo(hoursX, hoursY);
// 描边路径
context.stroke();
}
</script>
</body>
</html>
深夜,用canvas画一个时钟的更多相关文章
- 玩转html5(四)----使用canvas画一个时钟(可以动的哦!)
先给个效果图,我画的比较丑,大家可以自己美化一下, 直接上代码: <!DOCTYPE html> <meta charset="utf-8"> <ht ...
- canvas画一个时钟
效果图如下 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- 用canvas画一个时钟
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 10分钟,利用canvas画一个小的loading界面
首先利用定义下canvas得样式 <canvas width="1024" height="720" id="canvas" styl ...
- 用Canvas画一个刮刮乐
Canvas 通过 JavaScript 来绘制 2D图形.Canvas 是逐像素进行渲染的.开发者可以通过javascript脚本实现任意绘图.Canvas元素是HTML5的一部分,允许脚本语言动态 ...
- 利用canvas画一个实时时钟
先放一张效果图: 下面是源代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"& ...
- 用canvas绘制一个时钟
实现一个时钟的绘制和时间的显示 一,首先是页面的搭建html部分以及一点点的css代码,因为css这块用的比较少,所以就没有单独出来: <!DOCTYPE html> <html l ...
- 通过H5的新标签canvas做出一个时钟的全过程,希望对初学者有帮助
最近学习了H5中的一个新标签canvas并且用它做出了一个时钟,最下面是成品图像,还不错吧,这只是我学习中的一个小demo,做得有点粗糙,但终究是做出来了,以后再写自己的网页主页再做一个好看点放上去. ...
- html5入门:教你用canvas写一个时钟
今天的时间比较充裕,心血来潮,为大家分享一个html5的小例子,希望对刚学html5或者是没学html5正准备学的“童鞋们”展示一个小案例,希望对你们的学习有帮助!高手嘛!请跳过吧! 好了,闲话少数, ...
随机推荐
- .NET(C#):觉察XML反序列化中的未知节点
原文 www.cnblogs.com/mgen/archive/2011/12/12/2284554.html 众所周知XML是可以扩展的,XML的元素可以靠名称识别而不是只按照未知识别.在 XML反 ...
- 12.04 如何更专业的使用Chrome开发者工具
顾名思义Chrome开发工具就是一个工具,它允许Web开发人员可以通过浏览器应用程序干预和操作Web页面,也可以通过这个工具调试和测试Web页面或Web应用程序.有了这个工具,你可以做很多有趣的事情: ...
- 使用资源监控工具 glances
http://www.ibm.com/developerworks/cn/linux/1304_caoyq_glances/ glances 可以为 Unix 和 Linux 性能专家提供监视和分析性 ...
- 关于js封装框架类库之DOM操作模块(一)
在前端开发的过程中,javascript极为重要的一个功能就是对DOM对象的操作,而对其封装就是为了更好地进行DOM操作,提高浏览器的支持效率 现在给出一个案例:页面创建三个div,然后给其添加样式 ...
- VS2013 RC 此模板尝试加载组件程序集 “NuGet.VisualStudio.Interop, Version=1.0.0.0, Culture=neutral.........
微软发布了vs2013的RC版本,更新了自己机器上的vs,在创建项目过程中,发现出现如题的相关错误,查了相关msdn的资料,才了解到vs已经全面切换到使用NuGet这个第三方开源工具来管理项目包和引用 ...
- Objective-c (多输入参数的方法)
一个方法可能具有多个输入参数.在头文件中,可以定义带有多个输入参数的方法: - (void)setIntX:(int)n andSetIntY:(int)d 下面通过一个例子来说明它的具体用法: #i ...
- 数组有没有 length()这个方法? String 有没有 length()这 个方法?
1.数组中有length属性. 2.String有lenth()方法.
- 笔记 postgresql oid同步
以前学习postgresql的笔记 create table 消耗 OID 如create table my_test_table, 他本身会消耗一个 会在pg_type中插入两条记录_my_test ...
- ADO接口
转自百度文库 ADO中最重要的对象有三个:Connection.Recordset和Command,分别表示连接对象.记录集对象和命令对象. 三个对象对应的智能指针分别是:_ConnectionPtr ...
- (转)原子操作 Interlocked系列函数
上一篇<多线程第一次亲密接触 CreateThread与_beginthreadex本质区别>中讲到一个多线程报数功能.为了描述方便和代码简洁起见,我们可以只输出最后的报数结果来观察程序是 ...