用canvas做时钟其实很简单,下面是我做出的效果:

是不是还挺漂亮的?

下面上代码:

html

<div class="whole">
<canvas id="canvas" width="450" height="450"></canvas>
<canvas id="canvas1" width="300" height="300"></canvas>
</div>

这里我用了两个canvas,第一个是用来显示刻度和数字的大圆,第二个是用来显示指针的小圆,因为指针的位置一秒要改变一次,如果用一个canvas,使用clearRect()时就要先清除所有元素再重新画一遍,用两个canvas只要清除指针就可以了

css

*{
margin:;
padding:;
}
.whole{
width: 450px;
height: 450px;
position: relative;
}
#canvas{
background: cornflowerblue;
border-radius: 50px;
}
#canvas1{
background: transparent;
border-radius: 150px;
position: absolute;
left: 75px;
top: 75px;
z-index:;
}

设置了一些样式,让钟表更好看

js

let canvas=document.getElementById('canvas');
let context=canvas.getContext('2d'); //绘制时钟轮廓
context.beginPath();
context.lineWidth=5;
context.arc(225,225,220,0,Math.PI*2);
context.fillStyle="#FFFFFF";
context.fill();
context.stroke(); //分刻度
context.beginPath();
context.lineWidth=2;
for(let i=0;i<60;i++){
context.save();
context.translate(225,225);
context.rotate(i*6*Math.PI/180);
context.moveTo(0,-210);
context.lineTo(0,-220);
context.restore();
}
context.closePath();
context.stroke();
//时刻度
context.beginPath();
context.lineWidth=5;
for(let i=0;i<12;i++){
context.save();
context.translate(225,225);
context.rotate(i*30*Math.PI/180);
context.moveTo(0,-200);
context.lineTo(0,-220);
context.restore();
}
context.closePath();
context.stroke();
//数字
let num=['12','1','2','3','4','5','6','7','8','9','10','11'];
context.beginPath();
context.lineWidth=2;
for(let i=0;i<12;i++){
context.font="40px Microsoft Yahei";
if(i===0){
context.strokeText(num[i],203+180*Math.sin(Math.PI/6*i),240-180*Math.cos(Math.PI/6*i));
}else{
context.strokeText(num[i],213+180*Math.sin(Math.PI/6*i),240-180*Math.cos(Math.PI/6*i));
} }
context.stroke();
//绘制第二个canvas
let canvas1=document.getElementById('canvas1');
let context1=canvas1.getContext('2d');
//指针中心
context1.lineWidth=5;
context1.beginPath();
context1.arc(150,150,10,0,Math.PI*2);
context1.fillStyle="cornflowerblue";
context1.fill();
context1.stroke();
function fun(){
let time=new Date();
let minutes=time.getMinutes();
let hours=time.getHours();
let second=time.getSeconds();
let min=minutes*60+second;
let hou=hours*60*60+min;
context1.clearRect(0,0,300,300);
//时针
context1.save();
context1.lineWidth=6;
context1.strokeStyle="#0FFF0F";
context1.borderRadius=5;
context1.beginPath();
context1.translate(150,150);
context1.rotate(hou*1/120*Math.PI/180);
context1.moveTo(0,-100);
context1.lineTo(0,0);
context1.closePath();
context1.stroke();
context1.restore();
//分针
context1.save();
context1.lineWidth=4;
context1.strokeStyle="#777777";
context1.beginPath();
context1.translate(150,150);
context1.rotate(min*1/10*Math.PI/180);
context1.moveTo(0,-300);
context1.lineTo(0,0);
context1.closePath();
context1.stroke();
context1.restore();
//秒针
context1.save();
context1.lineWidth=2;
context1.beginPath();
context1.translate(150,150);
context1.rotate(second*6*Math.PI/180);
context1.moveTo(0,-300);
context1.lineTo(0,30);
context1.closePath();
context1.stroke();
context1.restore();
//指针中心
context1.lineWidth=5;
context1.beginPath();
context1.arc(150,150,10,0,Math.PI*2);
context1.fillStyle="cornflowerblue";
context1.fill();
context1.stroke(); }
let timer=setInterval(fun,1000);

用canvas作图最重要的就是考虑好层次关系,先画什么,在画什么,先画以白色作为填充的圆,再画刻度,再画数字,再画第二个canvas,先画时针,再画分针,再画秒针,再画中心的小圆,这要层次感就很清晰,否则秒针动着动着就被分针遮住了,就不好看了。

除了画之外最重要的就是时间了,要使钟表随时间动起来需要定时器,每秒运行一次fun函数

时针,分针,秒针每秒都要动,但是各自转动的角度都不同

    //时针
