Полноэкранное слайдшоу со звуком

Слайдшоу из изображений во весь экран с элементами HTML5 аудио, чтобы придать динамичности и вдохнуть жизнь в фотографии, в данном случае в галерею Нью-Йорка. Для создания слайдшоу и полноэкранного режима используется плагин jquery.vegas.js, аудио будет управлять buzz.js, миниаютюры будут прокручиваться благодаря jquery.jscrollpane.js и плюс несколько эффектов от jquery.easing.js.

 

В шапке подключаем все необходимые файлы:

<link rel="stylesheet" type="text/css" href="http://fonts.googleapis.com/css?family=Ultra">
<link rel="stylesheet" type="text/css" href="js/vegas/jquery.vegas.css">
<link rel="stylesheet" type="text/css" href="js/jscrollpane/jquery.jscrollpane.css">
<link rel="stylesheet" type="text/css" href="css/styles.css">
<script src="http://code.jquery.com/jquery-1.6.2.min.js"></script>
<script src="js/jquery.easing.js"></script>
<script src="js/vegas/jquery.vegas.js"></script>
<script src="js/jscrollpane/jquery.jscrollpane.min.js"></script>
<script src="js/buzz/buzz.js"></script>
<script src="js/gallery.js"></script>

Разметка HTML

Сначала создадим контейнер содержащий заголовок галереи:

<div id="title">
    <h1>New York Gallery</h1>
</div>

Далее миниатюры помещаются в неупорядоченный список. Каждая миниатюра имеет ссылку на оригинальное изображение и имеет title (название) картинки. Обратите внимание, что к некоторым ссылкам мы добавляем атрибут data для вертикального выравнивания.
Два пустых DIV-а необходимы для указателя и эффекта вспышки при изменении слайдов.

<div id="flash"></div>
<div id="thumbnails">
  <ul>
    <li>
      <a href="01.jpg">
        <img src="01b.jpg" title="New York moving" data-valign="top">
      </a>
    </li>
    <li>
      <a href="02.jpg">
        <img src="02b.jpg" title="New York traffic" data-valign="bottom">
      </a>
    </li>
    <li>
      <a href="03.jpg">
        <img src="03b.jpg" title="Street dancers">
      </a>
    </li>
    ...
    </ul>
    <div id="pointer"></div>
</div>

И размещаем ссылки на Паузу и управление Звуком:

<div id="pause"><a href="#">Paused</a></div>
<div id="volume"><a href="#">Sounds</a></div>

CSS

Указываем стиль заголовка, который находится в нижней части экрана с черным фоном. Используем RGBA, который позволяет установить прозрачность цвета, но также и добавляем значение #000 для старых браузеров.
А шрифт будем использовать Ultra из коллекции Google font

#title {
    background: #000;
    background: rgba(0, 0, 0, 0.8);
    bottom: 0px;
    font: 11px Arial, Helvetica, sans-serif;
    padding: 10px 20px;
    position: fixed;
    right: 0px;
    text-align: right;
    width: 100%;
}
    #title h1 {
        font: 30px 'Ultra', Arial, serif;
        margin: 0;
        padding: 0;
    }

Оформим миниатюры. Элементы списка будут обтекать друг друга слева, чтобы изображения показывались в горизонтальном положении.

    #thumbnails {
        background: #000;
        background: rgba(0, 0, 0, 0.8);
        height: 90px;
        left: 0;
        overflow: hidden;
        position: fixed;
        top: 0;
        width: 100%;
    }
    #thumbnails ul {
        margin: 0;
        padding: 0;
    }
    #thumbnails li {
        float: left;
        list-style: none;
        margin: 5px;
        padding: 0;
    }
    #thumbnails a {
        outline: none;
    }
    #thumbnails img {
        width: 112px;
    }

Указатель находится вне страницы.

#pointer {
    border: 2px solid #F30;
    cursor: pointer;
    height: 75px;
    left: -100px;
    margin: 3px;
    position: absolute;
    width: 112px;
}

