本文介绍如何使用 JavaScript 实现带有数字翻转动画效果的图片时钟。通过动态操作 DOM 节点,利用定时器控制图片滚动,模拟数字向上翻转的视觉效果。文章详细解析了需求、编程思路及具体代码实现,适合希望学习前端动画与 DOM 操作的开发者参考。
本文分享了一段使用 JavaScript 实现的带翻转动画效果的图片时钟代码,供读者参考学习。
首先展示最终效果,如下图所示:

需求分析与编程思路
一、需求分析
时钟需根据当前系统时间动态更新显示内容。在时间变更时,数字需呈现向上翻转并切换至下一个数字的动画效果。
二、编程思路
若仅根据系统时间更换图片,只需获取对应数字图片的 DOM 元素,读取当前时间,并修改图片的 src 属性指向新数字即可。但为了实现翻转动画,需设定一个高度等于单张数字图片高度的容器窗口。当检测到时间变化时,在指定数字图片后插入代表新数字的图片节点,并启动定时器以极短的时间间隔持续向上移动该节点。当移动距离达到一个数字图片的高度后,移除最上方的旧节点。通过这种往复操作,即可实现数字向上翻转的动画效果。
三、代码实现
代码实现细节
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<style>
*{
padding: 0;
margin: 0;
}
.number{
height: 70px;
overflow: hidden;
float: left;
}
.number img{
display: block;
}
</style>
<body>
<div>
<div id="shi1" class="number">
<img src="img/0.jpg" />
</div>
<div id="shi2" class="number">
<img src="img/0.jpg" />
</div>
<div class="number">
<img src="img/c.jpg" />
</div>
<div id="fen1" class="number">
<img src="img/0.jpg" />
</div>
<div id="fen2" class="number">
<img src="img/0.jpg" />
</div>
<div class="number">
<img src="img/c.jpg" />
</div>
<div id="miao1" class="number">
<img src="img/0.jpg" />
</div>
<div id="miao2" class="number">
<img src="img/0.jpg" />
</div>
</div>
<script>
var shi1D = document.getElementById('shi1');
var shi2D = document.getElementById('shi2');
var fen1D = document.getElementById('fen1');
var fen2D = document.getElementById('fen2');
var miao1D = document.getElementById('miao1');
var miao2D = document.getElementById('miao2');
function getTime() {
var myDate = new Date();
var mytime=myDate.toLocaleString('chinese', { hour12: false });
//获得时间格式为2020/12/30 18:54:39 第一个split(' ')[1]获得18:54:39这个字符串,在对其.split('')获得[1,8,:,5,4,:,3,9]这个数组
//由此得到,time[0]time[1]为小时,time[3]time[4]为分钟,time[6]time[7]为秒
time = mytime.split(' ')[1].split('');
// console.log(time);
return new Array(time[0],time[1],time[3],time[4],time[6],time[7]);
}
var h1=0,h2=0,f1=0,f2=0,m1=0,m2=0;
//更新小时1
var ht1=0;
setInterval(function () {
var a = getTime();
if (a[0]!=h1){
h1=a[0];
//获得当前的子结点
var childImg = shi1D.getElementsByTagName('img')[0];
var imgM = document.createElement('img');
imgM.src='img/'+h1+'.jpg';
shi1D.appendChild(imgM);
var s1 = setInterval(function () {
ht1+=1;
shi1D.scrollTop=ht1;
if (ht1>=70){
clearInterval(s1);
setTimeout(function () {
childImg.remove();
ht1=0;
},100)
}
},1)
}
},1000);
//更新小时2
var ht2=0;
setInterval(function () {
var a = getTime();
if(a[1]!=h2){
h2=a[1];
//获得当前的子结点
var childImg = shi2D.getElementsByTagName('img')[0];
var imgM = document.createElement('img');
imgM.src='img/'+h2+'.jpg';
shi2D.appendChild(imgM);
var m2 = setInterval(function () {
ht2+=1;
shi2D.scrollTop=mt1;
if (ht2>=70){
clearInterval(m2);
setTimeout(function () {
childImg.remove();
ht2=0;
},100)
}
},1)
}
},1000);
//更新分钟1
var ft1=0;
setInterval(function () {
var a = getTime();
if (a[2]!=f1){
f1=a[2];
//获得当前的子结点
var childImg = fen1D.getElementsByTagName('img')[0];
var imgM = document.createElement('img');
imgM.src='img/'+f1+'.jpg';
fen1D.appendChild(imgM);
var m2 = setInterval(function () {
ft1+=1;
miao1D.scrollTop=ft1;
if (ft1>=70){
clearInterval(m2);
setTimeout(function () {
childImg.remove();
ft1=0;
},100)
}
},1)
}
},1000);
//更新分钟2
var ft2=0;
setInterval(function () {
var a = getTime();
if (a[3]!=f2){
f2=a[3];
//获得当前的子结点
var childImg = fen2D.getElementsByTagName('img')[0];
var imgM = document.createElement('img');
imgM.src='img/'+f2+'.jpg';
fen2D.appendChild(imgM);
var m2 = setInterval(function () {
ft2+=1;
fen2D.scrollTop=ft2;
if (ft2>=70){
clearInterval(m2);
setTimeout(function () {
childImg.remove();
ft2=0;
},100)
}
},1)
}
},1000);
//更新秒1
var mt1=0;
setInterval(function () {
var a = getTime();
if (a[4]!=m1){
m1=a[4];
//获得当前的子结点
var childImg = miao1D.getElementsByTagName('img')[0];
var imgM = document.createElement('img');
imgM.src='img/'+m1+'.jpg';
miao1D.appendChild(imgM);
var m2 = setInterval(function () {
mt1+=1;
miao1D.scrollTop=mt1;
if (mt1>=70){
clearInterval(m2);
setTimeout(function () {
childImg.remove();
mt1=0;
},100)
}
},1)
}
},1000);
//更新秒2
var mt2=0;
setInterval(function () {
var a = getTime();
//获得当前的子结点
var childImg = miao2D.getElementsByTagName('img')[0];
// miao2D.src='img/'+a[5]+'.jpg'
var imgM = document.createElement('img');
imgM.src='img/'+a[5]+'.jpg';
miao2D.appendChild(imgM);
var m2 = setInterval(function () {
mt2+=1;
// console.log(mt2);
miao2D.scrollTop=mt2;
if (mt2>=70){
clearInterval(m2);
setTimeout(function () {
childImg.remove();
mt2=0;
},100)
}
},1)
},1000);
</script>
</body>
</html>以上即为本文的全部内容,希望能为读者的学习提供有益帮助,也欢迎大家继续支持本站。