用canvas绘制时钟
用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绘制时钟的更多相关文章
- 使用canvas绘制时钟
使用canvas绘制时钟 什么使canvas呢?HTML5 <canvas> 元素用于图形的绘制,通过脚本 (通常是JavaScript)来完成.<canvas> 标签只是图 ...
- Canvas绘制时钟
①首先在HTML的body标签中添加一个canvas标签,用于绘制时钟. <canvas id="myCanvas" width="600" height ...
- HTML5 之Canvas 绘制时钟 Demo
<!DOCTYPE html> <html> <head> <title>Canvas 之 时钟 Demo</title> <!--简 ...
- html5 Canvas绘制时钟以及绘制运动的圆
1.绘制时钟 <!-- js代码 --> <script type="text/javascript"> window.onload=function(){ ...
- 小任务之Canvas绘制时钟
背景图的绘制(大圆.数字.小圆点) 掌握基础知识:圆的绘制(arc方法),关于圆的弧度的计算,数学中关于sin cos的用法 圆的弧度为2*Math.PI 12个数字分得弧度每个为2*Math.PI/ ...
- HTML5 Canvas 绘制时钟
网上会看到很多绘制的时钟,看代码也是云里雾里,自学了下Canvas,觉得不难,就自己做了一个. 先看一下截图: 比较简陋,但是该有的都有了,样式只加了个阴影. html代码就不贴了,就一个canvas ...
- 使用canvas绘制时钟 (http://heeroluo.net/Article/Detail/95)
准备工作 在HTML中指定一个区域放置时钟: <div id="clock" style="position: relative;"></di ...
- canvas绘制时钟及注释及save和restore的用法
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 用canvas绘制一个简易时钟
在见识了html5中canvas的强大,笔者准备制作一个简易时钟. 下面就是成果啦,制作之前我们先分析一下,绘制一个时钟需要做哪些准备. 一 . 1.首先这个时钟分为表盘,指针(时针,分针,秒针)和数 ...
随机推荐
- visual studio添加docker支持简记
很久以前学过一段时间的docker,那时装了电脑卡得受不了,学了一会就卸载了,最近电脑又装上了docker,感觉好像没有以前这么卡了,还是同一台电脑surface pro4, 试了一下visual s ...
- Java基础(四) StringBuffer、StringBuilder原理浅析
StringBuilder与StringBuffer作用就是用来处理字符串,但String类本身也具备很多方法可以用来处理字符串,那么为什么还要引入这两个类呢? 关于String的讲解请看Java基础 ...
- spring boot 2.x 系列 —— spring boot 整合 druid+mybatis
源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all 一.说明 1.1 项目结构 项目查询用的表对应的建表语句放置在resour ...
- Mint-ui全局引入
1.Mint-ui在全局引入之后,在组件中使用其中的js函数,如toast() this.$toast('在全局引入之后可以直接在this.$toast中使用')
- 初始化mysql数据库提示缺少Data:dumper模块解决方法
初始化默认数据库运行此命令:/usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql/ 出现错 ...
- CSS3常用转换总结
一.2D转换 translate(npx,npx) 相对当前元素位置移动 /* 实现div向左移动50个像素,并向下移动100个像素 */ div { transform: translate(50p ...
- redis宕机如何解决?如果是项目上线的宕机呢?
我们先来了解一下 bridge网络模式 他会创建一个docker0桥,看完这个我们就会知道redis哨兵机制的端口了. 之后继续研究redis宕机的解决办法! 宕机: 服务器停止服务 如果只有一台r ...
- WIN7下vs2010滑轮滚动不正确的解决方法
win7下vs2010在滚动滑轮时文档滚动条不滚动而是解决方案的滚动条滚动的解决方法, 控制面板>设备和打印机>鼠标设置>滚轮选项卡里面将滚轮功能设置设为只使用office97预设的 ...
- 我是这么学习Selenium元素定位操作的
写在前面 做web自动化测试都有体会,本质也就是通过操作页面元素对象来模拟用户操作行为,那么首先我们先找到这些元素对象,然后才能进行一系列操作. 我们得先告诉自动化工具或者说代码要操作那个元素,毕竟代 ...
- 使Toast弹出不重叠的封装
一.问题 在频繁弹出toast的时候,弹出后出现延迟重叠的现象. 二.解决 Toast通常由makeTextT()方法实例化,如何不想要toast弹出时重叠,那么只需在应用中保持一个Toast对象即可 ...