摘要:今天教大家写一个canvas的时钟案例,效果可能看起来比较简单,没有那些花里胡哨的。

本文分享自华为云社区《如何实现一个朴实无华的Canvas时钟效果》,作者: 北极光之夜。。

一.先看效果:

今天写一个canvas的时钟案例。效果可能看起来比较简单,没有那些花里胡哨的,不过,它涉及的canvas知识点是比较多的,初学canvas那是必定要会的。下面手把手带你快速实现~

二.实现步骤(源码在最后):

1. 设置基本的标签与样式:

<div class="clock">
<canvas width="300" height="300" id="canvas"></canvas>
</div>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
color: rgb(3, 47, 98);">rgb(204, 204, 204);
}
.clock {
width: 300px;
height: 300px;
color: rgb(3, 47, 98);">rgb(15, 15, 15);
border-radius: 50px;
}

2. 开始js代码实现,下面为了易于理解,所以一个功能封装一个函数:

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

3. 先绘制钟的整体白色底盘:

同时为了后期将旋转点为.clock的中心的,所以将translate偏移一半的距离。

function drawPanel() {
ctx.translate(150, 150);
// 开始绘制
ctx.beginPath();
// 画一个圆
ctx.arc(0, 0, 130, 0, 2 * Math.PI);
ctx.fillStyle = "white";
ctx.fill();
}

4.绘制时钟的12位数字:

可知,一个圆上它的x坐标为:R * cos(它的角度), y坐标为:R *sin(它的角度)。
同时,因为Math.cos()与Math.sin()里是计算弧度的,所以要转换。公式:弧度 = 角度 * π / 180

function hourNum() {
// 存放12个数字
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
ctx.beginPath();
// 数字的基本样式
ctx.font = "30px fangsong";
ctx.textAlign = "center";
ctx.textBaseline = "middle";
ctx.fillStyle = "black";
for (var i = 0; i < arr.length; i++) {
ctx.fillText(
arr[i],
108 * Math.cos(((i * 30 - 60) * Math.PI) / 180),
108 * Math.sin(((i * 30 - 60) * Math.PI) / 180)
);
}
}

5. 绘制时钟中心的圆点:

一个灰圆覆盖一个稍大的黑圆。

function centerDot() {
ctx.beginPath();
ctx.arc(0, 0, 8, 0, 2 * Math.PI);
ctx.fill();
ctx.beginPath();
ctx.fillStyle = "gray";
ctx.arc(0, 0, 5, 0, 2 * Math.PI);
ctx.fill();
}

6.绘制时针:

假设参数 hours 与 minutes 为传入的当前的时间的小时数与分钟数。

function hourHand(hours, minutes) {
// 应该旋转的角度,默认时钟为指向12点方向。
var radius =
((2 * Math.PI) / 12) * hours + (((1 / 6) * Math.PI) / 60) * minutes;
// 保存当前状态,为了旋转后能回到当初状态。
ctx.save();
ctx.beginPath();
// 针的宽度
ctx.lineWidth = 5;
// 针头为圆角
ctx.lineCap = "round";
ctx.strokeStyle = "black";
// 旋转
ctx.rotate(radius);
// 画一条线表示时钟
ctx.moveTo(0, 0);
ctx.lineTo(0, -50);
ctx.stroke();
// 回到保存的状态
ctx.restore();
}

7. 同理,绘制分针:

 function minuteHand(minutes) {
2 * Math.PI;
var radius = ((2 * Math.PI) / 60) * minutes;
ctx.save();
ctx.beginPath();
ctx.lineWidth = 3;
ctx.lineCap = "round";
ctx.strokeStyle = "black";
ctx.rotate(radius);
ctx.moveTo(0, 0);
ctx.lineTo(0, -70);
ctx.stroke();
ctx.restore();
}

8. 同理,绘制秒针:

function secondHand(seconds) {
var radius = ((2 * Math.PI) / 60) * seconds;
ctx.save();
ctx.beginPath();
ctx.lineWidth = 1;
ctx.lineCap = "round";
ctx.strokeStyle = "red";
ctx.rotate(radius);
ctx.moveTo(0, 0);
ctx.lineTo(0, -90);
ctx.stroke();
ctx.restore();
}

9. 封装一个函数获取当前时间:

同时函数内部调用全部绘制的函数。实现绘制一个完整的时钟。

function update() {
var time = new Date();
var hours = time.getHours();
var minutes = time.getMinutes();
var seconds = time.getSeconds();
// 保存canvas状态,因为绘制底盘时它偏移了
ctx.save();
drawPanel();
hourNum();
secondHand(seconds);
minuteHand(minutes);
hourHand(hours, minutes);
centerDot();
// 恢复canvas状态
ctx.restore();
}
update();

10. 开启定时器,时钟运转:

  setInterval(() => {
ctx.clearRect(0, 0, canvas.width, canvas.height);
update();
}, 1000);

三.总结:

上面就是全部内容了,实现并不难,就是对canvas提供的一些方法进行合理的使用,拿来练手是很不错的。源码在我的gitee仓库直接去下载或者复制获取:https://gitee.com/aurora-in-winter/blog.git

点击关注,第一时间了解华为云新鲜技术~

