canvas :原生javascript编写动态时钟

 
 

此时针是以画布的中心为圆心;

g.translate(width/2,width/2);

此函数是将画布的原点移到(width/2,width/2)

绘制表盘

function jiang(){
r = width/2
g.clearRect(0, 0, 600, 600); g.save();
g.translate(r, r);
g.rotate(-Math.PI / 2); //分钟刻度线 for(var i = 0; i < 60; i++) {//画60个刻度线
g.beginPath();
g.strokeStyle ="white";
g.lineWidth = 4;
g.moveTo(250, 0);
g.lineTo(240, 0);
g.stroke();
g.rotate(Math.PI / 30); //每个6deg画一个时钟刻度线
g.closePath();
} //时钟刻度线
for(var i = 0; i < 12; i++) {//画12个刻度线
g.beginPath();
g.strokeStyle ="white";
g.lineWidth = 8;
g.moveTo(250, 0);
g.lineTo(230, 0);
g.stroke();
g.rotate(Math.PI / 6); //每个30deg画一个时钟刻度
g.closePath();
}
}

时针

save和restore必不可少,在这两个函数之间,改变位置不会影响到其他函数,在此段代码中特指rotate,如果没有rotate,可以不用save和restore

一定要加beginPath,免得被其他函数影响

时针和分针秒针不一样,一个30°,还有分针的移动会影响时针的位置

时针运动的原理是画好一条线,然后旋转那条线

            function drawHour(hour,minu){
g.save();
g.beginPath();
g.lineWidth = 9;
var rad = Math.PI*2/12*hour;
var radMinu = Math.PI*2/12/60*minu;
g.rotate(rad + radMinu)
g.moveTo(-10,0);
g.lineTo(r/2,0);
g.strokeStyle = "white";
g.stroke();
g.restore();
}

分针

            function drawMinu(minu){
g.save();
g.beginPath();
g.lineWidth = 6;
var radMinu = Math.PI*2/60*minu;
g.rotate(radMinu)
g.moveTo(-16,0);
g.lineTo(r-100,0);
g.strokeStyle = "white";
g.stroke();
g.restore();
}

秒针

       function drawSeco(seco){
g.save();
g.beginPath();
g.lineWidth = 3;
var radSeco = Math.PI*2/60*seco;
g.rotate(radSeco)
g.moveTo(-25,0);
g.lineTo(r-80,0);
g.strokeStyle = "#ff0032";
g.stroke();
g.restore();
}

数字表

        function drawNumClock(){
var data = new Date(); var sec = data.getSeconds();
var min = data.getMinutes();
var hour = data.getHours(); g.fillStyle = "white";
g.font = "20px '楷体'";
g.beginPath();
g.rotate(Math.PI/2)
g.fillText(hour,60,0);
g.fillText(":",80,0);
g.fillText(min,90,0);
g.font = "20px '楷体'";
g.fillText(sec,120,0); }

下面附上整体代码:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>时钟</title>
<style type="text/css">
.kuang{
width: 600px;
height: 600px;
margin: auto;
padding: 5;
}
</style>
</head>
<body>
<div class="kuang">
<canvas id="zhong" width="600" height="600"></canvas>
</div>
<script type="text/javascript">
var canvas =document.querySelector("canvas");
canvas.style.background ="paleturquoise";
var g = canvas.getContext("2d");
var width = canvas.width;
var height = canvas.height; //绘制转盘时钟 function jiang(){
r = width/2
g.clearRect(0, 0, 600, 600); g.save();
g.translate(r, r);
g.rotate(-Math.PI / 2); //分钟刻度线 for(var i = 0; i < 60; i++) {//画60个刻度线
g.beginPath();
g.strokeStyle ="white";
g.lineWidth = 4;
g.moveTo(250, 0);
g.lineTo(240, 0);
g.stroke();
g.rotate(Math.PI / 30); //每个6deg画一个时钟刻度线
g.closePath();
} //时钟刻度线
for(var i = 0; i < 12; i++) {//画12个刻度线
g.beginPath();
g.strokeStyle ="white";
g.lineWidth = 8;
g.moveTo(250, 0);
g.lineTo(230, 0);
g.stroke();
g.rotate(Math.PI / 6); //每个30deg画一个时钟刻度
g.closePath();
}
} /*画时针*/
function drawHour(hour,minu){
g.save();
g.beginPath();
g.lineWidth = 9;
var rad = Math.PI*2/12*hour;
var radMinu = Math.PI*2/12/60*minu;
g.rotate(rad + radMinu)
g.moveTo(-10,0);
g.lineTo(r/2,0);
g.strokeStyle = "white";
g.stroke();
g.restore();
}
/*画分针*/
function drawMinu(minu){
g.save();
g.beginPath();
g.lineWidth = 6;
var radMinu = Math.PI*2/60*minu;
g.rotate(radMinu)
g.moveTo(-16,0);
g.lineTo(r-100,0);
g.strokeStyle = "white";
g.stroke();
g.restore();
}
/*画秒针*/
function drawSeco(seco){
g.save();
g.beginPath();
g.lineWidth = 3;
var radSeco = Math.PI*2/60*seco;
g.rotate(radSeco)
g.moveTo(-25,0);
g.lineTo(r-80,0);
g.strokeStyle = "#ff0032";
g.stroke();
g.restore();
}
/*数字表*/
function drawNumClock(){
var data = new Date(); var sec = data.getSeconds();
var min = data.getMinutes();
var hour = data.getHours(); g.fillStyle = "white";
g.font = "20px '楷体'";
g.beginPath();
g.rotate(Math.PI/2)
g.fillText(hour,60,0);
g.fillText(":",80,0);
g.fillText(min,90,0);
g.font = "20px '楷体'";
g.fillText(sec,120,0); } function draw(){ var data = new Date();
var sec = data.getSeconds();
var min = data.getMinutes();
var hour = data.getHours();
jiang();
drawHour(hour,min);
drawMinu(min);
drawSeco(sec);
drawNumClock()
g.restore(); } setInterval(draw,10) </script> </body>
</html>
  

