用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. 【备忘】WPF基础

    XAML 为了避免生成用户界面(GUI)的代码和基于用户操作执行的代码混合在一起. 名称空间 值得注意的名称空间: xmlns="http://schemas.microsoft.com/w ...

  2. x64内联汇编调用API(需intel编译器,vc不支持x64内联汇编)

    #include "stdafx.h" #include <windows.h> STARTUPINFOW StartInfo  = {0}; PROCESS_INFO ...

  3. qt中用tcp传输xml消息 good

    本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.   环境: 主机:WIN7 开发环境:Qt5 3.1.2 说明: 在tcp上传输xml消息. 协议格式如 ...

  4. VC控件自绘制三步曲

    http://blog.csdn.net/lijie45655/article/details/6362441 实现自定义绘制的三步曲 既然您已经了解了绘制控件可用的各种选项(包括使用自定义绘制的好处 ...

  5. 阻止屏保运行、显示器和系统待机(使用SystemParametersInfo和SetThreadExecutionState两种办法)

    最近看了下电脑管家里面修复漏洞时阻止系统进入待机模式的实现,其实很简单,哈哈.可以看一下这个MSDN上对这个API的说明:http://msdn.microsoft.com/en-us/library ...

  6. ChartDirector应用笔记(可同时为Web和Qt MFC提供图表)

    ChartDirector介绍 ChartDirector是一款小巧精细的商业图表库.其适用的语言范围非常广泛,包括.Net, Java, Asp, VB, PHP, Python, Ruby, C+ ...

  7. 【操作系统】关于Linux桌面操作系统

    以前是Win+Ubuntu+黑苹果,周末想体验一下deepin,于是简单安装了一下,安装过程很简单,这里不再描述.安装之后,第一次打开系统,确实很惊艳,赏心悦目的操作系统. 之前用Ubuntu时候,C ...

  8. oh my god,写20万数据到Excel只需9秒

    还是菜鸟时,在某个.Net项目中,用户需要从业务系统导出Report,而数据量通常都在上万条以上,最初采用的方式就是在服务器端用NPOI生成Excel,把Data一行一行一个Cell一个Cell地写到 ...

  9. 用node.js(socket.io)实现数据实时推送

    在做商品拍卖的时候,要求在商品的拍卖页面需要实时的更新当前商品的最高价格.实现的方式有很多,比如: 1.setInterval每隔n秒去异步拉取数据(缺点:更新不够实时) 2. AJAX轮询方式方式推 ...

  10. Laravel5.x的php artisan migrate数据库迁移创建操作报错SQLSTATE[42000]解决

    Laravel5.x运行迁移命令创建数据表:php artisan migrate报错. Illuminate\Database\QueryException  : SQLSTATE[42000]: ...