使用JS使时钟运动

DOM运动,主要操作css3中transform:rotate();

计时器setInterval(),setTimeout(),如何防止时钟偷停;

时钟的时针、分针、秒针的运动的度数之比;

<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="decription" content="css3 transform rotate() 旋转,制造时钟运动效果">
<title>Clock</title>
<style>
#clock
{
width:500px;
height:500px;
border:30px solid black;
border-radius: 50px;
position: relative;
}
#clock div
{
position: absolute;
-webkit-transform-origin: 50% 0;
-moz-transform-origin: 50% 0;
transform-origin: 50% 0;

}
#hour-hand
{
width:8%;
height:24%;
background-color: red;
left:50%;
margin-left: -4%;
top:50%;
margin-top: -5.5%;
box-shadow: 10px 10px #ccc;
}
#minute-hand
{
width:10%;
height:34%;
background-color: green;
left:50%;
margin-left: -5%;
top:50%;
margin-top: -5.5%;
}
#clock #second-hand
{
width:5%;
height:50%;
background-color: blue;
background-size: contain;
left:50%;
margin-left:-2.5%;
top:35%;
box-shadow: 5px 5px #ccc;
-webkit-transform-origin: 50% 45px;
-moz-transform-origin: 50% 45px;
transform-origin: 50% 45px;
}
</style>
<script src="js/jquery-1.10.1.min.js"></script>
<script type="text/javascript">
window.onload = function()
{
var oClock = document.getElementById("clock");
var oHourHand = document.getElementById("hour-hand");
var oMinuteHand =document.getElementById("minute-hand");
var oSecendHand = document.getElementById("second-hand");

var oDate = new Date(); //初始化时钟,获取系统时间,赋值给时、分、秒针
var nowHours = oDate.getHours();
var nowMinutes = oDate.getMinutes();
var nowSecond = oDate.getSeconds();
nowHours %=12;
var hoursDeg = 30*nowHours+nowMinutes/2+nowSecond/120+180;
var minutesDeg = 6*nowMinutes+nowSecond/10+180;
var secondsDeg = 6*nowSecond+180;
oSecendHand.style.webkitTransform="rotate("+secondsDeg+"deg)";
oMinuteHand.style.webkitTransform="rotate("+minutesDeg+"deg)";    //此处用到weikitTransform,请使用webkit内核浏览器进行查看

oHourHand.style.webkitTransform = "rotate("+hoursDeg+"deg)";      //可使用jQuery替代,用法自行查阅。

var startTime = oDate.getTime();
var count=0;
function fixed()         //防止该事件被阻塞,时钟不准
{
count ++;
var offset = new Date().getTime()- (startTime + count*1000); 
var nextTime = 1000 - offset;
if (nextTime<0) {nextTime = 0;};
setTimeout(fixed,nextTime);
secondsDeg +=6;              //每秒时分秒针所走的距离
if (secondsDeg%360==0) {
secondsDeg=0;
};

minutesDeg +=1/10;
if (minutesDeg>=360) {
minutesDeg%=360;
};

hoursDeg +=1/120;
if (hoursDeg>=360) {
hoursDeg%=360;
};

oSecendHand.style.webkitTransform="rotate("+secondsDeg+"deg)";
oMinuteHand.style.webkitTransform="rotate("+minutesDeg+"deg)";
oHourHand.style.webkitTransform = "rotate("+hoursDeg+"deg)";
console.log(new Date().getTime() - (startTime + count * 1000));
}
setTimeout(fixed,1000)

}
</script>
</head>
<body>
<div id="clock">
<div id="hour-hand">

</div>
<div id="minute-hand">

</div>
<div id="second-hand">

</div>
</div>
</body>
</html>