canvas :原生javascript编写动态时钟的更多相关文章

  1. 原生 Javascript 编写五子棋

    原文地址:原生 Javascript 编写五子棋 博客地址:http://www.extlight.com 一.背景 近一个月没写 Javascript 代码,有点生疏.正好浏览网页时弹出五子棋的游戏 ...

  2. 原生JS实现动态时钟(优化)

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  3. 用原生CSS编写动态字体

    HTML部分: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <t ...

  4. 《ASP.NET1200例》C#在网页上编写动态时钟

    包含Timer类的命名空间有3个 Timer Class (System.Threading)‎ Timer Class (System.Windows.Forms)‎ 一般用于窗体程序 Timer  ...

  5. 原生javascript模仿win8等待进度条。

    一.序言 一直很中意win8等待提示圆圈进度条.win8刚出来那会,感觉好神奇!苦于当时没思路,没去研究.通过最近网上找找资料,终于给搞出来了!先上Demo,献丑了!预览请看:win8进度条. 二.简 ...

  6. 原生javascript写的侧栏跟随效果

    浏览网站时经常看到有的网站上,当一个页面很长的时候,设定侧栏内容会跟随滚动条滚动,我们把这种效果叫做“侧栏跟随滚动”.这种特效对提高网站浏览量.文章点击率.广告点击量都有一定效果. 侧栏跟随滚动的实现 ...

  7. 环形进度条的实现方法总结和动态时钟绘制(CSS3、SVG、Canvas)

    缘由: 在某一个游戏公司的笔试中,最后一道大题是,“用CSS3实现根据动态显示时间和环形进度[效果如下图所示],且每个圆环的颜色不一样,不需要考虑IE6~8的兼容性”.当时第一想法是用SVG,因为SV ...

  8. JavaScript+svg绘制的一个动态时钟

    结果图: 代码如下: <!DOCTYPE html> <html> <head> <title>动态时钟</title> </head ...

  9. 使用原生JavaScript的Canvas实现拖拽式图形绘制,支持画笔、线条、箭头、三角形、矩形、平行四边形、梯形以及多边形和圆形,不依赖任何库和插件,有演示demo

    前言 需要用到图形绘制,没有找到完整的图形绘制实现,所以自己实现了一个 - - 一.实现的功能 1.基于oop思想构建,支持坐标点.线条(由坐标点组成,包含方向).多边形(由多个坐标点组成).圆形(包 ...

随机推荐

  1. Django两天搭建个人博客

    传送门:https://github.com/1417766861/django-blog(可直接运行,上面有步骤) 效果: 首页: 侧栏: 详情页面: 修改头像,资料,文章发布: 支持添加标签拖拽 ...

  2. 刚破了潘金莲的身份信息(图片文字识别),win7、win10实测可用(免费下载)

    刚破了潘金莲的身份信息(图片文字识别),win7.win10实测可用 效果如下: 证照,车牌.身份证.名片.营业执照 等图片文字均可识别 电脑版 本人出品 大小1.3MB 下载地址:https://p ...

  3. Spring Cloud Hystrix

    接上篇: Spring Cloud Eureka 使用命令开启两个服务提供者 java -jar .\hello--SNAPSHOT.jar --server.port= java -jar .\he ...

  4. 记住,永远不要在MySQL中使用“utf8”编码[转载]

    记住,永远不要在MySQL中使用“utf8”编码 原创: 无明.Adam 聊聊架构 6月15日 最近工作中我遇到了一个 bug,我试着通过 Rails 在以“utf8”编码的 MariaDB 中保存一 ...

  5. 使用Codis-Admin命令配置环境

    前提条件:由于22.35.60服务器各自配置了Codis-Service主机,所以22.35.60对应的ip和端口要求能通信和互信访问,为下面通过60的dashboard配置22.35.60实现分组. ...

  6. [机器学习] 训练集(train set) 验证集(validation set) 测试集(test set)

    在有监督(supervise)的机器学习中,数据集常被分成2~3个即: 训练集(train set) 验证集(validation set) 测试集(test set) 一般需要将样本分成独立的三部分 ...

  7. java权限控制以及变量的初始化

    知识是靠积累的,不断的温习会帮你让你遇到许多问题,解决完这些问题之后,会收获许多,233333333333333. 1.java访问控制符 2.java变量初始化问题 默认构造方法的名字与类名相同,它 ...

  8. wpf 控件大小随窗体大小改变而改变

    WPF可以直接通过设置图形类控件的水平和垂直Alighment为Stretch实现用一个ViewBox装上所有的Window内容然后当window缩放时就可以一起放大缩小了ViewBox的显示机制是, ...

  9. WCF 获取客户端IP

    public class Service2 : IService2 { public User DoWork() { Console.WriteLine(ClientIpAndPort()); }; ...

  10. 撩课-Web大前端每天5道面试题-Day34

    1.React 中 keys 的作用是什么? Keys 是 React 用于追踪哪些列表中元素被修改.被添加或者被移除的辅助标识. render () { return ( <ul> {t ...