Эффект вспышки реализован белым дивом во весь экран. По умолчанию он скрыт. Показывается и исчезать будет динамически.

#flash {
    background: #FFF;
    display: none;
    height: 100%;
    position: fixed;
    width: 100%;
}

Стили для текста Паузы, по умолчанию скрыт.

    #pause {
        display: none;
        font: 100px 'Ultra', arial, serif;
        height: 100%;
        opacity: 0.4;
        position: absolute;
        text-align: center;
        text-shadow: 0 0 5px #000;
        width: 100%;
    }
    #pause a {
        color: #FFF;
        height: 100px;
        left: 50%;
        margin: -50px 0 0 -250px;
        position: absolute;
        text-transform: uppercase;
        top: 50%;
        width: 500px;
    }

Для ссылок Звука будем использовать иконки. Кнопка регулировки звука имеет три состояния, которые определяются тремя классами, показывающих различные иконки. В данном случаем мы используем CSS спрайты.
    #volume {
        left: 10px;
        opacity: 0.8;
        position: absolute;
        top: 100px;
    }
    #volume a {
        background: transparent url(../img/icons.png) no-repeat;
        display: block;
        height: 30px;
        text-indent: -9999px;
        width: 30px;
    }
    #volume.all a {
        background-position: 0 0;
    }
    #volume.some a {
        background-position: -30px 0;
    }
    #volume.none a {
        background-position: -60px 0;
    }

В заключении настроим стили для плагина Vegas:

.vegas-loading {
    top: auto;
    bottom: 40px;
    left: 40px;
}
.vegas-overlay {
    background-image: url(../js/vegas/overlays/02.png);
}

и для плагина jScrollPane, чтобы получить более симпатичную прокрутку:

.jspHorizontalBar {
    height: 5px;
}
    .jspHorizontalBar .jspTrack {
         background: #333;
    }
    .jspHorizontalBar .jspDrag {
         background: #666;
         cursor: ew-resize;
    }
#thumbnails:hover .jspHorizontalBar .jspDrag {
    background: #F30;
}

javascript

Начнем с кеширования некоторых элементов. Массив картинок будет содержать все слайды и их названия и вертикальное выравнивание.

var pictures = [],
    $pointer = $( '#pointer' ),
    $thumbnails = $( '#thumbnails' ),
    $title = $( '#title' ),
    $pause = $( '#pause' ),
    $flash = $( '#flash' ),
    $volume = $( '#volume' );

Теперь добавим звуки в нашу галерею с помощью Buzz. HTML5 аудио сейчас поддерживается всеми современными браузерами, без необходимости использования flash. К сожалению, нет ни одного аудио формата, который бы поддерживался всеми браузерами. MP3 бы подошел, да firefox с ним не дружит. Мы должны конвертировать наши звуки в несколько форматов. Лучшая комбинация OGG и MP3. Для конвертации мы использовали бесплатный онлайн ковертер - Online Convert. Buzz позволяет группировать звуки по порядку для лучшего управления ими. Его будем использовать со всеми звуками "камеры". Звук трафика воспроизводится при загрузке странице и проигрывается по кругу.

buzz.defaults.formats = [ 'ogg', 'mp3' ];

var trafficSound = new buzz.sound( 'sounds/traffic' ),
    clickSound = new buzz.sound( 'sounds/click' ),
    focusSound = new buzz.sound( 'sounds/focus' ),
    rewindSound = new buzz.sound( 'sounds/rewind' ),
    cameraSounds = new buzz.group( clickSound, focusSound, rewindSound );

if ( !buzz.isSupported() ) {
    $volume.hide();
}

Теперь поработаем с миниатюрами. Настроим общую ширину верхнего контейнера содержащего их. Без этого шага, наши миниатюры будут занимать не одну строку, а несколько:

$thumbnails.find( 'ul' ).width( function() {
    var totalWidth = 0;
    $( this ).find( 'li' ).each( function() {
        totalWidth += $( this ).outerWidth( true );
    });
    return totalWidth;
});

Применим теперь jScrollPane для контейнера миниатюр:

$thumbnails.jScrollPane();

var jScrollPaneApi = $thumbnails.data( 'jsp' );

$( window ).bind( 'resize', function() {
    jScrollPaneApi.reinitialise();
});

Теперь плагин Vegas. Будем  заполнять массив картинок, захватывая некоторую информацию из списка миниатюр и передавать её в Vegas, для запуска слайдшоу. Задержка между слайдами составляет 4 секунды:

$thumbnails.find( 'a' ).each( function() {
    pictures.push({
        src: $( this ).attr( 'href' ),
        title: $( this ).find( 'img' ).attr( 'title' ),
        valign: $( this ).find( 'img' ).data( 'valign' )
    });
})

$.vegas( 'slideshow', {
    backgrounds: pictures,
    delay: 4000
 })( 'overlay' );

События в Vegas. Вызываем событие, когда слайд загружается и показывается. Благодаря атрибуту SRC получим номер активной миниатюры. Также будет проигрываться и звук.

$( 'body' ).bind( 'vegasload', function( e, img ) {
    var src = $( img ).attr( 'src' ),
        idx = $( 'a[href="' + src + '"]' ).parent( 'li' ).index();
            focusSound.play();

    // ...
});

К Заголовку картинки подключается эффект fadeOut/fadeIn:

$title.fadeOut( function() {
    $( this ).find( 'h1' ).text( pictures[ idx ].title );
    $( this ).fadeIn();
});

Для вспышки такой эффект:

$flash.show().fadeOut( 1000 );

Указатель должен двигаться над текущей миниатюрой. API jScrollPane используется для автопрокрутки.
var pointerPosition = $thumbnails.find( 'li' ).eq( idx ).position().left;

$pointer.animate({
    left: pointerPosition
}, 500, 'easeInOutBack' );

if ( ( pointerPosition > $thumbnails.width()
    || pointerPosition < jScrollPaneApi.getContentPositionX() )
    && !$thumbnails.is( ':hover' ) ) {
        jScrollPaneApi.scrollToX( pointerPosition, true );
}

$pointer.click( function() {
    $thumbnails.find( 'a' ).eq( idx ).click()
});

Давайте тперь посмотрим, что мы должны сделать с клавишей регулировки звука. Идея заключается в отключении или включении каких-то звуков, когда надата кнопка. Мы изменяем класс кнопки и устанавливаем выключение или воспроизведение звуков соответственно.

$volume.click( function() {
    if ( $( this ).hasClass( 'all' ) ) {
        cameraSounds.unmute();
        trafficSound.mute();

        $( this ).removeClass( 'all' ).addClass( 'some' );
    } else if ( $( this ).hasClass( 'some' ) ) {
        cameraSounds.mute();
        trafficSound.mute();

        $( this ).removeClass( 'some' ).addClass( 'none' );
    } else {
        cameraSounds.unmute();
        trafficSound.unmute();

        $( this ).removeClass( 'none' ).addClass( 'all' );
    }
    return false;
});

Галерея почти настроена. Теперь нам нужно сделать так, чтобы при нажатии на миниатюру отображался новый слайд и включалась пауза.

$thumbnails.find( 'a' ).click( function() {
    $pause.show();
    $pointer.hide();

    $volume.animate( { top: '20px' });
    $thumbnails.animate( { top: '-90px' });
    $title.animate( { bottom: '-90px' });   

    var idx = $( this ).parent( 'li' ).index();
    $.vegas( 'slideshow', { step: idx } )( 'pause' );

    rewindSound.play();

    return false;
});

Нажатие на слово "Пауза" перезапустит слайдшоу и миниатюры с заголовками и начнет показ снова.

$pause.click( function() {
    $pause.hide();
    $pointer.show();

    $volume.animate( { top:'100px' });
    $title.animate( { bottom:'0px' });
    $thumbnails.animate( { top:'0px' });

    $.vegas( 'slideshow' );

    clickSound.play();

    return false;
});

СКАЧАТЬСкачек: 902
2,37 Mb
Кто скачал?

ДЕМОПосмотреть
пример