用HTML5的canvas完成1个酷炫数字时钟实际效果

2021-02-24 11:39 jianzhan

针对H5来讲,canvas能够说是它最有特点的1个地区了,有了它以后大家能够随便的在网页页面上画各种各样各种各样的图型,做1些小手机游戏啊甚么的。canvas这个标识的用法,在网络上也是有非常多的实例教程了,这里就不作详细介绍了。今日大家就用canvas来做1个小小的的数字时钟。

那末最先在这个网页页面里边我应用了两个canvas,1个用来绘图静态数据的数字时钟表盘和刻度,另外一个用来绘图数字时钟的3个指针,随后用精准定位让她们重叠到1起。随后这里没甚么好说的,下面附上编码。

JavaScript Code拷贝內容到剪贴板
  1. <canvas id="plate">   
  2.         画表盘   
  3. </canvas>   
  4. <canvas id="needles">   
  5.         画时针   
  6. </canvas>  
JavaScript Code拷贝內容到剪贴板
  1. var plate=document.getElementById('plate');   
  2. var needles=document.getElementById('needles');   
  3. needles.setAttribute('style','position:absolute;top:8px;left:8px;');  //这里由于chrome里边,body的magin值为8px,因此我这里就没设为0了。   
  4. var cntP=plate.getContext('2d');   
  5. var cntH=needles.getContext('2d');   
  6. plate.width=800;   
  7. plate.height=500;   
  8. needles.width=800;   
  9. needles.height=500;  

到了这里提前准备工作中就做完了,下面就提前准备绘图数字时钟了。我先界定了1个绘图数字时钟表盘的结构涵数。

JavaScript Code拷贝內容到剪贴板
  1. function drawclock(cnt,radius,platelen,linewidth,numLen,NUMLEN){   
  2.             this.cnt=cnt;   
  3.             this.radius=radius;   
  4.             this.platelen=platelen;   
  5.             this.linewidth=linewidth;   
  6.             this.numLen=numLen;   
  7.             this.NUMLEN=NUMLEN;   
  8.             this.getCalibCoor=function(i){     
  9.                 //得到表盘刻度两边的座标   
  10.                 var X=200+this.radius*Math.sin(6*i*Math.PI/180);   
  11.                 var Y=200-this.radius*Math.cos(6*i*Math.PI/180);   
  12.                 var x=200+(this.radius-this.platelen)*Math.sin(6*i*Math.PI/180);   
  13.                 var y=200-(this.radius-this.platelen)*Math.cos(6*i*Math.PI/180);   
  14.   
  15.                 // 得到分钟数据的座标   
  16.                 var numx=200+(this.radius-this.platelen-this.numLen)*Math.sin(6*i*Math.PI/180);   
  17.                 var numy=200-(this.radius-this.platelen-this.numLen)*Math.cos(6*i*Math.PI/180);   
  18.                 //得到小时数据的座标   
  19.                 var numX=200+(this.radius-this.platelen-this.NUMLEN)*Math.sin(6*i*Math.PI/180);     
  20.                 var numY=200-(this.radius-this.platelen-this.NUMLEN)*Math.cos(6*i*Math.PI/180);   
  21.                 return {X:X,Y:Y,x:x,y:y,numx:numx,numy:numy,numX:numX,numY:numY};   
  22.             };   
  23.             this.drawCalibration=function(){ //画刻度   
  24.                 for(var i=0,coorObj;i<60;i++){   
  25.                     coorObj=this.getCalibCoor(i);   
  26.                     this.cnt.beginPath();   
  27.                     this.cnt.moveTo(coorObj.X,coorObj.Y);   
  28.                     this.cnt.lineTo(coorObj.x,coorObj.y);   
  29.                     this.cnt.closePath();   
  30.   
  31.                     this.cnt.lineWidth=this.linewidth;   
  32.                     this.cnt.strokeStyle='#ddd';   
  33.                     i%5==0&&(this.cnt.strokeStyle='#aaa')   
  34.                     &&(this.cnt.lineWidth=this.linewidth*2);   
  35.                     i%15==0&&(this.cnt.strokeStyle='#999')   
  36.                     &&(this.cnt.lineWidth=this.linewidth*3);   
  37.                     this.cnt.stroke();   
  38.   
  39.                     this.cnt.font='10px Arial';   
  40.                     this.cnt.fillStyle='rgba(0,0,0,.2)';   
  41.                     this.cnt.fillText(i,coorObj.numx⑺,coorObj.numy+3);   
  42.                     i%5==0&&(this.cnt.fillStyle='rgba(0,0,0,.5)')   
  43.                         &&(this.cnt.font='18px Arial')   
  44.                         &&(this.cnt.fillText(i/5,coorObj.numX⑸,coorObj.numY+5));   
  45.                 }   
  46.             };   
  47.         }   
  48.   
  49.       var clock=new drawclock(cntP,200,5,1,10,25); //案例化1个表盘目标   
  50.       clock.drawCalibration();  

这里最关键的一部分就应当是得到刻度和数据绘图的座标了。我把绘图刻度的起止点放在了表盘的边沿上,随后从表盘的半径上减去刻度的长度,便可以获得刻度终点站的部位,随后运用角度和3角涵数获得两个点的座标。最终便可以绘图出表盘的刻度了。下面绘图出表盘上的数据也是1样的方式。我这里吧表盘的管理中心放在了(200,200)这里部位。到了这里大家就早已绘图好了1个静态数据的数字时钟表盘。

下面我又界定了1个绘图数字时钟指针的结构涵数。

JavaScript Code拷贝內容到剪贴板
  1. function clockNeedle(cnt,R,lineWidth,strokeStyle,lineCap,obj){   
  2.             this.R=R;   
  3.             this.cnt=cnt;   
  4.             this.lineWidth=lineWidth;   
  5.             this.strokeStyle=strokeStyle;   
  6.             this.lineCap=lineCap;   
  7.             this.obj=obj;   
  8.             this.getNeedleCoor=function(i){   
  9.                 var X=200+this.R*0.8*Math.sin(i); //起始点的座标   
  10.                 var Y=200-this.R*0.8*Math.cos(i);   
  11.   
  12.                 var x=200⑵0*Math.sin(i); //终点站的座标   
  13.                 var y=200+20*Math.cos(i);   
  14.                 return {X:X,Y:Y,x:x,y:y};   
  15.             };   
  16.             this.drawNeedle=function(){   
  17.                 var d=new Date().getTime();   
  18.                 var angle;   
  19.                 switch(this.obj){   
  20.                     case 0:   
  21.                     angle=(d/3600000%24+8)/12*360*Math.PI/180;   
  22.                     break;   
  23.                     case 1:   
  24.                     angle=d/60000%60/60*360*Math.PI/180;   
  25.                     break;   
  26.                     case 2:   
  27.                     angle=d/1000%60/60*360*Math.PI/180;   
  28.                     break;   
  29.                 }   
  30.                 var coorobj=this.getNeedleCoor(angle);   
  31.                 this.cnt.beginPath();   
  32.                 this.cnt.moveTo(coorobj.x,coorobj.y);   
  33.                 this.cnt.lineTo(coorobj.X,coorobj.Y);   
  34.                 // this.cnt.closePath();   
  35.   
  36.                 this.cnt.lineWidth=this.lineWidth;   
  37.                 this.cnt.strokeStyle=this.strokeStyle;   
  38.                 this.cnt.lineCap=this.lineCap;   
  39.                 this.cnt.stroke();   
  40.             }   
  41.         }  

这里有两个地区必须说1下:1、在大家得到当今時间的的毫秒数,随后变换为小时的情况下,对24取模测算出当天的小时数的情况下,这里必须再加8。2、假如要想应用lineCap这个特性吗,那末上面在设定相对路径的情况下,不必用closePath()。

到了这里大家还必须1个来绘图指针的方式,而且让指针看起来可以旋转:

JavaScript Code拷贝內容到剪贴板
  1. function draw(){   
  2.             cntH.clearRect(0,0,needles.width,needles.height);   
  3.             var mzneedle=new clockNeedle(cntH,200,1,'rgba(0,0,0,.5)','round',2);   
  4.             //最终1个主要参数0意味着画时针,1画分针,2画秒针   
  5.             var fzneedle=new clockNeedle(cntH,80,3,'rgba(0,0,0,.4)','round',0);   
  6.             var szneedle=new clockNeedle(cntH,140,2,'rgba(0,0,0,.3)','round',1);   
  7.             mzneedle.drawNeedle();   
  8.             fzneedle.drawNeedle();   
  9.             szneedle.drawNeedle();   
  10.             cntH.arc(200,200,5,0,2*Math.PI);   
  11.             cntH.fillStyle='rgba(0,0,0,.5)';   
  12.             cntH.fill();   
  13.  }   
  14.  setInterval(draw,1);  

下面附上该数字时钟的照片:

以上这篇用HTML5的canvas完成1个酷炫数字时钟实际效果便是网编共享给大伙儿的所有內容了,期待能给大伙儿1个参照,也期待大伙儿多多适用脚本制作之家。

原文详细地址:http://www.cnblogs.com/ww-ervin⑺2/p/5325773.html