В прошлой статье мы мы реализовали автоматическую прокрутку слайдов влево. Для того, что бы у нас заработала кнопка next, достаточно отследить клик по кнопке и активировать функцию chengeLeft.
$('.next').click(chengeLeft);
А вот для кнопки prev понадобится написать функцию, которая будет прокручивать галерею в другую сторону. Назовем ее chengeRigth. Логика у этой функции будет немного отличаться от chengeLeft.
function chengeRigth () { var item = $(carousel).children().eq(-1); item.clone().prependTo(carousel); carousel.css({"left": -itemWidth}); carousel.animate({left: 0}, 500); item.remove(); }
Здесь мы так же создаем переменную item, но хранить она будет не первый, а последний слайдер. Далее мы клонируем последний элемент и переносим клон в начало карусели, после чего позиционируем элемент UL влево, относительно левой границы блока visual_block на ширину, равную значению переменной itemWidth (ширина одного слайда). Следующим шагом с помощью метода animate смещаем элемент UL обратно (в первоначальное положение - у нас становится видимым перемещенный элемент карусели). И, наконец, удаляем последний элемент. Таким образом визуально создается эффект сдвига карусели вправо. Теперь осталось только активировать функцию при клике на кнопке prev и задача выполнена.
$('.prev').click(chengeRigth);
По сути, нам остается только написать код, который будет останавливать прокрутку, если курсор мыши будет находиться в области слайдера и возобновлять анимацию, когда пользователь уводит курсор за пределы карусели. С этой задачей мы уже сталкивались, когда писали код для слайдера с эффектом затухания. Прибегнем к этому способу и сейчас. Сохраним активацию функции setInterval в переменную interval. Теперь, когда нам понадобится прервать анимацию (курсор мыши находится в пределах блока carousel_wrap), мы останавливаем работу setInterval. Как только курсор мыши оказался вне блока carousel_wrap, снова запускаем анимацию.
var interval = setInterval(chengeLeft, autoChange); ... elWrap.mouseover(function() { clearInterval(interval); }); elWrap.mouseout(function() { interval = setInterval(chengeLeft, autoChange); });
Вот, собственно и все - карусель функционирует как и задумывалось. Для более удобной настройки скрипта создадим еще три переменные - две для кнопок, одну для временного интервала, через который запускается анимация и работу над слайдером можно было бы считать законченной, но ложка дегтя все равно найдется.
В боаузерах Chrome и Safari наш замечательный слайдер виден не будет. Вся проблема заключается в том, что в момент загрузки страницы скрипт подгружается раньше, чем картинки. Соответственно, методы outerWidth и outerHeight передадут в переменные значения, равные нулю. Один из вариантов лечения данной проблемы - указать размеры для блоков carousel_wrap, visual_block, .visual_block ul и .visual_block li в css.
.carousel_wrap { margin: 50px auto; width:700px; height:400px; position:relative; } .visual_block { margin: 0 auto; height:100%; position: relative; overflow: hidden; } .visual_block ul { position: relative; } .visual_block ul, .visual_block li { height:100%; float: left; position: relative; } .visual_block li { width:640px; }
Естественно, в этом случае переменная itemHeight и расчет высоты блока visual_block в скрипте не понадобятся. Весь js у нас теперь приобрел следующий вид.
$(document).ready(function(){ var elWrap = $('.carousel_wrap'), visual = $('.visual_block'), carousel = visual.children('ul'), visible = 1, itemWidth = carousel.children().outerWidth(), itemsTotal = carousel.children().length, autoChange = 5000, btnNext = $('.next'), btnPrev = $('.prev'); visual.css({'width': visible * itemWidth + 'px'}); carousel.css({'width': itemsTotal * itemWidth, 'left': 0}); function chengeLeft () { var item = carousel.children().eq(0); carousel.animate({left: -itemWidth}, 500, function() { item.clone().appendTo(carousel); item.remove(); carousel.css({"left": 0 }); }); } function chengeRigth () { var item = $(carousel).children().eq(-1); item.clone().prependTo(carousel); carousel.css({"left": -itemWidth}); carousel.animate({left: 0}, 500); item.remove(); } var interval = setInterval(chengeLeft, autoChange); btnNext.click(chengeLeft); btnPrev.click(chengeRigth); elWrap.mouseover(function() { clearInterval(interval); }); elWrap.mouseout(function() { interval = setInterval(chengeLeft, autoChange); }); });
Вот теперь мы действительно справились с задачей. О том, как стилизовать подписи к фото, рассказывать не стану - это относится скорее к css, нежели к данной теме, но в примере для скачивания будет представлен вариант, где подписи будут расположены поверх фото.
Скачать готовый код примера со стилизованными подписями к фото можно по ссылке ниже:
В следующей статье исправим некоторые недочеты и ошибки связанные с работой слайдера.
Карусель проверена и отлчно работает в ИЕ 7-8-9, FireFox, Chrome, Safari.