用Canvas实现时钟的效果

用canvas画布实现时钟效果

相信很多学习前端的新人,学完html结构和css样式以后,都会开始学习JavaScript,在学一段JavaScript以后会接触到canvas画布部分,相信很多同学学习完以后没有很好的项目给自己能够练习,所有我在这里把代码和项目送给有需要的同学!!


前言

各位五湖四海的同学既然选择了前端开发这个行业,就努力的学下去吧,在这个行业技术不断的提高,才有可能获得你想要的报酬,废话就不多说啦,下面请用心的去理解


一、Canvas HTML的结构部分

<!DOCTYPE html>
<html lang="zh">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<meta http-equiv="X-UA-Compatible" content="ie=edge">
	<title>canvas时钟</title>
	<style>
		canvas{
			background: #eee;
			display: block;
			margin: 0 auto;
		}
	</style>
</head>
<body>
	<canvas id="cvs" width="500" height="500"></canvas>
	<script src="js/index.js"></script>
</body>
</html>


二、JS部分

1.先获取属性和变量

代码如下(示例):

var canvasDom = document.getElementById('cvs'); //获取canvas 画布 通过ID获取
var ctx = canvasDom.getContext('2d'); //获取上下文  getContext('2d') 设置绘画的环境
var width = canvasDom.width; //设置绘画的宽度
var height = canvasDom.height; //设置绘画的高度
var radius = 150; //设置圆的半径

2.平移坐标系

这个平移Canvas画布的坐标系是为了方便作画,因为Canvas的画布的起始点在(0,0)
位置

代码如下(示例):

ctx.translate(width / 2, height / 2); //translate 平移图形

3.角度计算弧度

代码如下(示例):

function getRadian(angle) {
	return angle * Math.PI / 180;
}

4.创建函数画圆

你要创建一个时钟的话,首先的话要利用canvas的属性画一个圆盘,先利用save()属性
保存一个绘画状态,再利用beginPath()属性开辟一个新的绘画路径,接着用arc()创建圆
代码如下(示例):

function drawCircle() {
	//保存现场
	ctx.save(); //保存当前的绘画状态
	ctx.beginPath(); //开启一个新的路径
	ctx.arc(0, 0, radius, 0, getRadian(360)); // 用于创建圆和部分圆
	ctx.strokeStyle = '#ccc'; // 颜色
	ctx.lineWidth = 5; //线条的宽度
	ctx.stroke(); //描边画圆
	ctx.restore(); //恢复现场
}

5.画时钟的刻度

画时钟刻度这一步是比较复杂的,也是很多同学都不明白的,Canvas每次作画的时候,会先进行先保存现场save()有保存现场的功能,通过lineWidth统一设置线条宽度,通过strokeStyle设置统一的颜色,通过for循环来循环出60次的刻度

代码如下(示例):

function drawMarks() {
	ctx.save(); //保存现场
	ctx.lineWidth = 6; //统一设置线条宽度
	ctx.strokeStyle = '#aaa'; //统一设置线条颜色
	for (var i = 0; i < 60; i++) {
		ctx.save();
		//旋转画布
		ctx.rotate(getRadian(6 * i)); //旋转
		ctx.moveTo(0, -radius + 10);

		if (i % 5 === 0) {
			ctx.lineTo(0, -radius + 30);
		} else {
			ctx.lineTo(0, -radius + 20);
		}

		ctx.lineCap = "round" //末端设置为圆形
		ctx.stroke();
		ctx.restore(); //恢复现场
	}
	ctx.restore();
}

6.设置时针的属性

代码如下(示例):

function drawLine(lineWidth, color, length, angle) {
	ctx.save();
	ctx.beginPath(); //开启一个新的路径
	ctx.strokeStyle = color; //设置颜色
	ctx.lineWidth = lineWidth;
	ctx.lineCap = "round" //设置末端
	ctx.rotate(getRadian(angle));

	ctx.moveTo(0, 0.1 * length);
	ctx.lineTo(0, -0.9 * length);
	ctx.stroke();
	ctx.restore();
}

7.生成当前时间

要在时钟当中获取到当前时间的话,要先获取当前时间,再获取凌晨的时间

代码如下(示例):