教你实现一个朴实的Canvas时钟效果的更多相关文章

  1. canvas时钟效果

    话不多说,直接上代码 <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/x ...

  2. HTML5之Canvas时钟(网页效果--每日一更)

    今天,带来的是使用HTML5中Canvas标签实现的动态时钟效果. 话不多说,先看效果:亲,请点击这里 众所周知,Canvas标签是HTML5中的灵魂,HTML5 Canvas是屏幕上的一个由Java ...

  3. 原生js之canvas时钟组件

    canvas一直是前端开发中不可或缺的一种用来绘制图形的标签元素,比如压缩上传的图片.比如刮刮卡.比如制作海报.图表插件等,很多人在面试的过程中也会被问到有没有接触过canvas图形绘制. 定义 ca ...

  4. canvas实现的时钟效果

    最近在网上看到了一个css3实现的可爱时钟,觉得很nice,然后就想着用canvas试试实现这个时钟效果. 首先,要实现时钟需要先计算时钟上的数字应该占整个圆的大小. 因为一个圆是360度,所以数字之 ...

  5. 基于canvas的原生JS时钟效果

    概述 运用html5新增画布canvas技术,绘制时钟效果,无需引用任何插件,纯js. 详细 代码下载:http://www.demodashi.com/demo/11935.html 给大家介绍一个 ...

  6. Coffeescript实现canvas时钟

    前言 参照Mozilla 官方教程,要在Canvas上画动画时钟,思路非常有意思. 把动画看作是多个帧组成,定时每个时间点在Canvas上画一帧来实现动画.而Mozilla 官方教程画图实现的思路有意 ...

  7. 只有20行Javascript代码!手把手教你写一个页面模板引擎

    http://www.toobug.net/article/how_to_design_front_end_template_engine.html http://barretlee.com/webs ...

  8. 【酷Q插件制作】教大家做一个简单的签到插件

    酷Q插件已经有很多了,社区分享一大堆,不过还是自己写才有乐趣,哈哈.不得不吐槽一下,酷Q竟然不更新了,出了个酷Q pro,还收费!!诶.不过这也影响不了咱写插件的心情,今天教大家写一个酷Q签到插件,虽 ...

  9. 每天一个JavaScript实例-canvas绘图

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  10. 3分钟教你做一个iphone手机浏览器

    3分钟教你做一个iphone手机浏览器 第一步:新建一个Single View工程: 第二步:新建好工程,关闭arc. 第三步:拖放一个Text Field 一个UIButton 和一个 UIWebV ...

随机推荐

  1. IDEA的Maven换源

    打开IDEA安装路径,然后打开下面的文件夹 plugins\maven\lib\maven3\conf 在conf文件目录下出现一个setting.xml的文件.(ps:如果没有,请忽略本文,自行创建 ...

  2. python3使用pymsql操作mysql数据库

    操作系统 :Windows 10_x64 python版本 :3.9.2 pymysql版本: 1.0.2 MySQL版本: 5.7.38   之前写过一篇关于python操作mysql数据库的文章: ...

  3. 【scipy 基础】--正交距离回归

    Scipy的ODR正交距离回归(ODR-Orthogonal Distance Regression)模块,适用于回归分析时,因变量和自变量之间存在非线性关系的情况.它提高了回归分析的准确性和稳健性. ...

  4. C语言【进制、原反补码、数据类型】

    C语言[进制.原反补码.数据类型] 1.二进制.八进制.十进制.十六进制在C语言中的使用(赋值及输出)? /** 二进制 赋值时以 0b 或 0B 开头: 输出时没有所属占位符, 十六进制整数输出也比 ...

  5. 自学day7 数组

    typora-copy-images-to: media 数组 一.概念 对象中可以通过键值对存储多个数据,且数据的类型是没有限制的,所以通常会存储一个商品的信息或一个人的信息: var obj = ...

  6. 在EXCEL表格中快速自动求和

    在Microsoft Excel中,可以通过多种方式快速自动求和.以下是一种简单但常用的方法: 使用SUM函数 选定求和区域: 在Excel表格中,首先需要选定要进行求和的区域.这可以是一个列.行或者 ...

  7. .NET8 依赖注入

    依赖注入(Dependency Injection,简称DI)是一种设计模式,用于解耦组件(服务)之间的依赖关系.它通过将依赖关系的创建和管理交给外部容器来实现,而不是在组件(服务)内部直接创建依赖对 ...

  8. java-EasyExcel模板导出

    前言:  需求:根据自定义模板导出Excel,包含图片.表格,采用EasyExcel 提示:EasyExcel请使用 3.0 以上版本, 对图片操作最重要的类就是 WriteCellData<V ...

  9. .net下优秀的MQTT框架MQTTnet使用方法,物联网通讯必备

    MQTTnet 是一个高性能的MQTT类库,支持.NET Core和.NET Framework. MQTTnet 原理: MQTTnet 是一个用于.NET的高性能MQTT类库,实现了MQTT协议的 ...

  10. CH395+EMQX实现MQTT应用(Windows系统)

    目录: 1.MQTT协议 1.1简介 1.2特性 1.3实现方式 1.4数据包结构 2.EMQX具体操作步骤 3.代码说明 4.工程链接 MQTT协议 1.MQTT简介 MQTT是一种基于 发布/订阅 ...