Как сделать цифровые часы с помощью 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 с нуля. Все это поможет вам быстрее и проще освоить практические навыки веб-программирования и самому делать похожие штуки:
Понравился материал и хотите отблагодарить?
Просто поделитесь с друзьями и коллегами!
Смотрите также: