使用js实现时钟效果

楼主
我是社区第73248位番薯,欢迎点我头像关注我哦~
前段时间逛论坛的时候,发现了这个帖子
FineReport V8.0 插件开发之酷炫时钟控件http://bbs.fanruan.com/thread-66972-1-1.html
效果好酷啊有木有,遗憾的是帖子中的链接已经失效了,在插件商场中也找不到相关的插件。
于是就想自己动手用js写一个。
首先在单元格中输入下面的代码,然后使用html显示内容。
  1. <canvas id="view" height="300px" width="300px"></canvas>
复制代码
这个宽高可以根据自己需要填。

然后在预览方式中添加加载结束事件:
  1. var dom=document.getElementById("view");  //获取canvas元素
  2. var ctx=dom.getContext("2d");            //创建context对象
  3. var width=ctx.canvas.width;
  4. var height=ctx.canvas.height;
  5. var r=width/2;

  6. //绘制时钟背景
  7. function drawBackground(){
  8.         ctx.translate(r,r);      //将画布原点重置为画布的中心
  9.         ctx.beginPath();
  10.         ctx.lineWidth=10;
  11.         ctx.arc(0,0,r-5,0,2*Math.PI);    //绘制一个圆,即时钟的边框
  12.         ctx.stroke();
  13.        
  14.         //绘制时钟上的刻度
  15.         for(var i=0;i<60;i++){
  16.     var x=(r-20)*Math.cos(Math.PI*2/60*i);
  17.     var y=(r-20)*Math.sin(Math.PI*2/60*i);       
  18.         //每逢5个刻度使用黑色绘制,其余用灰色绘制       
  19.     if(i%5===0){
  20.                 ctx.fillStyle="#000000";
  21.         }else{
  22.                 ctx.fillStyle="#cccccc";
  23.         }
  24.         ctx.beginPath();
  25.         ctx.arc(x,y,5,0,2*Math.PI);
  26.         ctx.fill();
  27.         }
  28.         //绘制时钟上的数字
  29.         ctx.font="20px Arial";
  30.         ctx.textAlign="center";
  31.         ctx.textBaseline="middle";
  32.         ctx.fillStyle="#000000";
  33.         for(var j=0;j<12;j++){
  34.     var ax=(r-50)*Math.cos(Math.PI*2/12*j);
  35.     var ay=(r-50)*Math.sin(Math.PI*2/12*j);       
  36.         ctx.beginPath();
  37.         ctx.fillText(j>9?j-9:j+3,ax,ay);  //因为PI的角度计算是从3点钟方向顺时针计算的,所以要对数字判断处理
  38.         ctx.fill();
  39.         }
  40. }

  41. //绘制时针
  42. function drawHour(hour,minute,second){
  43.         ctx.save();      //保存当前绘图环境
  44.         ctx.beginPath();
  45.         //时针的角度等于小时的角度加分钟和秒钟转化为小时的角度
  46.         var rad=2*Math.PI/12*hour+2*Math.PI/12/60*minute+2*Math.PI/12/60/3600*second;
  47.         ctx.rotate(rad);
  48.         ctx.lineWidth=14;
  49.         ctx.lineCap="round"; //设置画线结束端为圆帽形
  50.         ctx.moveTo(0,20);
  51.         ctx.lineTo(0,-r+100);
  52.         ctx.stroke();
  53.         ctx.restore();   //返回之前保存的绘图环境
  54. }

  55. //绘制分针
  56. function drawMinute(minute,second){
  57.         ctx.save();      //保存当前绘图环境
  58.         ctx.beginPath();
  59.         //分针的角度等于分钟的角度加秒钟转化为分钟的角度
  60.         var rad=2*Math.PI/60*minute+2*Math.PI/3600*second;
  61.         ctx.rotate(rad);
  62.         ctx.lineWidth=10;
  63.         ctx.lineCap="round";
  64.         ctx.moveTo(0,20);
  65.         ctx.lineTo(0,-r+80);
  66.         ctx.stroke();
  67.         ctx.restore();   //返回之前保存的绘图环境
  68. }

  69. //绘制秒针
  70. function drawSecond(second){
  71.         ctx.save();      //保存当前绘图环境
  72.         ctx.beginPath();
  73.         ctx.fillStyle="#FF0000";
  74.         var rad=2*Math.PI/60*second;   //秒针的角度为当前秒钟的角度
  75.         ctx.rotate(rad);
  76.         ctx.lineWidth=2;
  77.         ctx.lineCap="round";
  78.         ctx.moveTo(0,30);
  79.         ctx.lineTo(8,0);
  80.         ctx.lineTo(0,-r+30);
  81.         ctx.lineTo(-8,0);
  82.         ctx.lineTo(0,30);
  83.         ctx.fill();
  84.         ctx.restore();   //返回之前保存的绘图环境
  85. }

  86. //重新绘制时钟
  87. function run(){
  88.         ctx.clearRect(0,0,width,height);   //清空整张画布,在下面的代码中重新绘制
  89.         ctx.save();     //保存当前绘图环境
  90.         var time =new Date();      //获取当前时间
  91.         var hour=time.getHours();    //获取小时数
  92.         var minute=time.getMinutes();  //获取分钟数
  93.         var second=time.getSeconds();  //获取秒数
  94.         drawBackground();              //绘制背景
  95.     drawHour(hour,minute,second);  //绘制时针
  96.     drawMinute(minute,second);     //绘制分针
  97.     drawSecond(second);            //绘制秒针
  98.         //绘制时钟中心的那个点
  99.     ctx.fillStyle="#555";
  100.     ctx.beginPath();
  101.         ctx.arc(0,0,8,0,2*Math.PI);
  102.         ctx.fill();
  103.         ctx.restore();  //返回之前保存的绘图环境
  104. }
  105. window.setInterval(function(){run();},1000);  //每隔一秒重新绘制时钟
