因为博客首页有个 Flash 的时钟,对于大多数浏览器 Flash 是没有问题的,而 Firefox 等就稍微有些麻烦了,而且 IOS 系统是 Flash 的死对头。很早之前就想着上个 HTML5 的时钟来替代这个 Flash,今天从一个网站弄了点源码,修改了下,总算完工了。
PS:185 行的 urlSize 为显示的宽度,高度自动适应。
<html>
<head></head><body>
<script language="JavaScript" type="text/javascript">
/*****************************************
*
* [No need to change] Cross browser requestAnimationFrame
* To know more detail, go to the following link
* http://paulirish.com/2011/requestanimationframe-for-smart-animating/
*
*****************************************/
window.requestAnimFrame = (function(callback) {
var agent = navigator.userAgent
if(agent.search(/iPhone/) != -1 || agent.search(/iPod/) != -1 || agent.search(/iPad/) != -1){
return function(callback) {
window.setTimeout(callback, 1000 / 60);
};
}
return window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function(callback) {
window.setTimeout(callback, 1000 / 60);
};
})();
/*****************************************
*
* [No need to change] AnimFrame Constructor
* For manageing the plural animation canvases.
* Usage:
* 1. Instantiate this Constructor: var animeFrame = new AnimFrame();
* 2. Set animation objects extended from AnimCanvas Constructor: animeFrame.push(anim01); animeFrame.push(anim02); ...
* 3. Call the start method: animeFrame.start();
* 4. Be able to stop animations by calling the stop method (no used in Clocklinks): animeFrame.stop();
*
*****************************************/
var AnimFrame = (function(){
function F(){}
var stack = [];
var isAnimating;
F.prototype.push = function(instance){
stack.push(instance);
};
F.prototype.stop = function(){
isAnimating = false;
};
F.prototype.start = function(){
isAnimating = true;
init();
animate();
};
function init(){
for(var i=0, l=stack.length; i<l; i++) {
stack[i].init();
}
}
function animate(){
if(isAnimating) {
requestAnimFrame(function() {
animate();
});
}
for(var i=0, l=stack.length; i<l; i++) {
stack[i].render();
}
};
return F;
})();
/*****************************************
*
* [No need to change] AnimCanvas Constructor
* This is used as a base of animation canvas.
*
*****************************************/
var AnimCanvas = (function(){
/* Constructor */
function F(){
this.id;
this.canvas;
this.context;
this.time;
this.startTime;
this.fps;
this.fpsStep;
this.fpsTime;
}
/* Public Methods */
// setCanvas() is required to call for identifying the canvas to use
F.prototype.setCanvas = function(canvasId){
this.id = canvasId;
this.canvas = document.getElementById(this.id);
this.context = this.canvas.getContext("2d");
};
// createCanvas() is required to call for
F.prototype.createCanvas = function(width, height){
this.canvas = document.createElement("canvas");
this.context = this.canvas.getContext("2d");
this.canvas.width = width;
this.canvas.height = height;
};
// setFps() is arbitrary to change the fps
// if not called, the canvas is rendered right when animation gets ready
F.prototype.setFps = function(fps){
this.fps = fps;
this.fpsStep = 1000 / fps;
this.fpsFrame;
};
// init() is called by the AnimFrame constructor when starting Animation
F.prototype.init = function(){
this.startTime = (new Date()).getTime();
};
// render() is called by the AnimFrame constructor each time to render
F.prototype.render = function(){
this.time = (new Date()).getTime() - this.startTime;
if(this.fps){
var millisecond = this.time % 1000;
var currentFpsFrame = Math.floor(millisecond / this.fpsStep);
if(this.fpsFrame != currentFpsFrame){
this.fpsFrame = currentFpsFrame;
this.draw();
}
} else {
this.draw();
}
};
return F;
})();
/*****************************************
*
* SimpleCanvas Constructor
*
*****************************************/
var SimpleCanvas = (function(){
/* Constructor */
function F(){
this.id;
this.canvas;
this.context;
}
/* Public Methods */
// setCanvas() is required to call for identifying the canvas to use
F.prototype.setCanvas = function(canvasId){
this.id = canvasId;
this.canvas = document.getElementById(this.id);
this.context = this.canvas.getContext("2d");
};
// createCanvas() is required to call for gerating a new canvas object
F.prototype.createCanvas = function(width, height){
this.canvas = document.createElement("canvas");
this.context = this.canvas.getContext("2d");
this.canvas.width = width;
this.canvas.height = height;
};
// render() is called by the AnimFrame constructor each time to render
F.prototype.render = function(){
this.draw();
};
return F;
})();
// Now is Html5 Clock begin, above all is render frame.
function isCanvasSupported(){
var elem = document.createElement("canvas");
return !!(elem.getContext && elem.getContext("2d"));
}
var urlClock = 'Clock-Html5';
var urlTimezone = 'CCT';
var urlSize = '271';
var urlTitle = '';
var urlMessage = '';
var urlTarget = '';
var urlFrom = '2014,1,1,0,0,0';
var urlColor = 'gray';
//var adImageUrl = "";
//var redirectUrl = "";
var serverYear = new Date().getFullYear();
var serverMonth = new Date().getMonth();
var serverDay = new Date().getDay();
var serverHour = new Date().getHours();
var serverMinute = new Date().getMinutes();
var serverSecond = new Date().getSeconds();
var serverMillisecond = new Date().getMilliseconds();
var rootPath = "/";
//var adId = "Clock-Html5-AD";
/*
Global valuables
- urlClock
- urlTimezone
- urlColor
- urlSize
- serverYear
- serverMonth
- serverDay
- serverHour
- serverMinute
- serverSecond
- serverMillisecond
*/
var baseSize = 227;
var srcPath = rootPath + "html5-008/";
document.write('<canvas id="' + urlClock + '" width="' + urlSize + 'px" height="' + urlSize/2.91 + 'px"></canvas>');
/*****************************************
*
* Clock Constructor extended by AnimCanvas
*
*****************************************/
var Clock = (function(){
/* Constructor */
function F(){}
/* Inheritance */
F.prototype = new AnimCanvas();
F.prototype.__super__ = AnimCanvas.prototype;
F.prototype.init = function(){
this.__super__.init.apply(this, arguments);
var servertime = new Date();
servertime.setYear(serverYear);
servertime.setMonth(serverMonth - 1);
servertime.setDate(serverDay);
servertime.setHours(serverHour);
servertime.setMinutes(serverMinute);
servertime.setSeconds(serverSecond);
unixservertime = servertime.getTime();
};
/* Private Valuables (don't change the values) */
var canvas, context, time;
var unixservertime,
currenttime;
var hour,
minute,
second,
millisecond;
var previousHour,
previousMinute,
previousSecond;
var scaleValue = 1;
/* Private Functions */
function countTime(){
currenttime = new Date();
currenttime.setTime(unixservertime + time);
hour = currenttime.getHours();
minute = currenttime.getMinutes();
second = currenttime.getSeconds();
millisecond = currenttime.getMilliseconds()
}
/* Public Methods */
F.prototype.setScale = function(val){
scaleValue = val;
};
F.prototype.draw = function(){
canvas = this.canvas;
context = this.context;
time = this.time;
/* Clear and save initial setting */
context.clearRect(0, 0, canvas.width, canvas.height);
context.save();
/********* Draw from here *********/
countTime();
context.translate(0, canvas.height/2);
context.scale(scaleValue, scaleValue);
// hour panel
hourPanel.setNumber(hour);
context.drawImage(hourPanel.canvas, 0, -hourPanel.canvas.height/2);
// minute panel
minutePanel.setNumber(minute);
context.drawImage(minutePanel.canvas, 77, -minutePanel.canvas.height/2);
// second panel
secondPanel.setNumber(second);
context.drawImage(secondPanel.canvas, 154, -secondPanel.canvas.height/2);
/********* Revert to initial setting *********/
context.restore();
}
return F;
})();
/*****************************************
*
* ClockPanel Constructor extended by AnimCanvas
*
*****************************************/
var ClockPanel = (function(){
/* Constructor */
function F(){}
/* Inheritance */
F.prototype = new AnimCanvas();
F.prototype.__super__ = AnimCanvas.prototype;
F.prototype.init = function(){
this.__super__.init.apply(this, arguments);
this.currentNum = 0;
this.previousNum = 0;
this.count = 0;
};
/* Private Valuables (don't change the values) */
var canvas, context, time;
var flipFrame = 10;
/* Public Methods */
F.prototype.draw = function(){
canvas = this.canvas;
context = this.context;
time = this.time;
/* Clear and save initial setting */
context.clearRect(0, 0, canvas.width, canvas.height);
context.save();
/********* Draw from here *********/
if(this.currentNum == this.previousNum){
context.drawImage(this.panelList[this.currentNum].canvas, 0, 0);
} else {
this.count++;
var progress = Math.cos(Math.PI * this.count / flipFrame);
var currentPanel = this.panelList[this.currentNum].canvas;
var previousPanel = this.panelList[this.previousNum].canvas;
context.save();
context.translate(0, currentPanel.height/2);
// Upper Current Panel
context.drawImage(currentPanel, 0, 0, currentPanel.width, currentPanel.height/2, 0, -currentPanel.height/2, currentPanel.width, currentPanel.height/2);
// Lower Previous Panel
context.drawImage(previousPanel, 0, previousPanel.height/2, previousPanel.width, previousPanel.height/2, 0, 0, previousPanel.width, previousPanel.height/2);
if(progress>0){
// Upper Previous Panel
context.drawImage(previousPanel, 0, 0, previousPanel.width, previousPanel.height/2, 0, -previousPanel.height/2*progress, previousPanel.width, previousPanel.height/2*progress);
} else {
progress = progress* -1;
// Lower Current Panel
context.drawImage(currentPanel, 0, currentPanel.height/2, currentPanel.width, currentPanel.height/2, 0, 0, currentPanel.width, currentPanel.height/2*progress);
}
context.restore();
if(this.count==flipFrame){
this.count=0;
this.previousNum = this.currentNum;
}
}
/********* Revert to initial setting *********/
context.restore();
}
F.prototype.setPanelList = function(array){
this.panelList = array;
}
F.prototype.setNumber = function(num){
this.currentNum = num;
}
return F;
})();
/*****************************************
*
* General60 Constructor extended by AnimCanvas
*
*****************************************/
var General60 = (function(){
/* Constructor */
function F(){}
/* Inheritance */
F.prototype = new SimpleCanvas();
/* Private Valuables */
var canvas, context, time;
var corderRound = { x : 10, y : 8 }
/* Public Methods */
F.prototype.draw = function(){
canvas = this.canvas;
context = this.context;
time = this.time;
/* Clear and save initial setting */
context.clearRect(0, 0, canvas.width, canvas.height);
context.save();
/********* Draw from here *********/
// Create Clip Path
context.beginPath();
context.moveTo(0, corderRound.y);
context.quadraticCurveTo(0, 0, corderRound.x, 0);
context.lineTo(canvas.width-corderRound.x, 0);
context.quadraticCurveTo(canvas.width, 0, canvas.width, corderRound.y);
context.lineTo(canvas.width, canvas.height-corderRound.y);
context.quadraticCurveTo(canvas.width, canvas.height, canvas.width-corderRound.x, canvas.height);
context.lineTo(corderRound.x, canvas.height);
context.quadraticCurveTo(0, canvas.height, 0, canvas.height-corderRound.y);
context.closePath();
// context.clip();
// Fill Background Color
context.fillStyle = this.color;
context.fill();
// context.fillRect(0, 0, canvas.width, canvas.height);
// Draw the Number
context.font = "62px Arial"
context.textAlign = "center";
context.textBaseline = "Alphabetic";
context.fillStyle = "#ffffff";
if(this.color.toLowerCase() == "white" || this.color.toLowerCase() == "#ffffff"){
context.fillStyle = "#000000";
}
context.fillText(this.number, canvas.width/2, canvas.height-8.5);
// Draw Center Line
context.strokeStyle = this.color;
context.lineWidth = 1;
context.beginPath();
context.moveTo(0, canvas.height/2);
context.lineTo(canvas.width, canvas.height/2);
context.stroke();
/********* Revert to initial setting *********/
context.restore();
}
F.prototype.setColor = function(color){
this.color = color.toString();
}
F.prototype.setNumber = function(number){
this.number = number.toString();
if(this.number.length == 1){
this.number = "0" + this.number;
}
}
return F;
})();
/*****************************************
*
* Hour24 Constructor extended by AnimCanvas
*
*****************************************/
var Hour24 = (function(){
/* Constructor */
function F(){
this.pm = false;
}
/* Inheritance */
F.prototype = new SimpleCanvas();
/* Private Valuables */
var canvas, context, time;
var corderRound = { x : 10, y : 8 }
/* Public Methods */
F.prototype.draw = function(){
canvas = this.canvas;
context = this.context;
time = this.time;
/* Clear and save initial setting */
context.clearRect(0, 0, canvas.width, canvas.height);
context.save();
/********* Draw from here *********/
// Create Clip Path
context.beginPath();
context.moveTo(0, corderRound.y);
context.quadraticCurveTo(0, 0, corderRound.x, 0);
context.lineTo(canvas.width-corderRound.x, 0);
context.quadraticCurveTo(canvas.width, 0, canvas.width, corderRound.y);
context.lineTo(canvas.width, canvas.height-corderRound.y);
context.quadraticCurveTo(canvas.width, canvas.height, canvas.width-corderRound.x, canvas.height);
context.lineTo(corderRound.x, canvas.height);
context.quadraticCurveTo(0, canvas.height, 0, canvas.height-corderRound.y);
context.closePath();
// context.clip();
// Fill Background Color
context.fillStyle = this.color;
context.fill();
// context.fillRect(0, 0, canvas.width, canvas.height);
// Draw the Number
context.font = "62px Arial"
context.textAlign = "center";
context.textBaseline = "Alphabetic";
context.fillStyle = "#ffffff";
if(this.color.toLowerCase() == "white" || this.color.toLowerCase() == "#ffffff"){
context.fillStyle = "#000000";
}
context.fillText(this.number, canvas.width/2, canvas.height-8.5);
// Draw the Number
context.font = "8px Arial"
context.textAlign = "left";
if(this.pm){
context.fillText("PM", 4, canvas.height-8.5);
} else {
context.fillText("AM", 4, canvas.height-8.5);
}
// Draw Center Line
context.strokeStyle = this.color;
context.lineWidth = 1;
context.beginPath();
context.moveTo(0, canvas.height/2);
context.lineTo(canvas.width, canvas.height/2);
context.stroke();
/********* Revert to initial setting *********/
context.restore();
}
F.prototype.setColor = function(color){
this.color = color.toString();
}
F.prototype.setNumber = function(number){
this.number = number;
if(this.number >= 12){
this.pm = true;
this.number = this.number - 12
}
this.number = this.number != 0 ? this.number : 12;
this.number = this.number.toString();
}
return F;
})();
/* Create Instance */
var color = urlColor;
switch(urlColor){
case "black":
color = "#000000";
break;
case "blue":
color = "#0000ff";
break;
case "gray":
color = "#808080";
break;
case "green":
color = "#008000";
break;
case "orange":
color = "#ffa500";
break;
case "pink":
color = "#ffc0cb";
break;
case "red":
color = "#ff0000";
break;
case "white":
color = "#ffffff";
break;
}
var generalNum = [];
var hourNum = [];
for(var i=0; i<60; i++){
var num = new General60();
num.createCanvas(73, 61);
num.setColor(color);
num.setNumber(i);
num.render();
generalNum.push(num);
}
for(var i=0; i<24; i++){
var num = new Hour24();
num.createCanvas(73, 61);
num.setColor(color);
num.setNumber(i);
num.render();
hourNum.push(num);
}
var hourPanel = new ClockPanel();
hourPanel.createCanvas(73, 61);
hourPanel.setFps(30);
hourPanel.setPanelList(hourNum);
var minutePanel = new ClockPanel();
minutePanel.createCanvas(73, 61);
minutePanel.setFps(30);
minutePanel.setPanelList(generalNum);
var secondPanel = new ClockPanel();
secondPanel.createCanvas(73, 61);
secondPanel.setFps(30);
secondPanel.setPanelList(generalNum);
var clock = new Clock();
clock.setCanvas(urlClock);
clock.setScale(urlSize/baseSize);
/* Start Animation */
var animFrame = new AnimFrame();
animFrame.push(clock);
animFrame.push(hourPanel);
animFrame.push(minutePanel);
animFrame.push(secondPanel);
animFrame.start();
</script>
</body>
</html>
专业提供WordPress主题安装、深度汉化、加速优化等各类网站建设服务,详询在线客服!