忧郁之子
使用jQuery和css3制作逼真的数字时钟效果
本教程将教使用jQuery和css3制作逼真的数字时钟效果。这个插件的灵感来自于 pretty dribbble shot-Timer。
HTML结构:
数字时钟的html结构非常简单,因为大部分代码都是动态生成的,你只需要在html上写入以下代码:
<div id="clock" class="light">
<div class="display">
<div class="weekdays"></div>
<div class="ampm"></div>
<div class="alarm"></div>
<div class="digits"></div>
</div>
</div>
div#clock包裹住div.display,在div.display中放置的是weekdays、AM/PM标签、一些图标和时间。下面是其中的一个数字的html代码:
<div class="zero">
<span class="d1"></span>
<span class="d2"></span>
<span class="d3"></span>
<span class="d4"></span>
<span class="d5"></span>
<span class="d6"></span>
<span class="d7"></span>
</div>
.digits元素包含6个带有多个span的div。每个div代表一个数字,如上所示,上边代表的是0,0用class zero表示,9则用class nine表示。在div中的每个span代表数字的一条边,如下图所示:
jQuery和css3数字时钟-1
数字时钟的样式通过CSS来渲染,默认设置器透明度opacity:0,然后通过设置其父元素的可见性来使它们可见。
/* 0 */
#clock .digits div.zero .d1,
#clock .digits div.zero .d3,
#clock .digits div.zero .d4,
#clock .digits div.zero .d5,
#clock .digits div.zero .d6,
#clock .digits div.zero .d7{
opacity:1;
}
在上面的数字0中,除了中间的边外,所有的边都可见(中间的边也可见就是数字8了)。在完成的CSS文件中,我们添加了CSS3 transition属性,使数字时钟在动画时,透明度有一些过度效果。
jQuery和css3数字时钟-1
jQuery代码
为了是数字时钟可以正常工作,我们需要使用jQuery来为每一个数字生成html代码。并设置定时器用来每秒钟更新一次class。我们将使用 moment.js 来弥补原生javascript日期时间函数的不足。(点击这里查看moment.js快速参考。)
$(function(){
// Cache some selectors
var clock = $('#clock'),
alarm = clock.find('.alarm'),
ampm = clock.find('.ampm');
// Map digits to their names (this will be an array)
var digit_to_name = 'zero one two three four five six seven eight nine'.split(' ');
// This object will hold the digit elements
var digits = {};
// Positions for the hours, minutes, and seconds
var positions = [
'h1', 'h2', ':', 'm1', 'm2', ':', 's1', 's2'
];
// Generate the digits with the needed markup,
// and add them to the clock
var digit_holder = clock.find('.digits');
$.each(positions, function(){
if(this == ':'){
digit_holder.append('<div class="dots">');
}
else{
var pos = $('<div>');
for(var i=1; i<8; i++){
pos.append('<span class="d' + i + '">');
}
// Set the digits as key:value pairs in the digits object
digits[this] = pos;
// Add the digit elements to the page
digit_holder.append(pos);
}
});
// Add the weekday names
var weekday_names = 'MON TUE WED THU FRI SAT SUN'.split(' '),
weekday_holder = clock.find('.weekdays');
$.each(weekday_names, function(){
weekday_holder.append('<span>' + this + '</span>');
});
var weekdays = clock.find('.weekdays span');
// Run a timer every second and update the clock
(function update_time(){
// Use moment.js to output the current time as a string
// hh is for the hours in 12-hour format,
// mm - minutes, ss-seconds (all with leading zeroes),
// d is for day of week and A is for AM/PM
var now = moment().format("hhmmssdA");
digits.h1.attr('class', digit_to_name[now[0]]);
digits.h2.attr('class', digit_to_name[now[1]]);
digits.m1.attr('class', digit_to_name[now[2]]);
digits.m2.attr('class', digit_to_name[now[3]]);
digits.s1.attr('class', digit_to_name[now[4]]);
digits.s2.attr('class', digit_to_name[now[5]]);
// The library returns Sunday as the first day of the week.
// Stupid, I know. Lets shift all the days one position down,
// and make Sunday last
var dow = now[6];
dow--;
// Sunday!
if(dow < 0){
// Make it last
dow = 6;
}
// Mark the active day of the week
weekdays.removeClass('active').eq(dow).addClass('active');
// Set the am/pm text:
ampm.text(now[7]+now[8]);
// Schedule this function to be run again in 1 sec
setTimeout(update_time, 1000);
})();
// Switch the theme
$('a.button').click(function(){
clock.toggleClass('light dark');
});
});
上面代码中最重要的部分是update_time函数。在啊这个函数中,我们以字符串的形式获取当前的时间,并用它来数字时钟的元素和为数字设置正确的class。
完整代码下载:下载地址