纯js时钟特效详细代码分析实例教程
电子时钟是网上常见的功能,在学习date对象和定时器功能时,来完成一个电子时钟的制作是不错的选择。学习本教程之前,读者需要具备html和css技能,同时需要有简单的javascript基础。
先准备一个html元素,用来放置时钟。新建一个div元素,它的id命名为clock,如下所示:
<div id="clock" class="clock_con"></div><!--基础时钟元素-->
本实例电子时钟的格式设定为 (yyyy-MM-dd hh:mm:ss) ,用js来组合一个简单的时钟字符串放到clock元素中。
本实例把时钟功能封装到函数中,所以先创建一个creatClock函数,在creatClock中再来编写具体代码。
建议在完成某一个前端功能时,应先分析功能的具体操作。再根据具体操作把实现功能的方法分成多个步骤,接下来一个步骤一个步骤去完成它。来看一下用js组合这样一串字符,需要哪些步骤:
1 调用date对象,获取计算机的本地时间
1.1 调用date对象
1.2 获取当前年份
1.3 获取当前月份,月份是从0开始计数,所以需要加1才是正确的月份
1.4 获取当前日期
1.5 获取当前小时
1.6 获取分钟
1.7 获取秒数
2. 格式化获取到的时间数据
2.1 单数字前添加字符串0,用以符合时钟格式
2.2 组合时间数据为字符串
3. 在clock元素中实时显示时间
3.1 获取clock元素
3.2 修改clock元素中的时间
3.3 使用定时器实时更新时间
具体代码如下:
function fnCreatClock(){
//声明时间相关变量
var dLocal,nYear,nMonth,nDate,nHours,nMinutes,nSeconds;
//1 获取计算机本地时间
function fnGetDate(){
//1.1 调用date对象
dLocal = new Date();
//1.2 获取当前年份
nYear = dLocal.getFullYear();
//1.3 获取当前月份,月份是从0开始计数,所以需要加1才是正确的月份
nMonth = dLocal.getMonth() + 1;
//1.4 获取当前日期
nDate = dLocal.getDate();
//1.5 获取当前小时
nHours = dLocal.getHours();
//1.6 获取分钟
nMinutes = dLocal.getMinutes();
//1.7 获取秒数
nSeconds = dLocal.getSeconds();
}
//2.1 封装一个函数,用于把单数字前添加字符串0,例如1改为01
function fnToDouble(num){
//声明一个返回结果
var sResult = '';
if(num<10){
//判断数字小于10则是单数字,需要在前面添加字符串0
sResult = '0' + num;
}else{
//数字为10以上转换为字符串
sResult = '' + num;
}
//返回格式化后的字符串
return sResult;
}
function fnFormatDate(){
//2.2 组合时间数据为字符串。本实例主要针对初学者,所以这里用的是最简单的格式化方式,即把所有数据用+号相连
return nYear + '-' + fnToDouble(nMonth) + '-' + fnToDouble(nDate) +
' ' + fnToDouble(nHours) + ':' + fnToDouble(nMinutes) + ':' + fnToDouble(nSeconds);
}
//3.1 获取clock元素
var eClock = document.getElementById('clock');
//获取时间
fnGetDate();
//3.2 修改clock元素中的时间
eClock.innerHTML = fnFormatDate();
//使用定时器实时更新时间
setInterval(function(){
//3.3 每秒更新时间
fnGetDate();
//3.3 修改clock元素中的时间
eClock.innerHTML = fnFormatDate();
},1000);
}
fnCreatClock();
此时的效果如图所示:

现在做出来的时钟看起来感觉有点简陋,也可以尝试把数字换成图片,这样所呈现效果就会好很多。这里暂时忽略日期部分,只为时间部分添加图片效果,还是先看一下需要哪些html元素,代码如下:
<div id="imgClock" class="clock_container"><!--图片时钟元素-->
<div id="imgHours" class="img_box">
<span class="img_0"></span>
<span class="img_0"></span>
</div>
<div class="img_point"></div>
<div id="imgMinutes" class="img_box">
<span class="img_0"></span>
<span class="img_0"></span>
</div>
<div class="img_point"></div>
<div id="imgSeconds" class="img_box">
<span class="img_0"></span>
<span class="img_0"></span>
</div>
</div>
还需要准备0-9共10张图片,可以自己制作类似效果的数字图片。css代码可以自己根据需要编写,也可以复制以下代码使用:
.clock_container{
margin-top:60px;
font-size:;
text-align:center;
}
.clock_container div{
display:inline-block;
}
.clock_container .img_box span{
display:inline-block;
width:80px;
height:100px;
margin:0 2px;
border-radius:8px;
background-color:#77a6b6;
}
.clock_container .img_0{
background:url(img/img_0.png) no-repeat;
}
.clock_container .img_1{
background:url(img/img_1.png) no-repeat;
}
.clock_container .img_2{
background:url(img/img_2.png) no-repeat;
}
.clock_container .img_3{
background:url(img/img_3.png) no-repeat;
}
.clock_container .img_4{
background:url(img/img_4.png) no-repeat;
}
.clock_container .img_5{
background:url(img/img_5.png) no-repeat;
}
.clock_container .img_6{
background:url(img/img_6.png) no-repeat;
}
.clock_container .img_7{
background:url(img/img_7.png) no-repeat;
}
.clock_container .img_8{
background:url(img/img_8.png) no-repeat;
}
.clock_container .img_9{
background:url(img/img_9.png) no-repeat;
}
.clock_container .img_point{
width:60px;
height:100px;
background:url(img/img_point.png) no-repeat center;
}
按照惯例,完成功能前先整理步骤。这里再多添加一个步骤,在imgClock元素中来完成图片美化后的时钟效果,步骤如下:
4. 在imgClock元素中,用图片作为背景实时修改时间
4.1 分别获取时(imgHours)、分(imgMinutes)、秒(imgSeconds)元素
4.2 根据时间修改时、分、秒元素的class,用来改变背景样式
4.3 使用定时器更新元素背景
修改后的代码如下:
function fnCreatClock(){
//声明时间相关变量
var dLocal,nYear,nMonth,nDate,nHours,nMinutes,nSeconds;
//1 获取计算机本地时间
function fnGetDate(){
//1.1 调用date对象
dLocal = new Date();
//1.2 获取当前年份
nYear = dLocal.getFullYear();
//1.3 获取当前月份,月份是从0开始计数,所以需要加1才是正确的月份
nMonth = dLocal.getMonth() + 1;
//1.4 获取当前日期
nDate = dLocal.getDate();
//1.5 获取当前小时
nHours = dLocal.getHours();
//1.6 获取分钟
nMinutes = dLocal.getMinutes();
//1.7 获取秒数
nSeconds = dLocal.getSeconds();
}
//2.1 封装一个函数,用于把单数字前添加字符串0,例如1改为01
function fnToDouble(num){
//声明一个返回结果
var sResult = '';
if(num<10){
//判断数字小于10则是单数字,需要在前面添加字符串0
sResult = '0' + num;
}else{
//数字为10以上转换为字符串
sResult = '' + num;
}
//返回格式化后的字符串
return sResult;
}
//获取时间
fnGetDate();
//4.1 获取图片背景的小时元素
var eImgHours = document.getElementById('imgHours');
//获取小时的第一个元素
var eHours1 = eImgHours.getElementsByTagName('span')[0];
//获取小时的第二个元素
var eHours2 = eImgHours.getElementsByTagName('span')[1];
//4.1 获取图片背景的分钟元素
var eImgMinutes = document.getElementById('imgMinutes');
//获取分钟的第一个元素
var eMinutes1 = eImgMinutes.getElementsByTagName('span')[0];
//获取分钟的第二个元素
var eMinutes2 = eImgMinutes.getElementsByTagName('span')[1];
//4.1 获取图片背景的秒元素
var eImgSeconds = document.getElementById('imgSeconds');
//获取秒的第一个元素
var eSeconds1 = eImgSeconds.getElementsByTagName('span')[0];
//获取秒的第二个元素
var eSeconds2 = eImgSeconds.getElementsByTagName('span')[1];
// 4.2 根据时间修改时、分、秒元素的class,用来改变背景样式
function fnChangeImgBg(){
eHours1.className = 'img_' + fnGetImgNum(nHours,0);
eHours2.className = 'img_' + fnGetImgNum(nHours,1);
eMinutes1.className = 'img_' + fnGetImgNum(nMinutes,0);
eMinutes2.className = 'img_' + fnGetImgNum(nMinutes,1);
eSeconds1.className = 'img_' + fnGetImgNum(nSeconds,0);
eSeconds2.className = 'img_' + fnGetImgNum(nSeconds,1);
}
//此函数用来计算根据当前时间的数字
function fnGetImgNum(num,bit){
//声明一个返回结果
var nResult = 0;
//判断是个位还是十位,0代表十位,1代表个位
if(bit===0){
//使用Math.floor可以向下取整,即不管是0.1还是0.9,都是取整数0。此方法用来获取时间的十位
nResult = Math.floor(num/10);
}else{
//通过fnToDouble函数把时间格式化双字符串,再取后面一个字符获取个位,前面的+号用于转换为数字
nResult = +fnToDouble(num).slice(1);
}
return nResult;
}
fnChangeImgBg();
//使用定时器实时更新时间
setInterval(function(){
//3.3 每秒更新时间
fnGetDate();
fnChangeImgBg(); //4.3 使用定时器更新元素背景
},1000);
}
fnCreatClock();
此时的效果比单独的文字还是会增色不少,如图所示:

