Сегодня расскажу о еще одной великолепной галерее – jQuery FancyBox. Тем более, что в последней версии фотогалереи LightBox разработчики вырезали поддержку IE6 (с чем я в общем полностью согласен – надо жалеть разработчиков и обновлять программное обеспечение). Но поскольку не всем это понравится, я обещал подробно рассказать о какой-нибудь другой фотогалерее для jQuery, что с удовольствием и делаю.
Как всегда, сначала пример работы, который на этот раз придется продемонстрировать в новом окне. Надеюсь, что многие оценят возможность отображать не только картинки, но и какой-либо контент, находящийся на странице – например видеоролики с YouTube. А как Вам возможность выводить вообще любой контент в iframe? Или спрятать за одной миниатюрой целую галерею фотографий? Смотрите, испытывайте, а потом будем разбираться как заставить все это работать на своем сайте.
Нужные файлы (включая демонстрационные фото), Вы сможете найти в этом архиве. Сам плагин jquery.fancybox.js, дополнительные js-файлы и библиотеку jQuery можно найти в разделе Download.
Итак приступим: для начала нам потребуется подключить к нашей HTML-странице как минимум два js-файла: jquery-1.2.6.js (библиотека jQuery) и jquery.fancybox.js (плагин FancyBox). Или четыре – jquery.pngFix.js позволит устранить проблему использования png-файлов в IE, а jquery.metadata.js позволит Вам использовать атрибуты class для передачи параметров плагину (впрочем можно обойтись и без этого файла). Сделаем это в разделе HEAD. Не забудем и про файл стилевого оформления, как и про то, что пути у Вас могут отличаться от приведенных в примере…
<script type="text/javascript" src="js/jquery-1.2.6.js"></script> <script type="text/javascript" src="js/jquery.fancybox.js"></script> <script type="text/javascript" src="js/jquery.pngFix.js"></script> <script type="text/javascript" src="js/jquery.metadata.js"></script> <link rel="stylesheet" type="text/css" href="fancybox.css" />
Теперь о HTML-разметке. Начнем с традиционного варианта использования фотогалереи – отобразим все миниатюры, при клике на которых будет открываться полноразмерное изображение и к нему добавятся элементы управления для перемещения назад и вперед. Я приведу пример, но Вы можете использовать такую разметку, которая нравится Вам.
<ul id="gallery"> <li> <a href="/example_jquery/fancybox_img/01.jpg" rel="fancy-tour" title="Россия - Греция 1 : 0"> <img src="/example_jquery/fancybox_img/01m.jpg" /> </a> </li> <li> <a href="/example_jquery/fancybox_img/02.jpg" rel="fancy-tour" title="Великий Гус..."> <img src="/example_jquery/fancybox_img/02m.jpg" /> </a> </li> <li> <a href="/example_jquery/fancybox_img/03.jpg" rel="fancy-tour" title="Это был наш день..."> <img src="/example_jquery/fancybox_img/03m.jpg" /> </a> </li> <li> <a href="/example_jquery/fancybox_img/04.jpg" rel="fancy-tour" title="Россия - Голландия 3 : 1"> <img src="/example_jquery/fancybox_img/04m.jpg" /> </a> </li> </ul>
Картинка-миниатюра заключена в тэг А, который ссылается на полноразмерное изображение. Обратите внимание на атрибут relтэга А – одинаковые значения означают принадлежность в одной группе изображений, ведь на одной странице Вы можете расположить их и не одну… А значение тэга title используется для вывода комментария к картинке.
В своем примере я использую несколько CSS-правил, чтобы вытянуть список по горизонтали и убрать рамки картинок.
ul { list-style:none; } ul li { display:inline; } a img { border:none; }
Теперь о js-коде. Если использовать все значения по умолчанию, то проще не бывает:
$(document).ready(function(){ $("#gallery a").fancybox(); });
Т.е. мы просто отбираем все нужные нам элементы А и передаем этот набор плагину jQuery FancyBox, который проделывает всю остальную работу. Но можно использовать и дополнительные опции, например вот так:
$(document).ready(function(){ $("#gallery a").fancybox({ overlayShow: true, overlayOpacity: 0.5, zoomSpeedIn: 1500, zoomSpeedOut:600 }); });
Ниже я привожу весь список доступных опций.
hideOnContentClick – скрывать контент по клику на полноразмерном изображении. Может принимать значения true или false. По умолчанию false.
zoomSpeedIn – указывается скорость эффекта (в миллисекундах) при открытии полноразмерного изображения. По умолчанию – 0, т.е. без эффекта.
zoomSpeedOut – указывается скорость эффекта (в миллисекундах) при закрытии полноразмерного изображения. По умолчанию – 0, т.е. без эффекта.
overlayShow – показывать или нет дополнительный слой, который «затемняет» основное содержимое страницы. Может принимать значения true или false. По умолчанию false.
overlayOpacity – прозрачность для overlayShow, если конечно он true. Изменяется от 0 до 1.
frameWidth – определяет ширину контейнера, если выводится iframe и inline содержимое (см. примеры).
frameHeight – определяет высоту контейнера, если выводится iframe и inline содержимое (см. примеры).
itemLoadCallback – определяет пользовательскую функцию, которая выбирает группу фотографий для отображения (см. пример).
А теперь попробуем «спрятать» за одной миниатюрой целый набор полноразмерных изображений. Вот HTML-разметка для одной миниатюры.
<a id="custom" href="javascript:;><img src="/example_jquery/fancybox_img/05m.jpg" alt="" /></a>
Ничего необычного тут нет – даже и пояснять нечего… Самое главное тут в js-коде, который мы и разберем подробнее.
var imageList = [ { url: "/example_jquery/fancybox_img/05.jpg", title: "Первая картинка" }, { url: "/example_jquery/fancybox_img/05-1.jpg", title: "Вторая картинка" }, { url: "/example_jquery/fancybox_img/05-2.jpg", title: "Третья картинка" }, { url: "/example_jquery/fancybox_img/05-3.jpg", title: "Четвертая картинка" } ];
Мы создаем массив imageList, каждым элементом которого является объект, состоящий из пар ключ/значение. Конечно все уже поняли, что url указывает на размещение полноразмерного изображения, а title – конечно же содержит комментарий к нему. В этом массиве и «прячутся» все большие фотографии.
Теперь определим функцию, которая будет получать эту группу фотографий:
function getGroupItems(opts) { jQuery.each(imageList, function(i, val) { opts.itemArray.push(val); }); }
Нам осталось только передать плагину fancybox необходимый параметр:
$("#custom").fancybox({ itemLoadCallback: getGroupItems });
Разберем как вывести в галерею некий контент, находящийся на странице и до поры скрытый, а в качестве примера используем видеоролики с YouTube.
<div style="display:none" id="tesvideo"> <object width="425" height="344"> <param name="movie" value="http://www.youtube.com/v/...&hl=en&fs=1"></param> <param name="allowFullScreen" value="true"></param> <param name="wmode" value="transparent"></param> <embed src="http://www.youtube.com/v/...&hl=en&fs=1" type="application/x-shockwave-flash" allowfullscreen="true" wmode="transparent" width="425" height="344"></embed> </object> </div>
Обратите внимание, чтобы картинка-крестик, по щелчку на котором закрывается галерея, была «выше» собственно содержимого, в код надо внести небольшие изменения добавив параметр wmode со значением transparent.
Осталось показать только js-код:
$("#video").fancybox({ zoomSpeedIn: 0, zoomSpeedOut:0, frameWidth: 425, frameHeight: 344 });
Ну, и напоследок – вывод в галерею вообще любого содержимого через iframe. Вот простенький HTML:
<a id="frame" href="http://www.google.ru/"><img src="/example_jquery/fancybox_img/08m.jpg" alt="" /></a>
и javascript-код:
$("#frame").fancybox({ zoomSpeedIn: 0, zoomSpeedOut:0, frameWidth: 800, frameHeight: 600 });
Согласитесь, действительно хорошая галерея, правда?