context1.save();
context1.lineWidth=6;
context1.strokeStyle="#0FFF0F";
context1.borderRadius=5;
context1.beginPath();
context1.translate(150,150);
context1.rotate(hou*1/120*Math.PI/180);
context1.moveTo(0,-100);
context1.lineTo(0,0);
context1.closePath();
context1.stroke();
context1.restore();
//分针
context1.save();
context1.lineWidth=4;
context1.strokeStyle="#777777";
context1.beginPath();
context1.translate(150,150);
context1.rotate(min*1/10*Math.PI/180);
context1.moveTo(0,-300);
context1.lineTo(0,0);
context1.closePath();
context1.stroke();
context1.restore();
//秒针
context1.save();
context1.lineWidth=2;
context1.beginPath();
context1.translate(150,150);
context1.rotate(second*6*Math.PI/180);
context1.moveTo(0,-300);
context1.lineTo(0,30);
context1.closePath();
context1.stroke();
context1.restore();

用translate方法设置转动的中心,用rotate方法设置转动角度,用save和restore方法保存和恢复原来的canvas形态

这样就完成了一个时钟的制作

用canvas绘制时钟的更多相关文章

  1. 使用canvas绘制时钟

    使用canvas绘制时钟  什么使canvas呢?HTML5 <canvas> 元素用于图形的绘制,通过脚本 (通常是JavaScript)来完成.<canvas> 标签只是图 ...

  2. Canvas绘制时钟

    ①首先在HTML的body标签中添加一个canvas标签,用于绘制时钟. <canvas id="myCanvas" width="600" height ...

  3. HTML5 之Canvas 绘制时钟 Demo

    <!DOCTYPE html> <html> <head> <title>Canvas 之 时钟 Demo</title> <!--简 ...

  4. html5 Canvas绘制时钟以及绘制运动的圆

    1.绘制时钟 <!-- js代码 --> <script type="text/javascript"> window.onload=function(){ ...

  5. 小任务之Canvas绘制时钟

    背景图的绘制(大圆.数字.小圆点) 掌握基础知识:圆的绘制(arc方法),关于圆的弧度的计算,数学中关于sin cos的用法 圆的弧度为2*Math.PI 12个数字分得弧度每个为2*Math.PI/ ...

  6. HTML5 Canvas 绘制时钟

    网上会看到很多绘制的时钟,看代码也是云里雾里,自学了下Canvas,觉得不难,就自己做了一个. 先看一下截图: 比较简陋,但是该有的都有了,样式只加了个阴影. html代码就不贴了,就一个canvas ...

  7. 使用canvas绘制时钟 (http://heeroluo.net/Article/Detail/95)

    准备工作 在HTML中指定一个区域放置时钟: <div id="clock" style="position: relative;"></di ...

  8. canvas绘制时钟及注释及save和restore的用法

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  9. 用canvas绘制一个简易时钟

    在见识了html5中canvas的强大,笔者准备制作一个简易时钟. 下面就是成果啦,制作之前我们先分析一下,绘制一个时钟需要做哪些准备. 一 . 1.首先这个时钟分为表盘,指针(时针,分针,秒针)和数 ...

随机推荐

  1. hadoop(三)

    hadoop(三) 1.对MapReduce的认识   MapReduce是运行在yarn上面的一个分布式运算框架,它是用来解决海量的分布式运算的.对于MapReduce来说,我们可以把它分成两部分来 ...

  2. C#WebBroswer控件的使用

    在WebBroswer中可以嵌入一个网页文件,通过Url属性绑定. URI,统一资源标识符,用来唯一的标识一个资源. URL,统一资源定位器,它是一种具体的URI,即URL可以用来标识一个资源. 它包 ...

  3. Delphi驱动开发研究第一篇--实现原理

    Delphi能不能开发Windows的驱动程序(这里的驱动程序当然不是指VxD了^_^)一直是广大Delphi fans关注的问题.姑且先不说能或者不能,我们先来看看用Delphi开发驱动程序需要解决 ...

  4. idea 导入maven项目

    1.import project 2.选择maven项目 3.选择第二个external moudle,选择maven, 4.点击next,一次点击1,2,3,4 5.设置maven环境 6.点击ok ...

  5. Codility----PassingCars

    Task description A non-empty zero-indexed array A consisting of N integers is given. The consecutive ...

  6. 浅析C#代理

    delegate 是委托声明的基础,是.net 的委托的声明的关键字action 是基于delegate实现的代理 有多个参数(无限制个数)无返回值的代理 func 是基于delegate实现的代理 ...

  7. [2017.02.05] 阅读《Efficient C++》思维导图

  8. SYN591-C型 时间间隔表

       SYN591-C型 时间间隔表 脉冲计数器数显计数器电机转速表使用说明视频链接: http://www.syn029.com/h-pd-250-0_310_44_-1.html 请将此链接复制到 ...

  9. spring常见十大异常

    一.找不到配置文件的异常 [plain] view plaincopy org.springframework.beans.factory.BeanDefinitionStoreException:  ...

  10. Spark学习之路(六)—— 累加器与广播变量

    一.简介 在Spark中,提供了两种类型的共享变量:累加器(accumulator)与广播变量(broadcast variable): 累加器:用来对信息进行聚合,主要用于累计计数等场景: 广播变量 ...