1、最终效果
  时钟、分钟、秒指针连续移动

2、完整代码
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Clock in canvas</title>
<script type="text/javascript" charset="utf-8" src="Scripts/Jquery/jquery-1.9.1.min.js"></script>
<script>
$(function () {
var container = $('.container');
var clockPanel = $('.clockPanel', container).get(0);
var ctx = clockPanel.getContext('2d'); var r = 100;
var point = { X: 150, Y: 150 };
drawCircle(ctx, point, r); var clockPointer = $('.clockPointer', container).get(0);
var ctxPointer = clockPointer.getContext('2d'); var run = function () {
drawPointer(ctxPointer, point, r, new Date());
requestAnimFrame(run);
}
run();
}) function drawCircle(ctx, point, r) {
ctx.beginPath();
ctx.arc(point.X, point.Y, r, 0, Math.PI * 2, true);
ctx.stroke(); ctx.beginPath();
ctx.arc(point.X, point.Y, 4, 0, Math.PI * 2, true);
ctx.fillStyle = "#ccc";
ctx.fill();
ctx.closePath();
for (var i = 0; i < 60; i++) {
drawScale(ctx, point, r, 5, i);
}
} function drawScale(ctx, point, r, len, scale) {
var angle = 360 * scale / 60 * 2 * Math.PI / 360 if (scale % 5 == 0) {
len = len + 3
ctx.lineWidth = 3;
}
else {
ctx.lineWidth = 1;
}
var sX = point.X - (r - len) * Math.sin(angle);
var sY = point.Y - (r - len) * Math.cos(angle);
var eX = point.X - r * Math.sin(angle);
var eY = point.Y - r * Math.cos(angle); ctx.beginPath();
ctx.strokeStyle = "#ccc";
ctx.moveTo(sX, sY);
ctx.lineTo(eX, eY);
ctx.stroke();
ctx.closePath();
} function drawPointer(ctx, point, r, time) {
ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
var hours = time.getHours();
var minutes = time.getMinutes();
var seconds = time.getSeconds();
var minSec = time.getMilliseconds();
var angleS = 2 * Math.PI * (60 * 1000 - seconds * 1000 - minSec) / (60 * 1000);
var esX = point.X - (r - 5) * Math.sin(angleS);
var esY = point.Y - (r - 5) * Math.cos(angleS); var eSec = { X: esX, Y: esY };
drawLine(ctx, point, eSec, 1); var angleM = 2 * Math.PI * (60 * 60 - minutes * 60 - seconds) / (60 * 60);
var emX = point.X - (r - 10) * Math.sin(angleM);
var emY = point.Y - (r - 10) * Math.cos(angleM); var eMinu = { X: emX, Y: emY };
drawLine(ctx, point, eMinu, 2); var angleH = 2 * Math.PI * ((24 * 60 * 60 - hours * 60 * 60 - minutes * 60 - seconds) % (12 * 60 * 60)) / (12 * 60 * 60);
var ehX = point.X - (r - 15) * Math.sin(angleH);
var ehY = point.Y - (r - 15) * Math.cos(angleH); var eHour = { X: ehX, Y: ehY };
drawLine(ctx, point, eHour, 3);
} function drawLine(ctx, pointS, pointE, lineWidth) {
ctx.lineWidth = lineWidth;
ctx.beginPath();
ctx.strokeStyle = "#808080";
ctx.moveTo(pointS.X, pointS.Y);
ctx.lineTo(pointE.X, pointE.Y);
ctx.stroke();
ctx.closePath();
} window.requestAnimFrame = (function () {
return window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function (run) {
window.setTimeout(run, 16);
};
})();
</script>
<style>
.container {
width: 300px;
height: 300px;
/*background: orange;*/
margin: 0 auto;
position: relative;
} canvas {
position: absolute;
}
</style>
</head>
<body>
<div class="container">
<canvas class="clockPanel" height="300" width="300"></canvas>
<canvas class="clockPointer" height="300" width="300"></canvas>
</div>
</body>
</html>

3、实现重点

    window.requestAnimFrame = (function () {
return window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function (run) {
window.setTimeout(run, 16);
};
})();
 