复制代码

如果是在表单中,就添加报表块然后执行相同操作,然后在报表块的事件里把上述js代码添加到下面代码的function里面
  1. setTimeout(function(){ },1000);
复制代码
最后上个效果图:

时钟效果.cpt (11.15 KB, 下载次数: 213)                                                                               clock.cpt (7.06 KB, 下载次数: 203)


添加注释 添加模板
编辑于 2018-1-15 21:30  
编辑于 2018-1-23 18:42  
编辑于 2018-1-27 16:51  

编辑于 2018-1-27 16:54  
分享扩散:
参与人数 +2 F豆 +266 理由
兔子酱 + 166 感谢参与精华帖奖励计划~~
happy_cangcang + 100 牛牛牛

查看全部评分

沙发
发表于 2018-1-15 23:42:29
我是来抢沙发的
板凳
发表于 2018-1-15 23:45:18
地板
发表于 2018-1-16 08:39:38
5楼
发表于 2018-1-16 08:49:38
厉害了,偷走拿来用用
6楼
发表于 2018-1-16 09:27:21
已提名精华帖,待论坛运营委员会评分后可评为精华帖,帆软论坛精华帖奖励计划http://bbs.fanruan.com/thread-91079-1-1.html
欢迎楼主补充更多细节或者回复交流~~
7楼
发表于 2018-1-16 09:52:13
能请教下这个动图是怎么截取出来的?
8楼
发表于 2018-1-16 10:48:35
好望角 发表于 2018-1-16 09:52
能请教下这个动图是怎么截取出来的?

用这个软件

9楼
发表于 2018-1-16 14:33:23
好厉害,我要像你学习
10楼
发表于 2018-1-16 16:41:40
转走了。。。
11楼
发表于 2018-1-16 17:34:10
happy_cangcang 发表于 2018-1-16 14:33
好厉害,我要像你学习

你的移动端视频才是厉害,我的移动端才刚入门呢,要多多向你讨教
12楼
发表于 2018-1-26 21:12:25
13楼
发表于 2018-1-27 16:33:06
14楼
发表于 2018-1-27 16:57:16
15楼
发表于 2018-2-28 17:06:12
有用有用
16楼
发表于 2018-8-7 19:51:38
17楼
发表于 2018-8-9 14:38:09
18楼
发表于 2018-8-9 22:42:14
太牛了
19楼
发表于 2018-11-26 17:06:35
20楼
发表于 2020-4-22 15:35:06
膜拜大拿
21楼
发表于 2020-9-8 10:55:18
想改下时钟 分针 和秒针 及外框 颜色,怎么修改!ctx.fillStyle=   都改过了,还是黑色
编辑于 2020-9-15 08:37  
22楼
发表于 2020-9-15 08:33:29
function 是什么?
另外时间不准!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

38回帖数 5关注人数 50996浏览人数
最后回复于:2020-12-29 12:46

返回顶部 返回列表