这是一款jQuery和CSS3精美翻页式电子时钟特效。该电子时钟使用CSS3渐变和transform来制作翻页电子时钟的外观,然后通过jquery代码来驱动电子时钟的翻页显示时间效果。
使用方法
在页面中引入jquery和style.css文件。
<script src="path/to/jquery.min.js"></script>
<link rel="stylesheet" href="css/style.css">
HTML结构
该翻页式电子时钟的HTML结构如下。
<main>
<div style="display:none">
<div id="top-test-anim" class="num-anim top-anim" style="display:none;">
<div class="top-half-num">2</div>
</div>
<div id="bottom-test-anim" class="num-anim bottom-anim" style="display:none;">
<div class="bottom-half-num">
<div class="dropper">3</div></div>
</div>
</div>
<canvas id="my-canvas"></canvas>
<div id="clock">
<div class="time-container hours">
<div class="digit">
<div class="fade"> </div>
<span class="num top" id="hour-tens-top">1</span>
<span class="num bottom" id="hour-tens-bottom">
<div class="bottom-container">1</div></span>
<div class="swapper">
<div id="top-hour-tens-anim" class="num-anim top-anim" style="display:none;">
<div class="top-half-num">8</div>
</div>
<div id="bottom-hour-tens-anim" class="num-anim bottom-anim" style="display:none;">
<div class="bottom-half-num">
<div class="dropper">9</div></div>
</div>
</div>
<div class="ring ring-left"></div>
<div class="ring ring-right"></div>
</div>
<div class="digit">
<div class="fade"> </div>
<span class="num top" id="hour-ones-top">3</span>
<span class="num bottom" id="hour-ones-bottom">
<div class="bottom-container">3</div></span>
<div class="swapper">
<div id="top-hour-ones-anim" class="num-anim top-anim" style="display:none;">
<div class="top-half-num">8</div>
</div>
<div id="bottom-hour-ones-anim" class="num-anim bottom-anim" style="display:none;">
<div class="bottom-half-num">
<div class="dropper">9</div></div>
</div>
</div>
<div class="ring ring-left"></div>
<div class="ring ring-right"></div>
</div>
</div>
<div class="time-container minutes">
<div class="digit">
<div class="fade"> </div>
<span class="num top" id="minute-tens-top">4</span>
<span class="num bottom" id="minute-tens-bottom">
<div class="bottom-container">4</div></span>
<div class="swapper">
<div id="top-minute-tens-anim" class="num-anim top-anim" style="display:none;">
<div class="top-half-num">8</div>
</div>
<div id="bottom-minute-tens-anim" class="num-anim bottom-anim" style="display:none;">
<div class="bottom-half-num">
<div class="dropper">9</div></div>
</div>
</div>
<div class="ring ring-left"></div>
<div class="ring ring-right"></div>
</div>
<div class="digit">
<div class="fade"> </div>
<span class="num top" id="minute-ones-top">3</span>
<span class="num bottom" id="minute-ones-bottom">
<div class="bottom-container">3</div></span>
<div class="swapper">
<div id="top-minute-ones-anim" class="num-anim top-anim" style="display:none;">
<div class="top-half-num">8</div>
</div>
<div id="bottom-minute-ones-anim" class="num-anim bottom-anim" style="display:none;">
<div class="bottom-half-num">
<div class="dropper">9</div></div>
</div>
</div>
<div class="ring ring-left"></div>
<div class="ring ring-right"></div>
</div>
</div>
<div class="time-container seconds">
<div class="digit">
<div class="fade"> </div>
<span class="num top" id="second-tens-top">5</span>
<span class="num bottom" id="second-tens-bottom">
<div class="bottom-container">5</div></span>
<div class="swapper">
<div id="top-second-tens-anim" class="num-anim top-anim" style="display:none;">
<div class="top-half-num">8</div>
</div>
<div id="bottom-second-tens-anim" class="num-anim bottom-anim" style="display:none;">
<div class="bottom-half-num">
<div class="dropper">9</div></div>
</div>
</div>
<div class="ring ring-left"></div>
<div class="ring ring-right"></div>
</div>
<div class="digit">
<div class="fade"> </div>
<span class="num top" id="second-ones-top">3</span>
<span class="num bottom" id="second-ones-bottom">
<div class="bottom-container">2</div></span>
<div class="swapper">
<div id="top-second-ones-anim" class="num-anim top-anim" style="display:none;">
<div class="top-half-num">2</div>
</div>
<div id="bottom-second-ones-anim" class="num-anim bottom-anim" style="display:none;">
<div class="bottom-half-num">
<div class="dropper">3</div></div>
</div>
</div>
<div class="ring ring-left"></div>
<div class="ring ring-right"></div>
</div>
</div>
</div>
</main>
初始化插件
在页面DOM元素加载完毕,通过下面的方法来驱动电子时钟的翻页显示时间效果。
var CHANCE_SPEC, x, y;
CHANCE_SPEC = 60;
x = 0;
y = 0;
function rand(min, max) {
return Math.floor(Math.random() * (max - min + 1) - min);
}
function drawSpec(data, x, y, w) {
var index;
index = (x + y * w) * 4;
data.data[index + 0] = 0;
data.data[index + 1] = 0;
data.data[index + 2] = 0;
data.data[index + 3] = 30;
}
function drawPattern(canvas, ctx, data) {
var w, h;
w = canvas.width;
h = canvas.height;
while (x < w) {
if (rand(1, 100) < CHANCE_SPEC) {
drawSpec(data, x, y, w);
}
x++;
}
if (x === w) {
x = 0;
y++;
}
if (y === h) {
ctx.putImageData(data, 0, 0);
return;
}
drawPattern(canvas, ctx, data);
}
function main() {
var canvas, ctx, data;
console.log('starting1');
canvas = document.getElementById('my-canvas');
ctx = canvas.getContext('2d');
data = ctx.getImageData(0, 0, canvas.width, canvas.height);
drawPattern(canvas, ctx, data);
updateTime();
}
function updateTime() {
var currentTime, seconds, minutes, hours, times, i;
currentTime = new Date();
times = {
'second': currentTime.getSeconds(),
'minute': currentTime.getMinutes(),
'hour': currentTime.getHours()
};
for (type in times) {
if (times.hasOwnProperty(type)) {
setTimes(type, timeToString(times[type]));
}
}
setTimeout(updateTime, 1000);
}
function timeToString(currentTime) {
var t;
t = currentTime.toString();
if (t.length === 1) {
return '0' + t;
}
return t;
}
function getPreviousTime(type) {
return $('#' + type + '-top').text();
}
function setTimes(type, timeStr) {
setTime(getPreviousTime(type + '-tens'),
timeStr[0], type + '-tens');
setTime(getPreviousTime(type + '-ones'),
timeStr[1], type + '-ones');
}
function setTime(previousTime, newTime, type) {
if (previousTime === newTime) {
return;
}
setTimeout(function() {
$('#' + type + '-top').text(newTime);
}, 150);
setTimeout(function() {
$('.bottom-container',
$('#' + type + '-bottom')).text(newTime);
}, 365);
animateTime(previousTime, newTime, type);
}
function animateTime(previousTime, newTime, type) {
var top, bottom;
top = $('#top-' + type + '-anim');
bottom = $('#bottom-' + type + '-anim');
$('.top-half-num', top).text(previousTime);
$('.dropper', bottom).text(newTime);
top.show();
bottom.show();
$('#top-' + type + '-anim').css('visibility', 'visible');
$('#bottom-' + type + '-anim').css('visibility', 'visible');
animateNumSwap(type);
setTimeout(function() {
hideNumSwap(type);
}, 365);
}
function animateNumSwap(type) {
$('#top-' + type + '-anim').toggleClass('up');
$('#bottom-' + type + '-anim').toggleClass('down');
}
function hideNumSwap(type) {
$('#top-' + type + '-anim').toggleClass('up');
$('#bottom-' + type + '-anim').toggleClass('down');
$('#top-' + type + '-anim').css('visibility', 'hidden');
$('#bottom-' + type + '-anim').css('visibility', 'hidden');
}
$(document).ready(main);
window.requestAnimFrame = (function(callback){
return window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function(callback){
window.setTimeout(callback, 1000 / 60); }
})();