整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

学完HTML5,用Canvas做了一个时钟,代码一起分享

天给大家用canvasu做一个时钟,希望大家自己也能够多练练,学习需要案例的积累。文章的代码自己可以拿去练习下。

这里还是要说一下我的前端学习群:594959296,从我一个人到现在的1369人都是我每篇文章每个特效聚集的小伙伴,可以说都是我们大前端的学霸啊,不定期分享干货。想学到东西的都可以来,欢迎初学和进阶中的小伙伴

主要的知识点:

  • 状态保存 context.save()

  • 状态恢复 context.restore()

  • 旋转 context.rotate(弧度)

  • 平移 context.translate(x,y) x,y 是需要移动到的目标位置坐标

  • 缩放 context.scale(1.5,1.5) 1.5,1.5 是缩放比例, 将原来的画布放大1.5倍

  • 画圆弧 context.arc(x,y,r,初始弧度, 最终弧度)

  • 清空矩形内容context.clearRect(x,y,width,height)

  • 时间(时,分,秒)的角度换算

效果图就是这样:

代码如下:

学习javascript也是有门槛的,就是你的html和css至少还比较熟练,您不能连html这东东是干啥的都不知道就开始学javascript了,学乘除前,学好加减法总是有益无害的。

再说二点建议:

  1. 不要急着看一些复杂的javascript网页特效的代码,这样除了打击你的自信心,什么也学不到

  2. 看网上什么几天精通javascript的,直接跳过吧,没戏

如果想看到更加系统的文章和学习方法经验可以关注我的微信公众号:‘web前端课程’关注后回复‘给我资料’可以领取一套完整的学习视频

近看到头条里有几篇用HTML5绘制时钟的文章,感觉这个真的很简单,于是自己花了两个小时写了一个,仅供大家相互探讨。

首先我们分析需求,在没有任何图片的情况下,我们必须要绘制地盘,刻度,时针,分针以及秒针,并且每秒绘制一次秒针,时

针,分针的刻度也同意是有规律可循的,例如时针是分针走360度后时针走30度,也就是12:1的比例,秒针走360度,分针走6度,也就是60:1的角度比例,以此我们可以计算任意时刻的时,分,秒的角度值。每秒总的角度比为,时针:分针:秒针 = 1:12:720。需求分析结束后,便可以开始着手绘制我们的表盘了。

首先创建一个canvas.html文件,内容如下:

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>canvas时钟Demo</title>

</head>

<body>

<canvas id="canvas" width="600px" height="600px" style="background-color: #F0F8FF; position:absolute;left: 100px;">该浏览器不支持canvas</canvas>

<script type="text/javascript" src="js/canvas.js" ></script>

</body>

</html>

canvas.html

接下来在js文件夹中创建一个canvas.js文件

创建canvas.js文件

并将所有的逻辑写到这个js文件中。

首先定义所有的常量,如图所示:

绘制中所有使用到的常量

var canvas = null;

var context = null;

var RADIUS = 200; //半径

var POINTX = 300; //原点X

var POINTY = 300; //原点Y

var HOURHANDLEN = 100; //时针长度

var MINUTESHANDLEN = 140; //分针长度

var SECONDHANDLEN = 180; //秒针长度

var HOURHANDWIDTH = 5; //时针宽度

var MINUTESHANDWIDTH = 3; //分针宽度

var SECONDHANDWIDTH = 1; //秒针宽度

var HOURHANDCOLOR = '#FF00FF'; //时针颜色

var MINUTESHANDCOLOR = '#CC10FF'; //分针颜色

var SECONDHANDCOLOR = '#1155BB'; //秒针颜色

创建一个初始化的方法function init(){},用来初始化canvas和context的内容,如果着这里对于context这个中文翻译为上下文的东西还不懂的话可以自行查阅相关文档(最基础的了,不懂就别接下看了,看了也白瞎)。

init()初始化方法

为何是canvas.getContext("2d"),因为API提供的就是如果绘制2D图片的上下文就是传递这个2d去取得这个对象。

接下来绘制表盘和刻度,我们分析一下,因为刻度都是有规律的,每五条就有一条是整点的刻度,所以我们用5来取余来绘制不同样式的刻度。

/** 绘制钟表圆盘 */

function drawCircle(){

context.beginPath();

context.strokeStyle = "black"

context.lineWidth = 4;

context.arc(POINTX, POINTY, RADIUS, 0, Math.PI*2);

context.closePath();

context.stroke();

context.beginPath();

context.fillStyle = "black";

context.arc(POINTX, POINTY, 4, 0, Math.PI * 2);

context.closePath();

context.fill();

}

绘制刻度内容如下

/** 绘制钟表的时间刻度

*/

function drawLine(){

var startP = {x : 0, y: 0};

var endP = {x : 0, y : 0};

var numP = {x : 0, y : 0};

var fillColor = "red";

var len = 10;

var num = null;

for(var i = 0;i < 60; i ++){

if(i % 5 == 0){

fillColor = "red";

len = 10;

num = 12 - Math.floor(i/5);

numP.x = POINTX - 4 - (RADIUS - 20) * Math.sin(i * Math.PI/30);//4为微调数字位置

numP.y = POINTX + 4 - (RADIUS - 20) * Math.cos(i * Math.PI/30);//4为微调数字位置

}

else{

fillColor = "black";

len = 5;

num = null;

}

startP.x = POINTX - RADIUS * Math.sin(i * Math.PI/30);

startP.y = POINTX - RADIUS * Math.cos(i * Math.PI/30);

endP.x = POINTX - (RADIUS - len) * Math.sin(i * Math.PI/30);

endP.y = POINTX - (RADIUS - len) * Math.cos(i * Math.PI/30);

drawLineCore(startP, endP, fillColor, num, numP);

}

}