Html5画钟表盘/指针实时跳动的更多相关文章

  1. HTML5画:线、圆、矩形、渐变

    示例一:矩形 <!DOCTYPE html><head> <meta charset=utf-8> <title>HTML5画线.圆.矩形</ti ...

  2. [WPF] 使用 HandyControl 的 CirclePanel 画出表盘刻度

    1. 前言 最近需要一个 WPF 的表盘控件,之前 Cyril-hcj 写过一篇不错的博客 <WPF在圆上画出刻度线>,里面介绍了一些原理及详细实现的代码: double radius = ...

  3. 使用HTML5画饼图

    在进行数据的统计分析时, 饼图也是比较经常用到的一类统计图. 需求分析:   一个饼图一般包含以下几部分:   1.标题   2.扇形   3.份额(百分比)   4.标识器      设计:     ...

  4. 使用HTML5画柱状图

    柱状图在很多应用中都比较常见,例如投票结果的统计分析,企业销售数据的统计分析等等.    需求分析:  一个柱状图一般包含以下几部分:  1.标题  2.横坐标(含标题)  3.竖坐标 (含标题.刻度 ...

  5. html5画饼形图

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm10.aspx ...

  6. 一个给力的html5 画多边形的例子

    只需改变参数就能画出你想要的多边形,代码简单!不得不惊叹canvas的强大! 代码奉上 <!doctype html> <html> <head> <meta ...

  7. HTML5 画一张图

    笔者:本笃庆军 原文地址:http://blog.csdn.net/qingdujun/article/details/33344289 一.绘制图像 使用drawImage()方法绘制图像. 画图环 ...

  8. html5 画图板

    8个最新炫酷的HTML5动画应用 http://www.php100.com/html/it/qianduan/2015/0107/8281.html 另外一个画板demo http://www.os ...

  9. html5画四边形

    <canvas id='test02'></canvas> <script> var canvas = document.getElementById('test0 ...

随机推荐

  1. PHP校验日期格式是否合法

    在后端开发中,我们常常需要校验前端传入参数的合法性,如果是校验日期参数,我们可以通过下面的方法来校验: /** * 校验日期格式是否合法 * @param string $date * @param ...

  2. AndroidStudio制作欢迎界面与应用图标

    前言 大家好,给大家带来AndroidStudio制作欢迎界面与应用图标的概述,希望你们喜欢 欢迎界面与应用图标 本项目使用Android Studio 3.0.1作为开发工具 activity_sp ...

  3. Jmeter HTTP请求后响应数据显示乱码解决方法

    Jmeter请求后结果树里无论是text还是html响应数据显示乱码,这是因为jmeter 编码格式配置文件默认不开启导致的,解决方法如下: 1)进入jmeter-***\bin目录下,找到jmete ...

  4. [EXP]Drupal < 8.6.10 / < 8.5.11 - REST Module Remote Code Execution

    Analyzing the patch By diffing Drupal and , we can see that in the REST module, FieldItemNormalizer ...

  5. Python内置类型(5)--迭代器类型

    指能够被内置函数next调用并不断返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值的对象称为迭代器(Iterator) 其实以上的说法只是侠义上的迭代器的定义,在pyt ...

  6. keras中的mini-batch gradient descent (转)

    深度学习的优化算法,说白了就是梯度下降.每次的参数更新有两种方式. 一. 第一种,遍历全部数据集算一次损失函数,然后算函数对各个参数的梯度,更新梯度.这种方法每更新一次参数都要把数据集里的所有样本都看 ...

  7. Nginx+Keepalived 实现高可用

    Keepalived 是一个高性能的 服务器高可用 或 热备解决方案,Keepalived主要来防止服务器单点故障的问题,可以通过其与Nginx的配合来实现web服务端的高可用. Keepalived ...

  8. 基于python+appium+yaml安卓UI自动化测试分享

    结构介绍 之前分享过一篇安卓UI测试,但是没有实现数据与代码分离,后期维护成本较高,所以最近抽空优化了一下.不想看文章得可以直接去Github,欢迎拍砖大致结构如下:   结构.png testyam ...

  9. GO入门——7. 并发

    1 并发 1.1 goroutine Goroutine 奉行通过通信来共享内存,而不是共享内存来通信 goroutine 只是由官方实现的超级"线程池"而已. 每个实例 4-5K ...

  10. MariaDB 数据库

    1. MariaDB 介绍 MariaDB数据库管理系统是 MySQL 的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成 ...