分别利用原生JS和画布画出时钟
1.原生JS绘制始终
思路:
1)在body中构建好始终的静态DOM结构
2)在CSS中设置好DOM结构的样式
3)在js文件中设置DOM的运动样式
视图文件:
<div id="warp">
<div class="clock">
<!--钟表数字-->
<div class="number">
<div><span>1</span></div>
<div><span>2</span></div>
<div><span>3</span></div>
<div><span>4</span></div>
<div><span>5</span></div>
<div><span>6</span></div>
<div><span>7</span></div>
<div><span>8</span></div>
<div><span>9</span></div>
<div><span>10</span></div>
<div><span>11</span></div>
<div><span>12</span></div>
</div>
<!--时针,分针,秒针-->
<div id="hour"></div>
<div id="minute"></div>
<div id="seconds"></div>
<div id="center"></div>
</div>
样式表文件:
* {
margin: 0;
padding: 0;
}
/*产生同心圆*/
#warp {
position: relative;
width: 250px;
height: 250px;
margin: 20px auto;
border-radius: 50%;
background-image: -webkit-linear-gradient(top,#cee2e9,#777775);
}
#warp .clock {
position: absolute;
left: 10px;
top: 10px;
width: 230px;
height: 230px;
border-radius: 50%;
background: #fff;
}
/*设置数字部分样式*/
#warp .number {
width: 100%;
height: 100%;
position: relative;
}
#warp .number div {
position: absolute;
left: 10px;
top: 112px;
width: 210px;
text-align: center;
}
#warp .number div span {
display: block;
width: 10px;
height: 22px;
}
/*设置时针样式*/
#warp #hour {
position: absolute;
bottom: 110px;
left: 114px;
width: 6px;
height: 80px;
background: red;
border-radius: 5px;
transform-origin: 50% bottom;
}
/*设置分针样式*/
#warp #minute {
position: absolute;
bottom: 110px;
left: 115px;
width: 4px;
height: 90px;
background: black;
border-radius: 5px;
transform-origin: 50% bottom;
}
/*设置秒针样式*/
#warp #seconds {
position: absolute;
bottom: 110px;
left: 116px;
width: 2px;
height: 110px;
background: green;
border-radius: 5px;
transform-origin: 50% bottom;
}
/*设置时钟中心点*/
#warp #center {
position: absolute;
left: 113px;
bottom:106px ;
width: 8px;
height: 8px;
border-radius: 50%;
background: black;
}
Js文件:
window.onload = function(){
//设置数字键
function number(){
//获取number标签
var num = document.getElementsByClassName("number")[0];
var divs = num.getElementsByTagName("div");
var spans = num.getElementsByTagName("span");
//每个数字旋转30度
for (var i = 0;i < divs.length; i ++){
var deg = i*30 + 120;
divs[i].style.transform = "rotate("+(deg)+"deg)";
spans[i].style.transform = "rotate("+(-deg)+"deg)";
}
};
number();
//设置旋转
function run(){
setInterval(function(){
var nowDate = new Date();//获取时间
var nowHours = nowDate.getHours();//获取小时
var nowMinutes = nowDate.getMinutes();//获取分钟
var nowSeconds = nowDate.getSeconds();//获取秒数
//获取指针
var hours = document.getElementById("hour");
var minutes = document.getElementById("minute");
var secondes = document.getElementById("seconds");
secondes.style.transform = "rotate("+nowSeconds*6+"deg)";
minutes.style.transform = "rotate("+nowMinutes*6+"deg)";
hours.style.transform = "rotate("+(nowHours*30+nowMinutes*6/360*30)+"deg)";//时的度数,加上分钟度数占360的百分比乘以30度等于当前时针的度数
},1000)
}
run();
}
最终效果:
2.利用canvas绘制时钟
思路:
1)在画布上绘制出时钟轮廓和秒格和小时格,以及数字
2)分别计算时针、分针和秒针运动角度
3)将绘制视图函数和运动函数封装到时针函数,在计时器中调用,每间隔1s重置画布
代码如下:
<body>
<canvas id="can1" width="800" height="800"></canvas>
<script type="text/javascript">
var can1 = document.getElementById("can1");
var ctx = can1.getContext("2d");//获取画笔
//重置画布函数
function reSet(){
can1.height = can1.height;//每次清除画布,然后变化后的时间补上
ctx.translate(400, 400);//设置坐标轴
ctx.save();//保存中点坐标1
}
//绘制中心圆和外圆
function circle(){
//外面大圆
ctx.lineWidth = 3;
ctx.beginPath();
ctx.arc(0, 0, 320, 0, 2 * Math.PI, true);
ctx.closePath();
ctx.stroke();
//中心园
ctx.beginPath();
ctx.arc(0, 0, 10, 0, 2 * Math.PI, true);
ctx.closePath();
ctx.stroke();
}
//绘制字体
function num(){
var R = 270;//设置文字距离时钟中心点距离
ctx.font = "32px arial";//设置字体样式
ctx.textBaseline = "middle";//字体上下居中,绘制时间
for(var i = 1; i < 13; i++) {
//利用三角函数计算字体坐标表达式
var x = R * Math.cos(i * Math.PI / 6 - Math.PI / 2);
var y = R * Math.sin(i * Math.PI / 6 - Math.PI / 2);
var len = ctx.measureText(i);
ctx.fillText(i, x - len.width / 2, y);//绘制字体,x-len.width/2使字体居中
}
}
//绘制小格
function smallGrid(){
ctx.rotate(-Math.PI/2);//时间从3点开始,倒转90度
for(var i = 0; i < 60; i++) {
ctx.beginPath();
ctx.rotate(Math.PI / 30);
ctx.moveTo(300, 0);
ctx.lineTo(320, 0);
ctx.stroke();
}
}
//绘制大格
function bigGrid(){
for(var i = 0; i < 12; i++) {
ctx.lineWidth = 8;
ctx.beginPath();
ctx.rotate(Math.PI / 6);
ctx.moveTo(310, 0);
ctx.lineTo(290, 0);
ctx.stroke();
}
}
//指针运动函数
function move(){
var t = new Date();//获取当前时间
var h = t.getHours();//获取小时
h = h>12?(h-12):h;//将24小时制转化为12小时制
var m = t.getMinutes();//获取分针
var s = t.getSeconds();//获取秒针
ctx.save();//再次保存2
ctx.lineWidth = 8;
//旋转角度=30度*(h+m/60+s/3600)
//分针旋转角度=6度*(m+s/60)
//秒针旋转角度=6度*s
ctx.beginPath();
//绘制时针
ctx.rotate((Math.PI/6)*(h+m/60+s/3600));
ctx.moveTo(-20,0);
ctx.lineTo(150,0);
ctx.stroke();
ctx.restore();//恢复到2,(最初未旋转状态)避免旋转叠加
ctx.save();//3
//画分针
ctx.lineWidth = 5;
ctx.beginPath();
ctx.rotate((Math.PI/30)*(m+s/60));
ctx.moveTo(-20,0);
ctx.lineTo(250,0);
ctx.stroke();
ctx.restore();//恢复到3,(最初未旋转状态)避免旋转叠加
ctx.save();
//绘制秒针
ctx.lineWidth = 2;
ctx.beginPath();
ctx.rotate((Math.PI/30)*s);
ctx.moveTo(-20,0);
ctx.lineTo(270,0);
ctx.stroke();
}
//定义时钟函数
function clock() {
reSet();
num();
smallGrid();
bigGrid();
circle();
move();
}
//设置定时器,每1秒执行一次时钟函数
setInterval(clock,1000);
</script>
</body>
最终效果: