如何用jquery实现时钟效果

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用jquery实现时钟效果相关的知识,希望对你有一定的参考价值。

参考技术A 首先获取当前时间与目标时间的时间差,然后通过定时器更新这个时间差,就实现了倒计时效果。实现上述过程需要以下两个函数:
getTime() // 返回距1970年1月1日之间的毫秒数,这样将时间差(毫秒数)÷3600÷24即为天数,时分秒类似setTimeout(code,millisec); // 在指定的毫秒数后调用函数实例演示如下
创建html元素
<div class="box"> <span>距离2015年国庆节还剩:</span><br> <div class="content"> <input type="text" id="time_d">天<input type="text" id="time_h">时<input type="text" id="time_m">分<input type="text" id="time_s">秒 </div></div>设置css样式
div.boxwidth:300px;padding:20px;margin:20px;border:4px dashed #ccc;div.box>spancolor:#999;font-style:italic;div.contentwidth:250px;margin:10px 0;padding:20px;border:2px solid #ff6666;input[type='text']width:45px;height:35px;padding:5px 10px;margin:5px 0;border:1px solid #ff9966;编写jquery代码
$(function() show_time();); function show_time() var time_start = new Date().getTime(); //设定当前时间 var time_end = new Date("2015/10/01 00:00:00").getTime(); //设定目标时间 // 计算时间差 var time_distance = time_end - time_start; // 天 var int_day = Math.floor(time_distance/86400000) time_distance -= int_day * 86400000; // 时 var int_hour = Math.floor(time_distance/3600000) time_distance -= int_hour * 3600000; // 分 var int_minute = Math.floor(time_distance/60000) time_distance -= int_minute * 60000; // 秒 var int_second = Math.floor(time_distance/1000) // 时分秒为单数时、前面加零 if(int_day < 10) int_day = "0" + int_day; if(int_hour < 10) int_hour = "0" + int_hour; if(int_minute < 10) int_minute = "0" + int_minute; if(int_second < 10) int_second = "0" + int_second; // 显示时间 $("#time_d").val(int_day); $("#time_h").val(int_hour); $("#time_m").val(int_minute); $("#time_s").val(int_second); // 设置定时器 setTimeout("show_time()",1000); 观察效果
某个时刻的截图

几秒后的截图

如何用iframe标签以及Javascript制作时钟?

如何利用iframe标签以及Javascript制作时钟?

  如何制作一个时钟呢?效果如下图所示:

这里的时钟会不停的走,但是下面的页面是不会变得,这样就实现了我们想要的效果了。下面我将分为以下几个方面来讲:

  1. javascript中的Date引用类型
  2. 几种效果不佳的实例
  3. <iframe>标签
  4. 最终效果不错的实例、
  5. 使用react

如果大家想直接看最终不错的效果实例,可以直接点击这里

第一部分:Date引用类型

  1.日期对象可以直接使用new操作符和Date构造函数构造。代码如下:

var date=new Date();

  

    2. 通过构造函数直接得到的date对象的时间是当前的时间。由于Date类型使用自UTC(Coordinated Universal Time,国际协调时间)1970年1月1日午夜至改日期经过的毫秒数。所以如果直接输出,按道理来说会出现一个很大的数字。但是因为Date引用类型是继承了Object引用类型的,同时也就继承了Object的toString()方法。故直接输出时,它会默认使用toString()方法。

var date=new Date;
console.log(date);//  Mon Oct 31 2016 23:29:07 GMT+0800 (中国标准时间)
console.log(date.toString());//Mon Oct 31 2016 23:29:07 GMT+0800 (中国标准时间)

 3.如果我们使用valueOf()方法(同样也是继承自Object()引用类型),就可以得到历经的毫秒数了。

var date=new Date();
console.log(date.valueOf());//1477927747916
1477927747916毫秒算下来刚好是46年多。

 4.同时,Date还有一个toLocaleString()方法,该方法会将毫秒表示的时间转化为当地的字符串表示的时间,如下所示:

var date=new Date();
console.log(date.toLocaleString());//2016/10/31 下午11:29:07

 5.但是如果我们不想使用当前时间而希望使用自定义的时间呢? Date类型为我们提供了两种方法,分别具有不同的初始化方式。

var time=new Date(Date.parse("October 31,2016"));
console.log(time);//Mon Oct 31 2016 00:00:00 GMT+0800 (中国标准时间)

var Time=new Date("October 31,2016");
console.log(Time);//Mon Oct 31 2016 00:00:00 GMT+0800 (中国标准时间)

var dateTime=new Date(Date.UTC(2016,9,31,23,26,50));
console.log(dateTime);//这是一个bug  Tue Nov 01 2016 07:26:50 GMT+0800 (中国标准时间)

var Timedate=new Date(2016,9,31,23,26,50);
console.log(Timedate);//Mon Oct 31 2016 23:26:50 GMT+0800 (中国标准时间)

 即这两个方法分别是在构造函数时初始化,一个是Date.parse(),如果输入的格式正确,我们甚至省略之。另外一个是Date.UTC,这里传入了六个参数,分别是 年 月 日 时 分 秒 ,同样是可以省略不写。这里值得注意的是:

  • “月”是从0开始计算的,即2月但是要输入1,10月要输入9......
  • “时”必须使用24小时的方法来计算。

