如何制作一个简单的刻度时钟

153 阅读3分钟

我正在参加 码上掘金体验活动,详情:show出你的创意代码块

前言

这次打算给大家介绍一下如何制作一个简单的刻度时钟,依旧是利用网页三剑客进行编码,不过这个偏JS较多,不过也很简单,接下来请看代码吧。

代码

正文

1、布局

首先我们先要知道我们要做的是什么,包含有哪些部分,然后再一个一个,一层层的布局出来。时钟包括一个外壳、时针、秒针、刻度、数字等组成,那我们就要先这个这些给画出来,先进行html布局,部分代码如下:

<div class="clockBox">
  <img class="bg-img" src="https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fp16.qhimg.com%2Ft012fe61ae4c7e783b6.jpg&refer=http%3A%2F%2Fp16.qhimg.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1652921552&t=6a1df7de5c87162200c6d86de610837a" />
	<div class="clock" id="clock">
		<div class="hour" id="hour"></div>
		<div class="min"id="min"></div>
		<div class="sec"id="sec"></div>
	</div>
</div>

以上代码分别定义了时钟的各个部分的容器,img是我想给时钟一个背景,这个是lol里的瑞文,很喜欢的一个英雄。

2、进行样式调整

把html都做出来之后,就可以一个一个的用css进行位置调整,部分代码如下:

.clockBox{
    width: 300px;
    height: 300px;
    margin: 100px auto;
    border-radius: 50%;
    position: relative;
    overflow: hidden;
}
.bg-img{
  width: 100%;
  position: absolute;
  z-index: 1;
  opacity: 0.8;
}
.clock{
	width: 300px;
	height: 300px;
	border:1px solid black;
	border-radius: 50%;
	position: absolute;
	box-shadow: 0px 0px 20px black;
  background-size: 100%;
  z-index: 10;
}

.kedu{
	width: 3px;
	height: 5px;
	background-color: #F12D1C;
	position: absolute;
	left: 145px;
	transform-origin:5px 150px;
}
.kedu2{
	width: 5px;
	height: 15px;
	background-color: #8F2118;
	position: absolute;
	left: 145px;
	transform-origin:5px 150px;
}
.num{
	width: 50px;
	height: 50px;
	position: absolute;
	left: 135px;
	top:10px;
	color: #E74133;
	font-size: 23px;
	font-weight: bold;
	font-family: "微软雅黑";
	transform-origin:15px 140px;
}
.numDiv{
	width: 50px;
	height: 50px;
	position: absolute;
	transform-origin:10px 18px;
}
.hour{
	width: 5px;
	height: 110px;
	background-color: black;
	position: absolute;
	left: 145px;
	top:50px;
	transform-origin:2.5px 100px;
}
.min{
	width: 3px;
	height: 130px;
	background-color: black;
	position: absolute;
	left: 145px;
	top:30px;
	transform-origin:2.5px 120px;
}
.sec{
	width: 1px;
	height: 150px;
	background-color: red;
	position: absolute;
	left: 145px;
	top:10px;
	transform-origin:2.5px 140px;
}

效果如下图:

image.png

把时钟的壳和时针分支的样式和位置调好,后来我发现刻度有很多个,如果一个一个进行调整会非常的麻烦,所以我使用js进行动态加入渲染,非常的银杏。代码如下:

var html = '<div class="kedu"></div>';
	for(var i = 0; i<60; i++){
		var $html = $(html);
		$html.css("-webkit-transform","rotate("+i*6+"deg)");
		$("#clock").append($html);
		if(!(i%5)){
			$html.addClass("kedu2");
		}
	}

得到时钟的所有刻度, 如图:

image.png

然后数字同理,不过只加12个,代码如下:

for(var i = 1; i<13; i++){
		var htmlNum = '<div class="num"></div>';
		var $htmlNum = $(htmlNum);
		var htmlDiv = '<div class="numDiv">'+i+'</div>';
		var $htmlDiv = $(htmlDiv);
		$htmlDiv.css("transform","rotate("+ (-i*30)+"deg)");
		$htmlNum.append($htmlDiv);
		$htmlNum.css("transform","rotate("+ i*30+"deg)")
		$("#clock").append($htmlNum);
	}

3、动起来

接下来就是让时针动起来了,原理就是让时针、分针以及秒针绕着时针中心旋转,秒针每秒钟动一小格,这个小格就是360度除以60(一圈有60秒),然后分针和时针依次类推,60进制动一下下一级的针,部分代码如下:

function clockRun(){
		var date =new Date();
		var hour = date.getHours();
		var min = date.getMinutes();
		var sec = date.getSeconds();
		$("#hour").css("transform","rotate("+ (hour*30 + min/2)+"deg)");
		$("#min").css("transform","rotate("+ (min*6)+"deg)");
		$("#sec").css("transform","rotate("+ (sec*6)+"deg)");
	}
	clockRun();
	setInterval(clockRun, 1000);

我们定义一个方法得到各个针的角度,使用定时器给它每秒钟执行一次,这样我们就得到一个会动的时钟,最终效果如下:

1651244797704_.gif

结语

本文描述了如何制作一个简单的时钟,做法也非常的简单,最主要的是通过css 的transform属性,进行时钟各个针的旋转,达到动起来的目的。