Цифровые часы с помощью jQuery и CSS3
Сегодня мы сделаем красивые цифровые часы с помощью jQuery и CSS3.
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>
Основной элемент #clock, содержит .display, в котором будут находиться список дней недели, метка AM/PM, иконка будильника и цифры.
<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 div’ов со span’ами внутри, по одному на каждую цифру. Как будет видно далее, эти div’ы будут принимать классы от zero до nine, внутри будет по 7 span’ов с уникальными классами. Эти span’ы — части цифр:

Они полностью оформлены на CSS и по-умолчанию прозрачные (opacity:0). Класс, назначенный содержащему их элементу будет делать их видимыми. CSS для нуля:
/* 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;
}
Все сегменты видны, кроме среднего (иначе это будет восьмерка). Так же ко всем span’ам применен CSS3 эффект transition для анимации перехода от одной цифры к другой.
jQuery
Для того чтобы наши часы работали необходимо использовать немного jQuery, который будет генерировать разметку для каждой цифры и обновлять классы каждую секунду. Для облегчения задачи будем использовать библиотеку moment.js, которая содержит функции для обработки времени.
$(function(){
var clock = $('#clock'),
alarm = clock.find('.alarm'),
ampm = clock.find('.ampm');
// Массив с именами классов
var digit_to_name = 'zero one two three four five six seven eight nine'.split(' ');
// В этом объекте будут содержаться элементы разметки цифр
var digits = {};
// ЧЧ:ММ:СС
var positions = [
'h1', 'h2', ':', 'm1', 'm2', ':', 's1', 's2'
];
// Генерация разметки
var digit_holder = clock.find('.digits');
$.each(positions, function(){
if(this == ':'){
digit_holder.append('<div>');
}
else{
var pos = $('<div>');
for(var i=1; i<8; i++){
pos.append('<span class="d' + i + '">');
}
digits[this] = pos;
// Добавляем цифру на страницу
digit_holder.append(pos);
}
});
// Дни недели
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');
// Обновляем часы каждую секунду
(function update_time(){
// Используем moment.js для вывода текущего времени
// hh - часы в 12 часовом формате,
// mm - минуты, ss-секунды,
// d - день недели и A - 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]]);
// Библиотека думает что воскресение - первый день недели.
// Поправим это сдвигом дней недели на одну позицию вниз
var dow = now[6];
dow--;
// Sunday!
if(dow < 0){
// делаем воскресение последним
dow = 6;
}
// Выделяем текущий день
weekdays.removeClass('active').eq(dow).addClass('active');
ampm.text(now[7]+now[8]);
// Вызываем каждую секунду
setTimeout(update_time, 1000);
})();
// смена темы
$('a.button').click(function(){
clock.toggleClass('light dark');
});
});
Часы готовы!







Нет комментариев