注意:Internet Explorer 9、Firefox、Opera、Chrome 以及 Safari 支持 <canvas> 及其属性和方法。Internet Explorer 8 以及更早的版本不支持 <canvas> 元素

效果图如下:

   时钟效果图

实现代码:(代码中有相应注释介绍,比较好懂,如果实在有不懂得地方,欢迎私信,或者参考W3C文档)

  1 <!DOCTYPE html>
  2 <html>
  3     <head>
  4         <meta charset="utf-8" />
  5         <title>时钟</title>
  6         <style type="text/css">
  7             div{
  8                 text-align: center;
  9             }
 10         </style>
 11     </head>
 12     <body>
 13         <!--该div作用:让时钟在屏幕中间-->
 14         <div>
 15             <canvas width="800px" height="800px" id="myCanvas"></canvas>
 16         </div>
 17         
 18         <script>
 19             var myCanvas = document.getElementById("myCanvas");
 20             var ctx  = myCanvas.getContext("2d");
 21             //获取画布宽和高
 22             var w = myCanvas.width;
 23             var h = myCanvas.height;
 24             
 25 
 26             //时钟表盘大小
 27             var r = w/2;
 28             
 29             
 30             //时钟表盘上的时间及刻度
 31             function fun(){
 32                 ctx.save();//保存当前环境的状态
 33                 //填充的渐变色
 34                 var r1 = Math.floor(Math.random()*256);
 35                 var g1 = Math.floor(Math.random()*256);
 36                 var b1 = Math.floor(Math.random()*256);
 37                 var grd=ctx.createLinearGradient(0,0,0,r);
 38                 grd.addColorStop(0,"rgb("+r1+","+g1+","+b1+")");
 39                 grd.addColorStop(0.5,"rgb("+b1+","+g1+","+r1+")");
 40                 grd.addColorStop(1,"rgb("+g1+","+b1+","+r1+")");
 41                 
 42                 //重新映射画布上的 (0,0) 位置,即改变画布原点位置
 43                 ctx.translate(r,r);
 44                 ctx.beginPath();
 45                 ctx.lineWidth = 10;
 46                 ctx.arc(0,0,r-12,0,2*Math.PI,false);
 47                 ctx.strokeStyle = grd;
 48                 ctx.stroke();
 49                 ctx.closePath();
 50                 //设置时间刻度字体大小,对其方式,基线
 51                 ctx.font = "22px Arial";
 52                 ctx.textAlign = "center";
 53                 ctx.textBaseline = "middle"
 54                 //定义一个数组用于保存时间刻度
 55                 var num = [3,4,5,6,7,8,9,10,11,12,1,2];
 56                 //循环将时间显示在表盘中
 57                 for(var i = 0;i < num.length; i++){
 58                     //定义时间刻度在表盘中相应弧度,根据弧度利用正弦余弦公式求出该刻度横坐标和纵坐标
 59                     //数字3为数组第一个数字刻度是因为,绘制圆时(0弧度)是从3对应刻度位置开始的
 60                     var rad = Math.PI*2/12*i;
 61                     var x = Math.cos(rad)*(r-60);
 62                     var y = Math.sin(rad)*(r-60);
 63                     ctx.beginPath();
 64                     //填充文本
 65                     ctx.fillText(num[i],x,y);
 66                     ctx.fillStyle = grd;
 67                     ctx.closePath();
 68                 }
 69                 
 70                 for(var i = 0;i < 60; i++){
 71                     var rad = Math.PI*2/60*i;
 72                     var x = Math.cos(rad)*(r-40);
 73                     var y = Math.sin(rad)*(r-40);
 74                     ctx.beginPath();
 75                     ctx.arc(x,y,6,0,2*Math.PI,false);
 76                     //时间刻度点取余,与现实表盘相对应
 77                     if(i%5==0){
 78                         ctx.fillStyle = grd;
 79                         ctx.arc(x,y,10,0,2*Math.PI,false);
 80                     }else{
 81                         ctx.fillStyle = grd;
 82                     }
 83                     ctx.fill()
 84                     ctx.closePath();
 85                 }
 86             }
 87             
 88             //绘制时针
 89             function drawHour(hour,minute){
 90                 ctx.save();
 91                 //填充的渐变色
 92                 var r1 = Math.floor(Math.random()*256);
 93                 var g1 = Math.floor(Math.random()*256);
 94                 var b1 = Math.floor(Math.random()*256);
 95                 var grd=ctx.createLinearGradient(0,0,0,r);
 96                 grd.addColorStop(0,"rgb("+g1+","+r1+","+b1+")");
 97                 grd.addColorStop(0.5,"rgb("+r1+","+b1+","+g1+")");
 98                 grd.addColorStop(1,"rgb("+r1+","+g1+","+r1+")");
 99                 
100                 //设置时针旋转角度
101                 var rad = Math.PI*2/12*hour;
102                 //分针旋转角度会对时针起影响,将对应分针旋转角度加上
103                 var rad_min = Math.PI*2/12/60*minute
104                 //旋转
105                 ctx.rotate(rad+rad_min);
106                 ctx.lineWidth = 8;
107                 ctx.beginPath();
108                 ctx.moveTo(0,10);
109                 ctx.lineTo(0,-r/2)
110                 ctx.closePath();
111                 ctx.strokeStyle = grd;
112                 ctx.stroke();
113                 ctx.restore();//返回之前保存过的路径状态和属性
114             }
115             
116             //绘制分针,绘制过程和时针相似
117             function drawMinute(minute,second){
118                 ctx.save();
119                 
120                 var rad = Math.PI*2/60*minute;
121                 var rad_seco = Math.PI*2/3600*second
122                 ctx.rotate(rad + rad_seco);
123                 ctx.lineWidth = 6;
124                 ctx.beginPath();
125                 ctx.moveTo(0,20);
126                 ctx.lineTo(0,-r+150)
127                 ctx.lineCap = "round";
128                 ctx.stroke();
129                 ctx.restore();
130             }
131             
132             //绘制秒针
133             function drawScond(second){
134                 ctx.save();
135                 //填充的渐变色
136                 var r1 = Math.floor(Math.random()*256);
137                 var g1 = Math.floor(Math.random()*256);
138                 var b1 = Math.floor(Math.random()*256);
139                 var grd=ctx.createLinearGradient(0,0,0,r);
140                 grd.addColorStop(0,"rgb("+r1+","+g1+","+b1+")");
141                 grd.addColorStop(0.5,"rgb("+b1+","+g1+","+r1+")");
142                 grd.addColorStop(1,"rgb("+g1+","+b1+","+r1+")");
143                 
144                 var rad = Math.PI*2/60*second;
145                 ctx.rotate(rad);
146                 ctx.beginPath();
147                 ctx.moveTo(-2,30);
148                 ctx.lineTo(2,10)
149                 ctx.lineTo(1,-r+50);
150                 ctx.lineTo(-1,-r+50);
151                 ctx.fillStyle = grd;
152                 ctx.fill();
153                 //绘制秒针中间点缀
154                 ctx.beginPath();
155                 ctx.strokeStyle = grd;
156                 ctx.arc(0,-r/2,3,0,2*Math.PI,false);
157                 ctx.stroke();
158                 ctx.arc(0,-r/2,2,0,2*Math.PI,false);
159                 ctx.fillStyle = grd;
160                 ctx.fill()
161                 ctx.restore();
162             }
163             
164             //绘制固定时针分针秒针的中心点
165             function drawDot(){
166                 ctx.beginPath();
167                 ctx.fillStyle = "white";
168                 ctx.arc(0,0,4,0,2*Math.PI,false);
169                 ctx.closePath();
170                 ctx.fill();
171             }
172             
173             //获取系统当前时间,调用函数,传参数
174             function drawClock(){
175                 ctx.clearRect(0,0,w,h);
176                 var now = new Date();
177                 var hour = now.getHours();
178                 var minute = now.getMinutes();
179                 var second = now.getSeconds();
180                 fun();
181                 drawHour(hour,minute);
182                 drawMinute(minute,second);
183                 drawScond(second);
184                 drawDot();
185                 ctx.restore();
186             }
187             
188             //调用函数显示表盘
189             drawClock();
190             //设置定时器,跟随系统让时钟动起来
191             setInterval(drawClock,1000);
192         </script>
193     </body>
194 </html>

 

posted on 2018-12-12 19:15  薇依  阅读(1364)  评论(0编辑  收藏  举报