Canvas最初由苹果推出,后来由W3C推广,目前几乎所有浏览器都支持Canvas。

canvas是一个闭合标签,包括宽度和高度属性。默认值为宽300,高150。浏览器不支持canvas时,canvas的文本会显示,通常用来检测浏览器兼容性。

<canvas id="can" width="300" height="300">您的浏览器不支持canvas</canvas>

canvas创建完了后,主要就依靠javascript完成它的功能了~

1、在里,首先找到指定画布,然后创建2Dcontext对象。------这是写canvas必须的步骤!

var can = document.getElementById("can");
var ctx = can2.getContext("2d");

2、开始写绘制时钟函数,function drawclock();

3、首先需要把保存函数放在最前面。然后,由于开始的canvas的中心是在容器最左上角,而我们的时钟图需要以整个canvas的中央作为圆点,因此需要用translate(),使中心居中!然后由于,默认的canvas的方向是水平向右和垂直向下的,而我们希望时钟的起始方向是x轴对着12点钟方向所以要使中心再旋转逆时针90度。以及设置线宽,线头形状和颜色。

ctx.save();ctx.translate(150, 150);
ctx.rotate(-Math.PI / 2);
ctx.lineWidth = 6;
ctx.strokeStyle = "blue";
ctx.lineCap = "round";

4、下面写表盘刻度。分两种刻度,时针、分针。时针的刻度。 一共有十二个时针的刻度,每个刻度就是30度。使用for循环循环12次。每次旋转30度。每次的起点是(100,0),终点是(120,0),设置了起点终点和角度后就是用stroke()描边。

for (var i = 0; i < 12; i++) {ctx.beginPath();ctx.rotate(Math.PI / 6);ctx.moveTo(100, 0);ctx.lineTo(120, 0);ctx.stroke();
}     注意,这里的循环第一句是beginpath(),它的作用就是循环每执行完一次,context回到原点处。这一句不要忘了

同样的,对于分针,就是60个刻度,每个刻度就是6度。为了区分,设置线宽比时针的线宽小一点,长度也短一点,颜色也选个不一样的。

for (var k = 0; k < 60; k++) {ctx.strokeStyle = "red";ctx.beginPath();ctx.rotate(Math.PI / 30);ctx.moveTo(118, 0);ctx.lineTo(120, 0);ctx.stroke();
}

5.刻度写好了,接下来就是确定,随着时间的推移,每一秒,我们的时针和分针、秒针应该停在哪个地方。

首先新建一个日期对象,获取时、分、秒三个变量!

var time = new Date();
var s = time.getSeconds();
var m = time.getMinutes();
var h = time.getHours();
if (h > 12) {h -= 12;
}  这里有一个细节,因为系统时间是24h制,而我们的时钟刻度,只有12H,因此,H>12时,h-=12.

时针的旋转角度为

时针的角度=360/12*小时+360/12/60分钟+360/12/60/60秒;
//                    换算成弧度
//                    时针的弧度= π/6*小时+π/360*分钟+π/2160*秒

分针的角度

分针的角度=360/60*分钟+360/60/60*秒
//                    分针的弧度 =π/30*分钟+π/1800*秒

秒针的角度

 秒针的角度=360/60*秒秒针的弧度 =π/30*秒

秒针、分针、时针为了区别,它们的长度不一,起点也不一,就像我们日常中看到的那样!

然后要用restore和save恢复和保存之前的绘图设置。

ctx.save();ctx.lineWidth = 9;ctx.beginPath();ctx.rotate(h * (Math.PI / 6) + (Math.PI / 360) * m + (Math.PI / 21600) * s);ctx.moveTo(-20, 0);ctx.lineTo(80, 0);ctx.stroke();ctx.restore();
//                    分针的角度=360/60*分钟+360/60/60*秒
//                    分针的弧度 =π/30*分钟+π/1800*秒ctx.save();ctx.lineWidth = 7;ctx.beginPath();ctx.rotate((Math.PI / 30) * m + (Math.PI / 1800) * s);ctx.moveTo(-20, 0);ctx.lineTo(112, 0);ctx.stroke();ctx.restore();
//                    秒针的角度=360/60*秒秒针的弧度 =π/30*秒ctx.save();ctx.lineWidth = 6;ctx.strokeStyle = "green";ctx.beginPath();ctx.rotate((Math.PI / 30) * s);ctx.moveTo(-30, 0);ctx.lineTo(120, 0);ctx.stroke();ctx.restore()

6.需要在时钟中央绘制一个圆点,先用beginpath()让canvas回到起点,再选半径为10,用fill填充,红色。


ctx.beginPath();
ctx.arc(0, 0, 10, 0, Math.PI * 2, true);
ctx.fillStyle = "yellow";
ctx.fill();
ctx.restore();

7.到此,好像该做的都做完了。其实不然,这样只能得到一个你打开页面时刻的时钟图,要实现动态的时钟,需要每秒刷新,这就需要用setInterval()函数的功能,每1000ms,运行一次drawclock()函数,这样就每一秒画一次,显示的就是时钟啦!

setInterval("drawclock()",1000);

完整代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>practice</title><style>canvas{border: 2px solid red;}</style>
</head>
<body ><h3 >手绘时钟</h3>
<canvas id="can2" width="300" height="300">您的浏览器不支持canvas</canvas>
<script>var can2 = document.getElementById("can2");var ctx = can2.getContext("2d");drawclock(); //此处先引用函数是为了防止加载完页面的第一秒有空白画面。function drawclock() {ctx.save();ctx.clearRect(0,0,300,300);ctx.translate(150, 150);ctx.rotate(-Math.PI / 2);ctx.lineWidth = 6;ctx.strokeStyle = "blue";ctx.lineCap = "round";for (var i = 0; i < 12; i++) {ctx.beginPath();ctx.rotate(Math.PI / 6);ctx.moveTo(100, 0);ctx.lineTo(120, 0);ctx.stroke();}for (var k = 0; k < 60; k++) {ctx.strokeStyle = "red";ctx.beginPath();ctx.rotate(Math.PI / 30);ctx.moveTo(118, 0);ctx.lineTo(120, 0);ctx.stroke();}var time = new Date();var s = time.getSeconds();var m = time.getMinutes();var h = time.getHours();if (h > 12) {h -= 12;}
//                    时针的角度=360/12*小时+360/12/60分钟+360/12/60/60秒;
//                    换算成弧度
//                    时针的弧度= π/6*小时+π/360*分钟+π/2160*秒ctx.save();ctx.lineWidth = 9;ctx.beginPath();ctx.rotate(h * (Math.PI / 6) + (Math.PI / 360) * m + (Math.PI / 21600) * s);ctx.moveTo(-20, 0);ctx.lineTo(80, 0);ctx.stroke();ctx.restore();
//                    分针的角度=360/60*分钟+360/60/60*秒
//                    分针的弧度 =π/30*分钟+π/1800*秒ctx.save();ctx.lineWidth = 7;ctx.beginPath();ctx.rotate((Math.PI / 30) * m + (Math.PI / 1800) * s);ctx.moveTo(-20, 0);ctx.lineTo(112, 0);ctx.stroke();ctx.restore();
//                    秒针的角度=360/60*秒秒针的弧度 =π/30*秒ctx.save();ctx.lineWidth = 6;ctx.strokeStyle = "green";ctx.beginPath();ctx.rotate((Math.PI / 30) * s);ctx.moveTo(-30, 0);ctx.lineTo(120, 0);ctx.stroke();ctx.restore();
//                    在钟表中心绘制一个圆点.ctx.beginPath();ctx.arc(0, 0, 10, 0, Math.PI * 2, true);ctx.fillStyle = "yellow";ctx.fill();ctx.restore();}setInterval("drawclock()",1000);
</script>
</body>
</html>

Canvas画布完成一个数字钟表相关推荐

  1. 新H5中用canvas画一个数字钟表

    此文章是参考以往大牛代码,在大牛代码基础上加以更改而成. 本人暂时还是一名技术菜鸟,刚刚踏上web前端这条路才五个月,希望大牛们多多提携... 效果图如下: 话不多说,上代码: <body st ...

  2. canvas 画布画太极图和钟表

    摘要:html5的canvas元素称得上是html5的核心技术,而作为一个依靠js绘制华丽图像的元素,Canvas究竟能够运用在哪些方面的开发? 相关代码 什么是Canvas? Canvas元素是h5 ...

  3. js 获得明天0点时间戳_js实现一个简单钟表动画(javascript+html5 canvas)

    自己学生时代的代码,发现还保存着,今天拿出来分享下. 用js和html5 canvas对象实现一个简单钟表程序 主要用到的就是h5的canvas对象 canvas对象本人也不是很熟,大致看了几个常用的 ...

  4. 用Canvas绘制一个数字键盘

    Hello啊老铁们,这篇文章还是阐述自定义View相关的内容,用Canvas轻轻松松搞一个数字键盘,本身没什么难度,这种效果实现的方式也是多种多样,这篇只是其中的一种,要说本篇有什么特别之处,可能就是 ...

  5. php画布怎么清除,JavaScript_JavaScript html5 canvas画布中删除一个块区域的方法,本文实例讲述了html5 canvas画布 - phpStudy...

    JavaScript html5 canvas画布中删除一个块区域的方法 本文实例讲述了html5 canvas画布中删除一个块区域的方法.分享给大家供大家参考,具体如下: 运行效果截图如下: 附:图 ...

  6. 在canvas(画布)上绘制一个矩形盒子并使用按键移动这个盒子

    思路 1.在画布上创建一个2d画笔,并用这个画笔在画布上绘制一个矩形. 2.设置一个边界判断使这个盒子不能移出画布之外,只能在画布中移动. 注意: 不能直接在style中设置canvas的大小 直接设 ...

  7. 更新——Canvas画布动画效果之实现倒计时

    Hello,大家好! 小W复活啦!继续欢乐的给大家更博,输送新知识~~ 不开玩笑啦!秒进正题~~~ 上次更博,小W给大家介绍了Canvas画布的基础部分,以及实现了一个由7*10点阵图显示的倒计时的基 ...

  8. canvas绘制竖排的数字_Python绘制可爱的卡通人物 | 【turtle使用】

    Turtle库 简介 什么是Turtle 首先,turtle库是一个点线面的简单图像库,能够完成一些比较简单的几何图像可视化.它就像一个小乌龟,在一个横轴为x.纵轴为y的坐标系原点,(0,0)位置开始 ...

  9. s时钟画布 android,Canvas画布实现自定义时钟效果

    标题 *{margin:0; padding:0; list-style:none;} .box{ width: 420px; height: 420px; margin: 50px auto 0; ...

最新文章

  1. tensflow中加载 fashion_mnist 数据集时
  2. PHP 发送Email的几种方法
  3. Discuz网警过滤关键词库
  4. 第四届大数据科学与工程国际会议(2019)
  5. jQuery 2.0.3 - 整体架构
  6. 阿里云 redis mysql_Redis 和 MySQL数据一致
  7. php上传图片大小判断,jQuery实现判断上传图片类型和大小的方法示例
  8. JavaScript-闭包closure
  9. python中创建二维列表
  10. 数字图像处理——图像的统计特征
  11. position四个属性值的关系
  12. dell服务器怎么看故障信息,DELL服务器故障码详解
  13. 日暮途远,故吾倒行而逆施之.
  14. XAMPP下载速度太慢了
  15. 科大讯飞实现了APP用自己的声音听故事
  16. 视频在H5页面在微信浏览器不能自动播放问题
  17. 微信小程序访问后端服务器
  18. Ubuntu 怎么创建可视化界面
  19. Vue.js 3 ssr 中报错Hydration node mismatch: - Client vnode: div - Server rendered DOM:已解决
  20. RNN入门(三)利用LSTM生成旅游点评

热门文章

  1. 卸载EDR软件(简单记录)
  2. 怎样复制粘贴windows命令行中的内容 .
  3. 川普的退休生活?不,是AI算法的宅舞演绎。
  4. OBD车载诊断系统、移动管家车联网汽车OBD诊断系统车辆信息管理硬件
  5. Android - 指纹识别API示例
  6. 关于模拟器拉取文件的多种方式
  7. 静态分析工具综述:Roodi、Rufus、Reek和Flay
  8. Wildfly 10的安装、配置到部署
  9. 无人驾驶技术——初探Kalman滤波器
  10. Flutter Sliver大家族之SliverPersistentHeader()和SliverToBoxAdapter()组件(实现固定头布局)③