Как сделать цифровые часы с помощью CSS3 и jQuery?
Все началось с того, что как-то раз я увидел вот такой скриншот. И тут же я почувствовал, что просто обязан превратить его в реально работающие часы и поделиться ими со всеми желающими.
Если вы хотите узнать, как сделать такие часики, читайте дальше!
Разметка
Много HTML для этих часов не нужно, и связано это с тем, что большая их часть, включая названия дней недели и код для цифр, генерируются динамически.
Итак, вот разметка, которая понадобится для вставки часов на страницу.
index.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>
Главный элемент, блок с id = 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, - по одному контейнеру для каждой из цифр, представляющих текущее время.
Как вы можете видеть по фрагменту выше, эти контейнеры получают имена от zero до nine (т.е. от нуля до девяти) и содержат семь элементов span с уникальными классами. Эти элементы представляют собой сегменты цифр, как в обычный цифровых часах:
Они полностью стилизуются с помощью CSS, а их прозрачность по умолчанию установлена в значение opacity:0. Класс, назначенный их родительскому контейнеру - вот, что делает их видимыми. Вот стили для нуля.
assets/css/styles.css
#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;
}
Все сегменты видимые, за исключением горизонтального в центре (иначе получилась бы восьмерка вместо нуля). Также я добавил свойство transition, с помощью которого происходит анимация степени прозрачности в момент переключения между цифрами.
— Регулярная проверка качества ссылок по более чем 100 показателям и ежедневный пересчет показателей качества проекта.
— Все известные форматы ссылок: арендные ссылки, вечные ссылки, публикации (упоминания, мнения, отзывы, статьи, пресс-релизы).
— SeoHammer покажет, где рост или падение, а также запросы, на которые нужно обратить внимание.
SeoHammer еще предоставляет технологию Буст, она ускоряет продвижение в десятки раз, а первые результаты появляются уже в течение первых 7 дней. Зарегистрироваться и Начать продвижение
Конечно, в стилях еще много кода, но здесь я его приводить не буду. Я убежден, что лучший способ понять, как работает CSS - это изучить код работающего примера с помощью Firebug или встроенного в Chrome инструмента для исследования кода.
jQuery
Чтобы заставить наши часы работать, нам придется использовать jQuery для генерации разметки цифр и для установки таймера, по которому время будет обновляться каждую секунду.
Чтобы упростить себе жизнь, мы будем использовать библиотеку moment.js, компенсируя недостатки "родной" функции работы с датой и временем в JavaScript.
assets/js/script.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 class="dots">');
}
else{
var pos = $('<div>');
for(var i=1; i<8; i++){
pos.append('<span class="d' + i + '">');
}
// Устанавливаем цифры как пары "ключ:значение" в объекте digits
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]]);
// Библиотека возвращает Sunday как первый день недели.
// Да, бред, поэтому сделаем "понижение",
// чтобы Sunday стал последним днем недели
var dow = now[6];
dow--;
// Воскресенье!
if(dow < 0){
// Make it last
dow = 6;
}
// Выделяем текущий день недели
weekdays.removeClass('active').eq(dow).addClass('active');
// Устанавливаем am/pm текст:
ampm.text(now[7]+now[8]);
// Устанавливаем запуск функции раз в секунду
setTimeout(update_time, 1000);
})();
// Переключить тему
$('a.button').click(function(){
clock.toggleClass('light dark');
});
});
Самый важный кусок кода здесь - это функция update_time. Внутри нее мы получаем текущее время как строку и используем ее как для определения элементов часов, так и для уставновки нужных названий классов для цифр.
Наши часы готовы!
По материалам tutorialzine.com
Перевод: Дмитрий
P.S. Понравилось? Присмотритесь к премиум-урокам по различным аспектам сайтостроения, включая JavaScript, jQuery и Ajax, а также к бесплатному курсу по созданию своей CMS-системы на PHP с нуля. Все это поможет вам быстрее и проще освоить практические навыки веб-программирования и самому делать похожие штуки:
Понравился материал и хотите отблагодарить?
Просто поделитесь с друзьями и коллегами!
Смотрите также:



