/**

* 根据提供的起始点绘制表盘刻度

* @param {Object} startP

* @param {Object} endP

* @param {Object} fillColor

*/

function drawLineCore(startP, endP, fillColor, num, numP){

context.beginPath();

context.lineWidth = 2;

context.strokeStyle = fillColor;

context.moveTo(startP.x, startP.y);

context.lineTo(endP.x, endP.y);

context.stroke();

context.closePath();

if(num !== null){

context.beginPath();

context.lineWidth = 1;

context.strokeStyle = fillColor;

context.strokeText(num + "", numP.x, numP.y);

context.stroke();

context.closePath();

}

}

绘制完表盘和刻度后,我们开始绘制时分秒针了,根据我们刚刚分析的角度比例关系,我们写如下代码:

function drawHands(){

setInterval(function(){

context.clearRect(0,0,500,500);

drawLine();

drawCircle();

drawHandByData(3);

drawHandByData(2);

drawHandByData(1);

},1000)

}

/**

* 根据类型和指针的数字来绘制图形,统一换算成秒数来计算角度

* @param {Object} type 1为时针,2为分针,3为秒针

*/

function drawHandByData(type){

var date = new Date();

var curHour = date.getHours();

var curMinutes = date.getMinutes();

var curSecond = date.getSeconds();

var angle = 0;

var handLen = 0;

var allSecond = 0;

var handWidth = 0;

var handColor = "";

if(type == 1){

var hour = curHour >= 12 ? curHour - 12 : curHour;

allSecond = hour * 3600 + curMinutes * 60 + curSecond;

angle = (Math.PI/6) * (allSecond / 3600);

handLen = HOURHANDLEN;

handWidth = HOURHANDWIDTH;

handColor = HOURHANDCOLOR;

}

else if(type == 2){

handLen = MINUTESHANDLEN;

allSecond = curMinutes * 60 + curSecond;

angle = (Math.PI / 30) * (allSecond / 60)

handWidth = MINUTESHANDWIDTH;

handColor = MINUTESHANDCOLOR;

}

else if(type == 3){

handLen = SECONDHANDLEN;

allSecond = curSecond;

angle = (Math.PI / 30) * allSecond;

allSecond = curSecond;

handWidth = SECONDHANDWIDTH;

handColor = SECONDHANDCOLOR;

}

drawHand(Math.PI - angle, handLen, handWidth, handColor);

}

/**

* 绘制时针,分针,秒针统一方法

* @param {Object} angle 时针,分针,秒针的角度

* @param {Object} handLen 时针,分针,秒针的长度

* @param {Object} handWidth 时针,分针,秒针的宽度

* @param {Object} handColor 时针,分针,秒针的宽度

*/

function drawHand(angle, handLen, handWidth, handColor){

var endP = {x:0, y:0}

endP.x = POINTX + Math.sin(angle) * handLen;

endP.y = POINTY + Math.cos(angle) * handLen;

context.beginPath();

context.lineWidth = handWidth;

context.strokeStyle = handColor;

context.moveTo(POINTX, POINTY);

context.lineTo(endP.x, endP.y);

context.stroke();

context.closePath();

}

最后别忘了调用各个函数:

init();

drawLine();

drawCircle();

drawHands();

整个JS文件我是用的是闭包写法,如:

(function(win){

function init(){}

drawLine(){}

drawCircle(){}

drawHands(){}

//最后调用

init();

drawCircle();

drawLine();

drawHands();

})(window)

希望大家喜欢我的分享,如果可以请点赞,多多留言。谢谢

击查看时钟特效

极简主义,程序员javascript打造极简时钟特效


对于javascript特效的学习,重要的是逻辑思路,所以这个时钟特效不是很华丽,但是功能都展现出来了,而学习javascript并不是单纯的扣代码,很多人都觉得,抠完代码,能看懂了,就算是学会了,但是,说的难听点这样的学习方式其实是自断前程的学习方法,若是一门月薪过万的技术有那么简单学习,那么怎么还会有那么多人找不到工作呢?学习javascript特效最重要的是仔细研究一个特效的思路方法,然后根据这个特效可以扩展最初其他类似功能或者更复杂的特效,才算彻底的掌握好了这方面的知识!我的头条号里面也有许多华丽的特效以及HTML5/javascript游戏,有兴趣的朋友可以去看看!文末附上本次javascript时钟的源码!

如果想要更多的企业求职加分项目,案例,学习方法可以来一下我的前端群570946165,每天都会精挑细选一个特效,项目出来详细讲解,分享!包括答疑解惑!

HTML5/javascript时钟特效源码

代码过长需要文档版源码来我的前端群570946165,已上传到群文件

头条号里有许多web前端学习视频/源码,企业常用特效/案例/项目,敬请关注!