我想要求效果再漂亮一点,让图片不是很突兀的改变,而是有一个滚动的动画。要实现这样的效果,图片需要改成一张0-9的竖形排列图,每个数字的高度要和时钟元素高度一致。再通过修改元素背景图片的位置,即可产生滚动的动画效果。
此效果需要的html元素如下所示:
<div id="animationClock" class="clock_container"><!--动画时钟元素-->
<div id="animationHours" class="animation_box">
<span></span>
<span></span>
</div>
<div class="img_point"></div>
<div id="animationMinutes" class="animation_box">
<span></span>
<span></span>
</div>
<div class="img_point"></div>
<div id="animationSeconds" class="animation_box">
<span></span>
<span></span>
</div>
</div>
在css里面给每一个元素加上同一个背景图片,需要加上transition过渡样式用来产生动画效果,如下所示:
.clock_container .animation_box span{
display:inline-block;
width:80px;
height:100px;
margin:0 2px;
border-radius:8px;
background-color:#77a6b6;
background-image:url(img/img_all.png);
background-repeat:no-repeat;
transition:.2s;
}
再随着时间改变给每一个时间元素修改背景图片的位置,即修改background-repeat-y的样式即可。按照惯例,还是先列步骤:
5. 在animationClock元素中,滚动动画显示时钟的实时变化
5.1 分别获取时(imgHours)、分(imgMinutes)、秒(imgSeconds)元素
5.2 根据时间修改时、分、秒元素的背景图片位置
5.3 使用定时器更新元素背景图片位置
修改后的代码如下:
function fnCreatClock(){
//声明时间相关变量
var dLocal,nYear,nMonth,nDate,nHours,nMinutes,nSeconds;
//1 获取计算机本地时间
function fnGetDate(){
//1.1 调用date对象
dLocal = new Date();
//1.2 获取当前年份
nYear = dLocal.getFullYear();
//1.3 获取当前月份,月份是从0开始计数,所以需要加1才是正确的月份
nMonth = dLocal.getMonth() + 1;
//1.4 获取当前日期
nDate = dLocal.getDate();
//1.5 获取当前小时
nHours = dLocal.getHours();
//1.6 获取分钟
nMinutes = dLocal.getMinutes();
//1.7 获取秒数
nSeconds = dLocal.getSeconds();
}
//2.1 封装一个函数,用于把单数字前添加字符串0,例如1改为01
function fnToDouble(num){
//声明一个返回结果
var sResult = '';
if(num<10){
//判断数字小于10则是单数字,需要在前面添加字符串0
sResult = '0' + num;
}else{
//数字为10以上转换为字符串
sResult = '' + num;
}
//返回格式化后的字符串
return sResult;
}
//获取时间
fnGetDate();
//此函数用来计算根据当前时间的数字
function fnGetImgNum(num,bit){
//声明一个返回结果
var nResult = 0;
//判断是个位还是十位,0代表十位,1代表个位
if(bit===0){
//使用Math.floor可以向下取整,即不管是0.1还是0.9,都是取整数0。此方法用来获取时间的十位
nResult = Math.floor(num/10);
}else{
//通过fnToDouble函数把时间格式化双字符串,再取后面一个字符获取个位,前面的+号用于转换为数字
nResult = +fnToDouble(num).slice(1);
}
return nResult;
}
//5.1 获取动画时钟的小时元素
var eAnimationHours = document.getElementById('animationHours');
//获取小时的第一个元素
var eHours3 = eAnimationHours.getElementsByTagName('span')[0];
//获取小时的第二个元素
var eHours4 = eAnimationHours.getElementsByTagName('span')[1];
//5.1 获取动画时钟的分钟元素
var eAnimationMinutes = document.getElementById('animationMinutes');
//获取分钟的第一个元素
var eMinutes3 = eAnimationMinutes.getElementsByTagName('span')[0];
//获取分钟的第二个元素
var eMinutes4 = eAnimationMinutes.getElementsByTagName('span')[1];
//5.1 获取动画时钟的秒元素
var eAnimationSeconds = document.getElementById('animationSeconds');
//获取秒的第一个元素
var eSeconds3 = eAnimationSeconds.getElementsByTagName('span')[0];
//获取秒的第二个元素
var eSeconds4 = eAnimationSeconds.getElementsByTagName('span')[1];
// 5.2 根据时间修改时、分、秒元素的背景图片位置
function fnAnimationBg(){
eHours3.style.backgroundPositionY = -fnGetImgNum(nHours,0) * 100 + 'px';
eHours4.style.backgroundPositionY = -fnGetImgNum(nHours,1) * 100 + 'px';
eMinutes3.style.backgroundPositionY = -fnGetImgNum(nMinutes,0) * 100 + 'px';
eMinutes4.style.backgroundPositionY = -fnGetImgNum(nMinutes,1) * 100 + 'px';
eSeconds3.style.backgroundPositionY = -fnGetImgNum(nSeconds,0) * 100 + 'px';
eSeconds4.style.backgroundPositionY = -fnGetImgNum(nSeconds,1) * 100 + 'px';
}
fnAnimationBg();
//使用定时器实时更新时间
setInterval(function(){
//3.3 每秒更新时间
fnGetDate();
//5.3 使用定时器更新元素背景图片位置
fnAnimationBg();
},1000);
}
fnCreatClock();
纯js时钟特效详细代码分析实例教程的更多相关文章
- js 时钟特效
时钟特效 CreateTime--2018年2月24日15:11:23 Author:Marydon 实现方式:都是基于HTML5的canvas标签实现的 款式一 借助jQuery插件实现 < ...
- cocos2d-x v3.2 FlappyBird 各个类对象详细代码分析(6)
今天我们要讲三个类,这三个类应该算比較简单的 HelpLayer类 NumberLayer类 GetLocalScore类 HelpLayer类,主要放了两个图形精灵上去,一个是游戏的名字,一个是提示 ...
- JS日期级联组件代码分析及demo
最近研究下JS日期级联效果 感觉还不错,然后看了下kissy也正好有这么一个组件,也看了下源码,写的还不错,通过google最早是在2011年 淘宝的虎牙(花名)用原审JS写了一个(貌似据说是从YUI ...
- cocos2d-x v3.2 FlappyBird 各个类对象详细代码分析(7)
今天我们介绍最后两个类 GameOverLayer类 GameLayer类 GameLayer类是整个游戏中最重要的类,由于是整个游戏的中央系统,控制着各个类(层)之间的交互,这个类中实现了猪脚小鸟和 ...
- js获取IP地址多种方法实例教程
js获取IP地址方法总结 js代码获取IP地址的方法,如何在js中取得客户端的IP地址.原文地址:js获取IP地址的三种方法 http://www.jbxue.com/article/11338. ...
- 纯js分页代码(简洁实用)
纯js写的分页代码. 复制代码代码如下: //每页显示字数 PageSize=5000; //分页模式 flag=2;//1:根据字数自动分页 2:根据[NextPage]分页 //默认页 start ...
- 虚拟机创建流程中neutron代码分析(三)
前言: 当neutron-server创建了port信息,将port信息写入数据库中.流程返回到nova服务端,接着nova创建的流程继续走.在计算节点中neutron-agent同样要完成很多的工作 ...
- Three.js粒子特效,shader渲染初探(一篇非常详细的介绍)
Three.js粒子特效,shader渲染初探 转载来源:https://juejin.im/post/5b0ace63f265da0db479270a 这大概是个序 关于Three.js,网上有不多 ...
- 微信小游戏 demo 飞机大战 代码分析 (三)(spirit.js, animation.js)
微信小游戏 demo 飞机大战 代码分析(三)(spirit.js, animation.js) 微信小游戏 demo 飞机大战 代码分析(一)(main.js) 微信小游戏 demo 飞机大战 代码 ...
随机推荐
- P2341 [USACO03FALL][HAOI2006]受欢迎的牛 G 题解
原题链接 POJ的链接 简要题意: 给定一张图,求多少个点,每个点都能到达它. 本题作为强连通分量的入门题. 何为强连通分量?有什么用? 下面一一解释. 首先,我们要确认,这道题目如果不用强连通分量而 ...
- c++源文件从文本阶段到可执行文件的过程
过程分为四个阶段: 预处理阶段····>编译阶段····>汇编阶段····>链接阶段 1)预处理阶段:对源代码文件中的文件包含关系.预编译语句(宏定义)进行分析和替换,生成预编译文件 ...
- 微信小程序分享转发用法大全——自定义分享、全局分享、组合分享
官方提供的自定义分享 使用隐式页面配置函数实现的全局分享-推荐 使用隐式路由实现的全局分享-不推荐,仅供了解隐式路由 前言: 目前微信小程序只开放了页面自定义分享的API,为了能够更灵活的进行分享配置 ...
- VMware使用总结
1.处理器设置释疑 比如一个8核16线程处理器 处理器数量最多设置为8,而每个处理器的内核数量*处理器个数必须小于等于16. 2.虚拟网络编辑器 NAT模式中可通过NAT设置将内部端口映射到主机端口. ...
- OpenCV-Python 图像金字塔 | 二十
目标 在本章中, 我们将学习图像金字塔 我们将使用图像金字塔创建一个新的水果"Orapple" 我们将看到以下功能:cv.pyrUp(),cv.pyrDown() 理论 通常,我们 ...
- 十分钟一起学会ResNet残差网络
作者 | 荔枝boy 目录 深层次网络训练瓶颈:梯度消失,网络退化 ResNet简介 ResNet解决深度网络瓶颈的魔力 ResNet使用的小技巧 总结 深层次网络训练瓶颈:梯度消失,网络退化 深度卷 ...
- Java并发编程锁之独占公平锁与非公平锁比较
Java并发编程锁之独占公平锁与非公平锁比较 公平锁和非公平锁理解: 在上一篇文章中,我们知道了非公平锁.其实Java中还存在着公平锁呢.公平二字怎么理解呢?和我们现实理解是一样的.大家去排队本着先来 ...
- Python第十二章-多进程和多线程01-多进程
多进程和多线程 一.进程 1.1 进程的引入 现实生活中,有很多的场景中的事情是同时进行的,比如开车的时候 手和脚共同来驾驶汽车,再比如唱歌跳舞也是同时进行的:试想,如果把唱歌和跳舞这2件事情分开依次 ...
- Material Design 组件之 FloatingActionButton
Material Design 设计规范在 Google I/O 2014 推出,这种设计理念一经推出就受到广大开发者的喜爱,主要侧重于纸墨化创作和突出设计的实体感,使得设计更接近于真实世界,力求平滑 ...
- C. Yet Another Walking Robot Round #617 (Div. 3)()(map + 前后相同状态的存储)
C. Yet Another Walking Robot time limit per test 1 second memory limit per test 256 megabytes input ...