DOM时钟的更多相关文章

  1. dom事件操作例题,电子时钟,验证码,随机事件

    dom事件操作 当事件发生时,可以执行js 例子: 当用户点击时,会改变<h1>的内容: <h1 onClick="this.innerHTML='文本更换'"& ...

  2. jquery图片时钟

    一.生成数字时钟 <script src="http://code.jquery.com/jquery-latest.js"></script> <s ...

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

    如何利用iframe标签以及Javascript制作时钟? 如何制作一个时钟呢?效果如下图所示: 这里的时钟会不停的走,但是下面的页面是不会变得,这样就实现了我们想要的效果了.下面我将分为以下几个方面 ...

  4. HTML5 之Canvas 绘制时钟 Demo

    <!DOCTYPE html> <html> <head> <title>Canvas 之 时钟 Demo</title> <!--简 ...

  5. js 动态时钟

    js 动态时钟 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www ...

  6. angularjs中展示富文本编辑器文本,向DOM中插入元素

    前几天在用textangular富文本编辑器插件时,将存储的文本及格式存储到数据库中,但是从后台接口中再向angular页面插入时却不能执行,即在Angular中操作DOM没有实现,后来查看了一下,操 ...

  7. JS,Jquery,ExtJs不同脚本动态创建DOM对象

    好久不来写东西了,这段时间太慢了,闲了下来看了几篇文章,觉得很好,同时也许咱们大家都能遇到,所以就把它记录下来... 简单使用JavaScript.JQuery.ExtJs进行DOM对象创建的测试,主 ...

  8. JS之DOM编程

    为什么学dom编程? 通过dom编程,我们可以写出各种网页游戏 dom编程也是我们学习ajax技术的基础,所以我们必需掌握好dom编程.  dom编程简介 DOM=Document Object Mo ...

  9. 【转载】Dom篇

    一. 初探Dom     1. Dom介绍 二. Dom基础     1. window顶级对象     2. body.document对象事件     3. 通用的HTML元素的事件     4. ...

随机推荐

  1. hdu-1130(卡特兰数+大数乘法,除法模板)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1130 卡特兰数:https://blog.csdn.net/qq_33266889/article/d ...

  2. Radius 中 与Response Authernticator 与 Message-Authenticator的计算

    /* String RequestStr3 = @"01 00 00 9E EB B2 E8 D9 1E 52 10 03 FB E1 52 39 27 58 93 F0 01 0E 33 ...

  3. MFC框架仿真<二>

  4. Tensorflow从源代码编译2

    https://blog.csdn.net/qq_37674858/article/details/81095101 https://blog.csdn.net/yhily2008/article/d ...

  5. Win & Mac 系统之间U盘传递的U盘文件格式选取问题

    Win & Mac 系统之间U盘传递的U盘文件格式选取问题 1. Win系统与Mac系统之间可以通过 exFat U盘文件系统传递 exFAT(Extended File Allocation ...

  6. paip.双网卡多网卡不能上网的联网配置

    paip.双网卡多网卡不能上网的联网配置 作者Attilax ,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blog.csdn.net/att ...

  7. eclipse/myeclipse介绍

    eclipse更加纯净,比较简洁,需要某些插件的时候,需要自己去配置才可以,而myeclipse自带了很多的插件功能更为强大. 在eclipse于myeclipse创建的项目是有差异的,eclipse ...

  8. SSD测试第一神器——FIO

    原文 地址 http://www.ssdfans.com/ssd%E6%B5%8B%E8%AF%95%E7%AC%AC%E4%B8%80%E7%A5%9E%E5%99%A8-fio-2/ 对于SSD性 ...

  9. linq to sql 查找所有开票金额大于回款金额的项目

    查找所有开票金额大于回款金额的项目 TB_Projects 项目表 TB_Recipts 发票表 TB_Finances 回款表 TB_Projects  一对多 TB_Recipts TB_Proj ...

  10. 网易云社区有奖问答活动第二期——技术领导力、深入分布式、PHP圣经、Linux运维、Unity……三月热点图书等你拿!

    网易云社区第二期有奖问答活动开始了!(第一期活动已结束:人工智能图书大抽奖!) 欢迎积极参与网易云社区,讨论问题,交流心得.我们本期准备了一批技术领域热点图书,送给参与社区的朋友们,将以抽奖的形式送出 ...