但是这里有一个bug,即当我们使用var dateTime=new Date(Date.UTC(2016,9,31,23,26,50));传入的数字是9,应该得到10月份,却得到了11月份,这时我们可以采用其他方法来替换之。

第二部分:几种效果不佳的实例

  ok!已经知道了如何创建时间对象,这时候,我们就可以使用它来做时钟了。但是,以下几种方法创建时钟是不合适的。

  A.  使用javascript定时器外加meta标签中的自动刷新功能。

  代码如下图所示:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta http-equiv="refresh" content="2">
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<div id="time"></div>
	<script>
		var date=new Date();
		var time=document.getElementById("time");

		setInterval(function(){
			time.innerHTML=date.toLocaleString();
		},1);
	</script>	
</body>
</html>

  如果你尝试以下发现确实可以达到类似的效果,但是你应该注意到这时我们在div元素中没有插入任何内容,一旦插入内容,就会发现得不到我们想要的效果了,因此这种方式不可取。

 B 使用javascript定时器外加window.location.reload()函数,使页面不断刷新。代码如下所示:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<div id="time"></div>
	<script>
		var date=new Date();
		var time=document.getElementById("time");
		function reload(){
			window.location.reload();
		}

		setInterval(function(){
			reload();
		},1000);

		setInterval(function(){
			time.innerHTML=date.toLocaleString();
		},1000);
	</script>	
</body>
</html>

  毫无疑问,这种方法也会导致页面不断刷新,在div中加入一些文字或者图片就可以看出来。

C.使用javascript以及dom方法实现。

 

 

<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="refresh" content="2">
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div id="time"><img src="时钟.jpg"/>我是桌面上的时钟,哈哈</div>
<div id="bottom">
</div>
<script>
    var date=Date.now();
   var time=document.getElementById("time");
   var para=document.createElement("p");
   time.appendChild(para);
   setInterval(function(){
   para.innerHTML=date.toLocaleString();
   },1000);
</script>	
</body>
</html>

  

 即我们在div中只创建一个p,把时钟放到p中去,动态的刷新p,并且这是你可以添加文字或者图片,发现都不会有影响。这就大功告成了吗?如果你尝试这在div中插入一个视频,就会发现,视频会在你规定的时间不断刷新,播放不了,因此图片和文字看不出来,是因为我们肉眼没法分辨,因此,这种方法也不可取。

 注:插入视频可以如下:

<embed align="center" src="告白气球.mp4" type="audio/mpeg" width="1002"  autostart="false" controls="controls" height="500" ></embed>

  当然,这只是其中一种方法,html5中还有其他方法,大家可以学习。

第三部分:<iframe>标签

  <iframe>标签规定了一个内联框架,它可以用来在当前html文档中嵌入另外一个文档。

  如<iframe scr="http://www.zhuzhenwei.com"><iframe>。在iframe元素的内容部分,即<iframe>与</iframe>之间是不需要放内容的。但是我们可以放一些提示性的内容,这样对于一些不支持<iframe>标签的浏览器就可以显示其中的内容了。

  在iframe标签中有一些属性,比较常用的就是height width ,这两个属性可以规定这个内联框架的高度和宽度。name属性可以规定<iframe>的名称。src属性用于规定在<iframe>中显示的文档的url。scrolling属性有yes no auto 三种属性值,它规定是否在<iframe>中显示滚动条。

第四部分:最终效果不错的实例

  从第三部分可知,如果我们能使用iframe标签引入一个外部的文档,就可以解决所有的问题了,因为每当刷新时,只会刷新在iframe里面的内容。代码如下:

 

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
<iframe src="test.html" width="200" height="30" seamless="seamless" scrolling="no" ></iframe>
<p>我是页面上的时钟,哈哈</a>
</body>
</html>

以下是test.html中的代码
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<div id="time"></div>
	<script>
		var date=new Date();
		var time=document.getElementById("time");
		function reload(){
			window.location.reload();
		}
		setInterval(function(){
			reload();
		},1000);

		setInterval(function(){
			time.innerHTML=date.toLocaleString();
		},1000);
	</script>	
</body>
</html>

  OK!成功解决问题!效果图如下:

此时,下面的时钟可以正常运行,上面的视频也可以正常播放。

 

 

第五部分:使用React

  使用reactl.js来实现也是非常简单的,代码如下所示:

  htmL

<div id="root">
    <!-- This element\'s contents will be replaced with your component. -->
</div>

  js

function tick() {
  const element = (
    <div>
      <h1>Hello, world!</h1>
      <h2>现在是{new Date().toLocaleTimeString()}.</h2>
    </div>
  );
  ReactDOM.render(
    element,
    document.getElementById(\'root\')
  );
}

setInterval(tick, 1000);

  这种方法是最好的。因为react的虚拟dom的特点,每次只会修改被修改的dom部分。

 

 

 

 世之奇伟、瑰怪、非常之观,常在于险远,而人之所罕至焉,故非有志者不能至也。

以上是关于如何用jquery实现时钟效果的主要内容,如果未能解决你的问题,请参考以下文章

如何用jQuery和CSS3制作数字时钟

如何用jquery实现点击展开收缩效果

如何用jquery实现图片翻转效果

如何用jQuery或js实现3D曲线墙

如何用jquery实现实时监控浏览器宽度

如何用jquery实现页面滚动到指定位置后触发事件的效果