function drawKLines() {
	var now = new Date(); ///当前时间
	//今天凌晨的时间
	var zero = new Date(now.getFullYear(), now.getMonth(), now.getDate());
	//今天流程到现在,经过的毫秒数
	var milis = now.getTime() - zero.getTime();
	//今天流程到现在,经过的毫秒数
	var seconds = Math.floor(milis / 1000);
	//画时钟
	//经过的小时数
	var hAngle = seconds / 60 / 60 / 12 * 360;
	drawLine(6, 'red', 70, hAngle);

	var mAngle = seconds / 60 / 60 * 360;
	drawLine(5, "blue", 90, mAngle);

	var sAngle = seconds / 60 * 360;
	drawLine(3, 'yellow', 100, sAngle);
}

drawKLines();

8.运行函数

在上面我们创建和生成的函数都没有去运行,到最后一步我们要创建一个函数,去运行上面的函数,运行函数我们需要清除画布一次,然后再从新开始作画

function draw() {
	//清空画布
	ctx.clearRect(-width / 2, -height / 2, width, height);
	//重新画
	drawCircle();
	drawMarks();
	drawKLines();
}
draw();

setInterval(draw, 1000);  //这里创建一个定时器的原因,是让这个函数每一秒去运行

总结

我是本次的主编,邦少,第一次写文章,也不知道写什么,往各位同学不要见怪,我会继续努力的,也祝各位也在学习前端的道路上更上一层楼,要想拿源码的同学,私聊评论.前端的学习没有什么捷径,只有不断的去练习去提升,才能让自己在未来的工作上换得更加高的报酬。希望大家能坚持下去,一起加油

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的HTML5 Canvas绘制时钟的示例代码: ``` <!DOCTYPE html> <html> <head> <title>Canvas时钟</title> <style> canvas { border: 2px solid black; } </style> </head> <body> <canvas id="clock" width="200" height="200"></canvas> <script> function drawClock() { // 获取Canvas元素 var canvas = document.getElementById("clock"); var ctx = canvas.getContext("2d"); // 获取Canvas中心点坐标 var centerX = canvas.width / 2; var centerY = canvas.height / 2; // 绘制表盘 ctx.beginPath(); ctx.arc(centerX, centerY, 80, 0, 2 * Math.PI); ctx.strokeStyle = "black"; ctx.stroke(); // 绘制刻度 for (var i = 1; i <= 12; i++) { var angle = i * Math.PI / 6; var x = centerX + 60 * Math.sin(angle); var y = centerY - 60 * Math.cos(angle); ctx.beginPath(); ctx.arc(x, y, 5, 0, 2 * Math.PI); ctx.fillStyle = "black"; ctx.fill(); } // 绘制时针 var now = new Date(); var hour = now.getHours() % 12; var minute = now.getMinutes(); var second = now.getSeconds(); var hourAngle = (hour + minute / 60) * Math.PI / 6; var hourX = centerX + 40 * Math.sin(hourAngle); var hourY = centerY - 40 * Math.cos(hourAngle); ctx.beginPath(); ctx.moveTo(centerX, centerY); ctx.lineTo(hourX, hourY); ctx.strokeStyle = "black"; ctx.stroke(); // 绘制分针 var minuteAngle = minute * Math.PI / 30; var minuteX = centerX + 60 * Math.sin(minuteAngle); var minuteY = centerY - 60 * Math.cos(minuteAngle); ctx.beginPath(); ctx.moveTo(centerX, centerY); ctx.lineTo(minuteX, minuteY); ctx.strokeStyle = "black"; ctx.stroke(); // 绘制秒针 var secondAngle = second * Math.PI / 30; var secondX = centerX + 60 * Math.sin(secondAngle); var secondY = centerY - 60 * Math.cos(secondAngle); ctx.beginPath(); ctx.moveTo(centerX, centerY); ctx.lineTo(secondX, secondY); ctx.strokeStyle = "red"; ctx.stroke(); } // 每秒钟更新时钟 setInterval(drawClock, 1000); </script> </body> </html> ``` 这段代码使用Canvas绘制了一个时钟,并且每秒钟更新一次。你可以将代码复制到一个HTML文件中运行,就可以看到时钟效果了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值