时钟实例:

wKiom1YfCVfiwk2BAABzd7LnDe0853.jpg

实例代码:

----------------------------------------------------------

<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <meta name="Generator" content="">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
  <title>时钟</title>
  <style>
*{padding:0;margin:0}
ul,li{list-style:none;}
body{background:#FFFFCC;font-family:"微软雅黑"}
.box{width:200px;height:200px;border-radius:50%;margin:100px auto;position:relative;}
/*刻度*/
#kedu li{position:absolute;width:2px;height:6px;background:#111;left:99px;top:0px;transform-origin:center 100px}
#kedu li:nth-child(5n+1){height:15px;}
/*
#kedu li:nth-child(1){transform:rotate(0deg)}
#kedu li:nth-child(2){transform:rotate(6deg)}
#kedu li:nth-child(3){transform:rotate(12deg)}*/
/*时分秒针*/
#hour{width:8px;height:45px;background:#000;position:absolute;top:55px;left:96px;transform-origin:bottom}
#min{width:4px;height:55px;background:green;position:absolute;top:45px;left:98px;transform-origin:bottom}
#sec{width:2px;height:65px;background:red;position:absolute;top:35px;left:99px;transform-origin:bottom}
/*圆心*/
.box .radius{width:16px;height:16px;background:#111;position:absolute;top:92px;left:92px;border-radius:50%}
.cradius{width:100px;height:100px;background:#11f;border-radius:50%;
color:#fff;text-align:center;line-height:100px;margin-left:200px;
transform-origin:top;cursor: pointer;}
.cradius:hover{transform:rotate(360deg);transition:all 3s ease;}
  </style>
 </head>
 <body>
<div class="box">
<!--刻度-->
<ul id="kedu"></ul>
<!--时分秒针-->
<div id="hour"></div>
<div id="min"></div>
<div id="sec"></div>
<!--圆心-->
<div class="radius"></div>
</div>
<div id="timer"></div>
<div id="timer2"></div>
<div id="timer3"></div>
<div id="timer4"></div>
<div class="cradius">旋转</div>
<script type="text/javascript">
/*
@descrition 时钟和时区
@date:2015-08-01 23:66
@author:keke
知识点:
a:javascript 闭包 
b:css3圆心和旋转
c:border-radius
d:定位position
辅助知识点:Date类
实现步骤:
1:如果画圆
2:如果产生时分秒针
4:如果产生刻度
5:如何让时分秒针进行旋转
6:时区时间的计算
7:如何封装
新的知识点:一个表盘360度,分了60个格子,每个格子就是6度
每个五个格子就是一个小时:30度=1小时
*/
/**
 * 对Date的扩展,将 Date 转化为指定格式的String 月(M)、日(d)、12小时(h)、24小时(H)、分(m)、秒(s)、周(E)、季度(q)
 * 可以用 1-2 个占位符 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字) eg: (new
 * Date()).format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423 (new
 * Date()).format("yyyy-MM-dd E HH:mm:ss") ==> 2009-03-10 二 20:09:04 (new
 * Date()).format("yyyy-MM-dd EE hh:mm:ss") ==> 2009-03-10 周二 08:09:04 (new
 * Date()).format("yyyy-MM-dd EEE hh:mm:ss") ==> 2009-03-10 星期二 08:09:04 (new
 * Date()).format("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18
 */
Date.prototype.format = function(fmt) {
var o = {
"Y+" : this.getFullYear(),
"M+" : this.getMonth() + 1,
// 月份
"d+" : this.getDate(),
// 日
"h+" : this.getHours() % 12 == 0 ? 12 : this.getHours() % 12,
// 小时
"H+" : this.getHours(),
// 小时
"m+" : this.getMinutes(),
// 分
"s+" : this.getSeconds(),
// 秒
"q+" : Math.floor((this.getMonth() + 3) / 3),
// 季度
"S" : this.getMilliseconds()
// 毫秒
};
var week = {
"0" : "/u65e5",
"1" : "/u4e00",
"2" : "/u4e8c",
"3" : "/u4e09",
"4" : "/u56db",
"5" : "/u4e94",
"6" : "/u516d"
};
if (/(y+)/.test(fmt)) {
fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "")
.substr(4 - RegExp.$1.length));
}
if (/(E+)/.test(fmt)) {
fmt = fmt
.replace(
RegExp.$1,
((RegExp.$1.length > 1) ? (RegExp.$1.length > 2 ? "/u661f/u671f"
: "/u5468")
: "")
+ week[this.getDay() + ""]);
}
for ( var k in o) {
if (new RegExp("(" + k + ")").test(fmt)) {
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k])
: (("00" + o[k]).substr(("" + o[k]).length)));
}
}
return fmt;
};
//时区的换算 offset时区位置
function calcTime(offset) { 
// 创建一个本地日期
var d = new Date(); 
//通过Data()对象的getTimezoneOffset()方法来找出当地时间偏移值。在缺省情况下,此方法以分钟显示时区偏移值结果,因此在早先的计算中要将此值转换成毫秒。 
var utc = d.getTime() + (d.getTimezoneOffset() * 60000); 
//将本地时间与本地时区偏移值相加得到当前国际标准时间(UTC)。 
var nd = new Date(utc + (3600000*offset)); 
return nd;
};
(function(){
//刻度对象
var keduDom = document.getElementById("kedu");
//产生刻度值
var html = "";
for(var i=0;i<60;i++){
html += "<li style='transform:rotate("+(i * 6)+"deg)'></li>";
};
keduDom.innerHTML = html;
//时分秒针
var secDom = $("sec");//1-60
var minDom = $("min");//1-60
var hourDom = $("hour");//1-12 每个五个格子就是一个小时:30度=1小时
var timerDom = $("timer");//北京时间
var timer2Dom = $("timer2");//
var timer3Dom = $("timer3");
function drawDate(){
var date = new Date();
//秒
var sec = date.getSeconds();
//分
var min = date.getMinutes()+sec/60;
//时
var hour = date.getHours() + min/60;
secDom.style.transform = "rotate("+(sec * 6)+"deg)";
minDom.style.transform = "rotate("+(min * 6)+"deg)";
hourDom.style.transform = "rotate("+(hour * 30)+"deg)";
//时间的设定
timerDom.innerText = "北京时间:"+date.format("HH:mm:ss");
timer2Dom.innerText = "夏威夷时间:"+calcTime("-10").format("yyyy-MM-dd HH:mm:ss");
timer3Dom.innerText = "莫斯科时间:"+calcTime("+5.5").format("yyyy-MM-dd HH:mm:ss");
};
//初始化当前时间的位置
drawDate();
//定时任务执行时钟
setInterval(drawDate,1000);
function $(id){
return document.getElementById(id);
}
})();
</script>
 </body>
