<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Clock</title> </head> <body style="background:#333; padding:0; margin:0; "> </body> </html> <style> .clock { overflow: hidden; float: left; -webkit-perspective: 1000px; -moz-perspective: 1000px; -ms-perspective: 1000px; -o-perspective: 1000px; perspective: 1000px; -webkit-transform-style: preserve-3d; -moz-transform-style: preserve-3d; -ms-transform-style: preserve-3d; -o-transform-style: preserve-3d; transform-style: preserve-3d; } .unit { float: left; margin: 16px; position: relative; height: 129px; width: 128px; overflow: visible; } .top, .btm { height: 64px; width: 128px; overflow: hidden; position: absolute; } .unit span { font: 96px/128px Tahoma, Geneva, sans-serif; width: 128px; text-align: center; position: absolute; } .btm span { top: -64px; } .top { background: #ddd; border-bottom: 1px solid #999; border-radius: 10px 10px 0 0; top: 0; -webkit-transform-origin: bottom; -ms-transform-origin: bottom; -moz-transform-origin: bottom; -o-transform-origin: bottom; transform-origin: bottom; } .btm { background: #eee; border-radius: 0 0 10px 10px; top: 65px; -webkit-transform-origin: top; -ms-transform-origin: top; -moz-transform-origin: top; -o-transform-origin: top; transform-origin: top; } </style> <script> var clkCls = "clock"; var clkUnitCls = "unit"; var clkTopCls = "top"; var clkBtmCls = "btm"; function transform(obj, tran) { try { obj.style.WebkitTransform = tran; obj.style.MozTransform = tran; obj.style.msTransform = tran; obj.style.OTransform = tran; obj.style.transform = tran; } catch (e) { } } var ClkUnit = function (val, minVal, maxVal) { console.log(this); this.update = function () { this.updateTxt(); if (this.val > this.maxVal) { this.setVal(this.minVal); this.period(); } if (this.val < this.minVal) { this.setVal(this.maxVal); this.period(); } } this.incVal = function () { this.val++; this.update(); } this.decVal = function () { this.val--; this.update(); } this.updateTxt = function () { if (this.val > 9) this.text = this.val; else this.text = "0" + this.val; } this.setVal = function (v) { this.val = v; this.updateTxt(); } this.pane = document.createElement("div"); this.pane.className = clkUnitCls; this.setVal(val); this.minVal = minVal; this.maxVal = maxVal; this.topbak = document.createElement("div"); this.topbak.txt = document.createElement("span"); this.topbak.className = clkTopCls; this.topfnt = document.createElement("div"); this.topfnt.txt = document.createElement("span"); this.topfnt.className = clkTopCls; this.btmbak = document.createElement("div"); this.btmbak.txt = document.createElement("span"); this.btmbak.className = clkBtmCls; this.btmfnt = document.createElement("div"); this.btmfnt.txt = document.createElement("span"); this.btmfnt.className = clkBtmCls; this.pane.appendChild(this.topbak); this.topbak.appendChild(this.topbak.txt); this.pane.appendChild(this.topfnt); this.topfnt.appendChild(this.topfnt.txt); this.pane.appendChild(this.btmbak); this.btmbak.appendChild(this.btmbak.txt); this.pane.appendChild(this.btmfnt); this.btmfnt.appendChild(this.btmfnt.txt); this.mtx = false; this.animateReset = function () { transform(this.btmfnt, ""); transform(this.btmbak, ""); this.btmfnt.txt.innerHTML = this.text; this.topbak.txt.innerHTML = this.text; this.topfnt.txt.innerHTML = this.text; this.btmbak.txt.innerHTML = this.text; transform(this.topfnt, ""); transform(this.topbak, ""); } this.period = null; this.turnDown = function () { var u = this; if (this.mtx) return; //this.mtx = true; this.incVal(); var topDeg = 0; var btmDeg = 90; this.topbak.txt.innerHTML = this.text; transform(u.topfnt, "rotateX(0deg)"); var timer1 = setInterval(function () { transform(u.topfnt, "rotateX(" + topDeg + "deg)"); topDeg -= 10; if (topDeg <= -90) { transform(u.topfnt, "rotateX(0deg)"); u.topfnt.txt.innerHTML = u.text; transform(u.btmfnt, "rotateX(90deg)"); u.btmfnt.txt.innerHTML = u.text; var timer2 = setInterval(function () { if (btmDeg <= 0) { clearInterval(timer2); u.animateReset(); u.mtx = false; } transform(u.btmfnt, "rotateX(" + btmDeg + "deg)"); btmDeg -= 10; }, 30); clearInterval(timer1); } }, 30); } this.animateReset(); } var Clock = function (prt) { this.pane = document.createElement("div"); this.pane.className = clkCls; var d = new Date(); this.hour = new ClkUnit(d.getHours(), 0, 23); this.munite = new ClkUnit(d.getMinutes(), 0, 59); this.second = new ClkUnit(d.getSeconds(), 0, 59); this.pane.appendChild(this.hour.pane); this.pane.appendChild(this.munite.pane); this.pane.appendChild(this.second.pane); prt.appendChild(this.pane); var clock = this; this.second.period = function () { clock.munite.turnDown(); } this.munite.period = function () { clock.hour.turnDown(); } this.timer = null; this.start = function () { this.timer = setInterval(function () { clock.second.turnDown(); }, 1000); } this.pause = function () { clearInterval(this.timer); } this.start(); } var c = new Clock(document.body);</script> <!-- Generated by RunJS (Tue Dec 30 09:49:07 CST 2014) 1ms -->