Coffeescript实现canvas时钟
前言
参照Mozilla 官方教程,要在Canvas上画动画时钟,思路非常有意思。
把动画看作是多个帧组成,定时每个时间点在Canvas上画一帧来实现动画。而Mozilla 官方教程画图实现的思路有意思的地方在于,它喜欢在画布上面做文章,正常的思路,如果要画一条倾斜45度的直线,一般会先用数据计算拿到起始点与末点的坐标,先定位到起点画线到末点;如何在画布上面做文章呢,它先把画布旋转45度,然后直接在中间画一条竖线,再把画布复原,这样直线也跟着倾斜45度了。就按这思路定时在Canvas上画点、线、面实现时钟动画。
页面效果如下
原代码如下
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>canvas时钟 - Coffeescript实现</title>
<script id="others_zepto_10rc1" type="text/javascript" class="library" src="/js/sandbox/other/zepto.min.js"></script>
<script id="others_coffeescript" type="text/javascript" class="library" src="/js/sandbox/other/coffee-script.js"></script>
</head>
<body>
<canvas id="canvas"></canvas>
<h2>
Coffeescript 练习
</h2>
<p>
Canvas时钟 - Coffeescript实现
</p>
<p>
参照 <a href="https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Basic_animations">An animated clock</a>
</p>
</body>
<script type="text/coffeescript">
clock = ->
now = new Date()
ctx = document.getElementById('canvas').getContext '2d'
ctx.save()
ctx.clearRect 0,0,150,150
ctx.translate 75,75
ctx.scale 0.4,0.4
ctx.rotate -Math.PI/2
ctx.strokeStyle = "black"
ctx.fillStyle = "white"
ctx.lineWidth = 8
ctx.lineCap = "round" #画12个小时的标刻
ctx.save()
for i in [0..11]
ctx.beginPath()
ctx.rotate Math.PI/6
ctx.moveTo 100,0
ctx.lineTo 120,0
ctx.stroke()
ctx.restore() #画60个分钟的标刻
ctx.save()
ctx.lineWidth = 5
for i in [0..59]
if i%5 isnt 0
ctx.beginPath()
ctx.moveTo 117,0
ctx.lineTo 120,0
ctx.stroke()
ctx.rotate Math.PI/30
ctx.restore() sec = now.getSeconds()
min = now.getMinutes()
hr = now.getHours()
hr = if hr >= 12 then hr-12 else hr ctx.fillStyle = "black" #画时针
ctx.save()
ctx.rotate hr*(Math.PI/6) + (Math.PI/360)*min + (Math.PI/21600)*sec
ctx.lineWidth = 14
ctx.beginPath()
ctx.moveTo -20,0
ctx.lineTo 80,0
ctx.stroke()
ctx.restore() #画分针
ctx.save()
ctx.rotate (Math.PI/30)*min + (Math.PI/1800)*sec
ctx.lineWidth = 10
ctx.beginPath()
ctx.moveTo -28,0
ctx.lineTo 112,0
ctx.stroke()
ctx.restore() #画秒针
ctx.save()
ctx.rotate sec * Math.PI/30
ctx.strokeStyle = "#D40000"
ctx.fillStyle = "#D40000"
ctx.lineWidth = 6
ctx.beginPath()
ctx.moveTo -30,0
ctx.lineTo 83,0
ctx.stroke()
ctx.beginPath()
ctx.arc 0,0,10,0,Math.PI*2,true
ctx.fill()
ctx.beginPath()
ctx.arc 95,0,10,0,Math.PI*2,true
ctx.stroke()
ctx.fillStyle = "rgba(0,0,0,0)"
ctx.arc 0,0,3,0,Math.PI*2,true
ctx.fill()
ctx.restore() #画钟的外圈
ctx.beginPath()
ctx.lineWidth = 14
ctx.strokeStyle = '#325FA2'
ctx.arc 0,0,142,0,Math.PI*2,true
ctx.stroke()
ctx.restore() window.requestAnimationFrame clock
return #启动程序
clock()
</script>
</html>
Coffeescript实现canvas时钟的更多相关文章
- 》》canvas时钟
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- 原生js之canvas时钟组件
canvas一直是前端开发中不可或缺的一种用来绘制图形的标签元素,比如压缩上传的图片.比如刮刮卡.比如制作海报.图表插件等,很多人在面试的过程中也会被问到有没有接触过canvas图形绘制. 定义 ca ...
- HTML5之Canvas时钟(网页效果--每日一更)
今天,带来的是使用HTML5中Canvas标签实现的动态时钟效果. 话不多说,先看效果:亲,请点击这里 众所周知,Canvas标签是HTML5中的灵魂,HTML5 Canvas是屏幕上的一个由Java ...
- Canvas - 时钟绘制
导语:距离上一次写canvas,已经过去两年半,如今业务需要,再次拾起,随手记录. [思考] 时钟的绘制主要在于圆的绘制:1. 使用context.arc()方法直接绘制圆或圆弧: 2. 使用圆的方程 ...
- html5 canvas时钟
基础知识点: canvas标签只是图形容器,您必须使用脚本来绘制图形. getContext() 方法可返回一个对象,该对象提供了用于在画布上绘图的方法和属性.——获取上 ...
- canvas时钟效果
话不多说,直接上代码 <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/x ...
- HTML5 Canvas 时钟
1. [图片] QQ截图20120712130049.png 2. [代码][HTML]代码 <!DOCTYPE html><html lang="en" &g ...
- 简单的canvas时钟
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- canvas 时钟+自由落体
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
随机推荐
- 第3月第15天 afconvert lame
1. //CAF 转换成MP3 (可以) afconvert -f mp4f -d aac -b 128000 /Users/amarishuyi/Desktop/sound1.caf/Users/a ...
- Linux学习之五--常用操作
文件操作: rm命令 删除文件夹实例:rm -rf /var/log/httpd/access将会删除/var/log/httpd/access目录以及其下所有文件.文件夹 2 删除文件使用实例:rm ...
- Tomcat 内存优化设置
vi /tomcat7.0/bin/catalina.sh 开发环境 #!/bin/sh JAVA_OPTS='-Xms128m -Xmx512m -XX:PermSize=128m' 服务器: #! ...
- height:100%与height:inherit的区别
一.兼容性 首先,inherit这个属性只是在ie8+才支持:100%支持ie6: 二.大多数情况下没有区别 在正常情况下height:100%与height:inherit没有任何区别: 1.父元素 ...
- javascript中的变量
变量 var x = 0; 这是声明了一个变量的实例,我们可以把变量看做存储数据的容器.数据的类型可以是任何数据类型. 一变量的命名 声明一个变量需注意: ①:变量可以以字母或者$._开头(后两 ...
- JQ倒计时天时分秒
<div id="times_wrap" class="time_num"> 距离现在时间: <div class="time_w& ...
- Mac 使用Sublime Text 3 搭建C开发环境
Sublime Text 3 (安装包,注册码 ,汉化包) 1)工具-编译系统-新建编译器 { "cmd" : ["gcc -o ${file_base_name} $ ...
- CDR VBA鼠标选择
Dim x As Double, y As Double, Shift As Long, b As Boolean, doc As Document Dim sel1 As Shape, sel2 A ...
- eclipse开发servlet,HttpServletRequest报红叉解决方案
eclipse开发servlet,HttpServletRequest报红叉解决方案 今天突然间有兴致,想打一会代码,于是开发一个Servlet,代码和配置路径都没问题,HttpServlet居然报错 ...
- LeetCode 359 Logger Rate Limiter
Problem: Design a logger system that receive stream of messages along with its timestamps, each mess ...