</html>

-------------------

所需time.js

-------------------------------

// JavaScript Document
function Dtime(){
ctx.clearRect(0,0,500,500);
var now=new Date();
var h=now.getHours();
var m=now.getMinutes();
var s=now.getSeconds();
//自定义颜色
//创建线性渐变
var gradient=ctx.createLinearGradient(0,0,500,500);
gradient.addColorStop("0","#FFF");
gradient.addColorStop("0.5","#CCC");
gradient.addColorStop("1.0","#FFF");
//笔触面积
ctx.lineWidth=50;
//把自定义颜色赋给笔迹
ctx.strokeStyle=gradient;
//绘制表盘
ctx.beginPath();//开始下笔
//圆形
ctx.arc(250,250,210,0,360*Math.PI/180);
ctx.stroke();
ctx.closePath();//结束下笔
//绘制表盘 end
//时刻度
//换笔
ctx.lineWidth=7;
ctx.strokeStyle="#000";
for(var i=0;i<12;i++){
ctx.save();
//把坐标点(250.250)置为原点
ctx.translate(250,250);
ctx.beginPath();
//旋转角度
ctx.rotate(i*30*Math.PI/180);
//花直线
ctx.moveTo(0,-160);
ctx.lineTo(0,-185);
ctx.stroke();
ctx.closePath();
ctx.restore();
}//时刻度 end
//分刻度
ctx.lineWidth=3;
for(var i=0;i<60;i++){
ctx.save();
ctx.translate(250,250);
ctx.beginPath();
ctx.rotate(i*6*Math.PI/180);
ctx.moveTo(0,-170);
ctx.lineTo(0,-185);
ctx.stroke();
ctx.closePath();
ctx.restore();
}
//时针
ctx.save();
ctx.lineWidth=7;
ctx.translate(250,250);
ctx.rotate(h*30*Math.PI/180);
ctx.beginPath();
ctx.moveTo(0,-140);
ctx.lineTo(0,10);
ctx.stroke();
ctx.closePath();
ctx.restore();
//分针
ctx.save();
ctx.lineWidth=5;
ctx.translate(250,250);
ctx.rotate(m*6*Math.PI/180);
ctx.beginPath();
ctx.moveTo(0,-150);
ctx.lineTo(0,15);
ctx.stroke();
ctx.closePath();
ctx.restore();
//秒针
ctx.save();
ctx.lineWidth=3;
ctx.strokeStyle="red";
ctx.translate(250,250);
ctx.rotate(s*6*Math.PI/180);
ctx.beginPath();
ctx.moveTo(0,-150);
ctx.lineTo(0,15);
ctx.stroke();
ctx.closePath();
ctx.restore();
}
setInterval(Dtime,1000);