本教程将教使用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代表数字的一条边,如下图所示:
数字时钟的样式通过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代码
为了是数字时钟可以正常工作,我们需要使用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。