Цифровые часы с помощью jQuery и CSS3

13-07-06 Css, JavaScript CSS3, jQuery 0

Сегодня мы сделаем красивые цифровые часы с помощью 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’ы — части цифр:

Цифровые часы с помощью jQuery и CSS3
Цифровые часы с помощью jQuery и CSS3

Они полностью оформлены на 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');
    });

});

Часы готовы!

Хочешь получать статьи на почту?

Подпишись на обновления!
* Ваш email не будет разглашен/продан. Вы сможете отписаться в любое время.

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *