css, html, php, javascript, jQuery, ajax … – решения, примеры, рецепты
19 Авг
Сегодня расскажу о еще одной великолепной галерее – 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
});
Согласитесь, действительно хорошая галерея, правда?
Отзывов (150) на «jQuery FancyBox – отличная фотогалерея»
В опере 9.5 очень корявит, фиксить пока не брался
Проверял под Opera 9.24 – никаких проблем. Все как и положено.
неплохо придумано с iframe, а так ничего особенного.
а мне больше ThickBox нравится, правда FancyBox давно «ковырял», может уже стала получше…
модальные окна умеет? есть callback по закрытию окна?
Вы прочитайте просто, в посте же все написано.
Спасибо вам за отличную статью! Ваш сайт у меня в избранном на почетном месте! Захожу чуть ли не каждый день – за доками по jquery
Спасибо большое! Как раз искала подобный фотоальбом. Ваш оказался наиболее привлекательным! Я, вообщем-то еще «чайник», но потихоньку осваиваю премудрости. С небольшими заминками, но все получилось. Единственное, никак не могу понять, почему некоторые фото открываются в меньшем размере.
Вот еще бы мне форму обратной связи соорудить на сайте, чет никак не дается…и я была бы совершенно счастливым человеком.
Вам удачи и ждем продолжения!
Подскажите пожалуйста! Возникла проблема при интеграции фотоальбома в страницу. На странице уже используются слои div и получается, что картинки в фотоальбоме открываются за слоем. Подскажите, где и что прописать, чтобы фотоальбом открывался поверх них?
Буду очень благодарна!
Марина.
Марина, я не телепат… Чтобы говорить предметно нужно хотя бы взглянуть на коды. Скинуть можно на g.samkov на сервере gmail.com
С предыдущим вопросом разобралась. Тока не выдерживается размер картинок в IE, кривые. В firefox все нормально.
Спасибо за ответ, не заметила его, когда писала.
Что еще заметила по фотоальбому, как-то он зависит от наполнения страницы. На пустой, все ОК и в IE и в firefox. Если интегрировать его в уже действующую стр. в IE кривит, растягивает картинку. Моих познаний не хватает понять в чем там каратыч.
Марина, рабочий пример перед Вами. Все ровненько и красивенько. Значит есть еще в Вашем коде какая-то причина… Раз с предыдущим разобрались – значит и тут справитесь!
Можно еще займу минуту вашего времени.
Подскажите пожалуйста, какой параметр (и где искать) отвечает за размер больших изображений. Предполагаю, это авторазмер, по размеру картинки. Но, может быть там что-то можно еще указать, чтобы не растягивало изображения.
Извиняюсь, наверно путанно изъяняюсь, я не специалист, самоучка, сижу допетриваю.
Спасибо.
Размер больших изображений – это действительно реальный размер картинки. Можно попробовать передать в параметрах frameWidth и frameHeight, но даже если сработает, представьте, что Вы увидете на картинке, реальная ширина которой скажем 500px, когда она сожмется до 200px?
Картинки же в наборе могут быть разные, с разным отношением ширины к высоте, а передать в опциях Вы сможете только фиксированные размеры. У Вас получится «комната смеха».
Спасибо Генадий! Да, я знаю о фиксированных frameWidth и frameHeight. Понимаю, что в данном случае, это неприменимо. Собстно, чем еще и привлек данный фотоальбом, что не нужно заморачиваться с подгонкой фоток под один размер.
Я подумала, немного о другом. О том, что возможно есть способ не позволять IE искажать реальные размеры, что он у меня бессовестно делает. Что ему мешает отображать их правильно мне трудно сказать, возможно, что-то в моем коде ему мешает или сам кривой, как многие считают. Я не приверженец firefox, но в данном случае, ровно те же страницы, он отображает без искажений.
Спасибо за ваши ответы.
Удачи вам.
Марина.
Уважаемый Геннадий.
У меня возникла проблема с этой галлереей. Возможно, что она схожа с проблемой Марины, когда фотография прячется под другой слой.
Но у меня на сайте флешевая шапка и большое фото прячется под неё.
Может есть какой то рецепт, чтоб избавится от этого неприятного эффекта?
Повторюсь, что для того, чтобы говорить предметно, надо видеть код. Вероятнее всего проблему можно решить через стилевое оформление самой страницы куда встраивается галерея.
Доброго времени суток. Очень нравится сайт. Много полезной информации.
Попробовал встроить галерею в свой сайт, он имеет оочень большую ширину и галерея просматривается только при некотрором скроле. Вот тут и вылез косяк с абсолютным позиционированием элементов. Чуть подправил стили, большое изображение стало fixed, вылетает оно с неправильной стороны, ну да ладно. Беда в том, что в IE все поплыло.
Может кто пробовал решить подобную проблему? Буду очень признателен за информацию.
Уважаемый Геннадий.
У меня возникла проблема с этой галлереей. Возможно, что она схожа с проблемой Марины, когда фотография прячется под другой слой.
Но у меня на сайте флешевая шапка и большое фото прячется под неё.
Может есть какой то рецепт, чтоб избавится от этого неприятного эффекта?
wmode=’opaque’ Для флеш ролика должно помочь.
Столкнулся с проблемой как у Марины, методом исключений выяснил, что без строки
IE корректно не отображает размер изображений
В Опере 9.5, если сайт на дивах, fancybox глючит. Вот пример http://www.sahos.ru/index.php?productID=2
Нажмите на любую картинку и увидите что будет.
Дмитрий БОЛЬШОЕ спасибо, действительно с этим тегом IE стал показывать нормально!
Товарищи! Может быть кто-нибудь сможет помочь с моим вопросом?
Потрясающий плагин и потрясающий блог. Спасибо…
Ну и заодно – тоже немог понять почему не работает авторазмер в IE. Сработал после жобавления DTD XHTML 1.0… терь вот мучаюсь вопросом… чем мне грозит добавление этого тега?
То, что Вы добавили, называется определением типа документа. Другими словами, Вы объявили, что этот документ соответствует стандарту XHTML 1.0 Strict. Ну, а соответствует он ему на самом деле или нет – это уже от Вас зависит. Проверить документ на валидность HTML-разметки можно тут: http://validator.w3.org/
Для комплекта: проверка CSS http://jigsaw.w3.org/css-validator/
здравствуйте.
а скажите пожалуйста, почему в фаерфоксь не грузются ютубшные видеоролики.
спасибо.
галлерея прекрасная, но вот такой глюк в Opera 9.6
Попробуйте добавить в файл примера fancybox.html текст, например после блоков
Первый ряд картинок представляет ….
так чтобы страница вытянулась по высоте, и теперь
фото улетает за пределы окна браузера вниз
Есть решение с Оперой 9.6
Находим строку 362 в файле jquery.fancybox.js
и меняем этот метод getViewport на
$.fn.fancybox.getViewport = function() {
var scroll = $.fn.fancybox.getPageScroll();
var h = $.browser.opera && $.browser.version > «9.5″ && $.fn.jquery <= «1.2.6″ ? document.documentElement["clientHeight"] : $(window).height();
return [$(window).width(), h, scroll[0], scroll[1]];
};
Роман! Огромное спасибо.
Теперь все работает нормально ))
Роман отлично теперь все работает и в опере
Привет. Галерея понравилась, однако есть вопрос.
Как сделать чтобы галеря работала без «$(document).ready….»?
Что я делаю:
По умолчанию на странице отображаю новые фота, превьюшки работают.
Но когда подгружаю картинки динамически, при выборе категорий, то клик на картинку дает открытие ее на весь экран, а показ превьюшки как должно быть не пашет. Потому как на эти уже новые подгруженные картинки не отрабатывает крипт привязки их к галерии.
как быть?
А при чем здесь $(document).ready()?
Вы по умолчанию определили картинки, которые должны составить галерею. Для подгружаемых картинок это уже не действует. Вам надо искать другой способ – например подгружать код, отвечающий за галерею вместе с новыми картинками….
потому что по загрузке документа он и определяет эти картинки, которые будут галереей.
подгружать код?
Александр, мне непросто дать точный совет не видя всей картины, но как правило – это одно из самых распространенных «недопониманий». Т.е. есть некая страница, к элементам которой привязаны какие-либо обработчики событий и т.д. Если Вы добавляете какие-либо элементы (наборы элементов) на страницу, это не означает, что те обработчики, которые были назначены до изменения DOM, будут обрабатывать добавленные элементы. Т.е. обработчики для добавляемых элементов нужно тоже подгружать.
Есть конечно и другие варианты, но такой имхо более простой и менее ресурсозатратный…
вооот. именно об этом я и думал… но загрузив вслед за картинками скрипт ( $(«#gallery a»).fancybox({overlayShow: true, … ) , результата тоже не дало.
обычное дело, протупил
эту функцию $(”#gallery a”).fancybox() записал в конец обработчика запроса и все заработало.
Доброе время суток
все круто, но в firefox, при клике на картинку для перехода к следующей, возникает свойственный для тэга a пунктирный контур… прямо посередь картинки… как бы енто побороть…. prototype + scriptaculous в «lightbox» с этим справились…
В стилевом файле fancy.css в правилах для a#fancy_left и a#fancy_right надо дописать outline:none;
Ай пасибо! Все отлично теперь! очень порадовали )
Артур я посмотрел Ваш сайт под Хромом, ИЕ, ФаирФох и Оперой все отлично работает
2Shaman: Выше Роман описал решение моей проблемы. Так что сейчас все работает
ув.Геннадий ! я плохо разбираюсь в программировании ,но демонстационный пример посмотрел по ссылке ! Это здорово !
Мне очень понравилось ! Сделано необычно и в то же время просто , с умом …..Поздравляю ! И желаю дальшейших успехов !
Геннадий, такая ситуация: требуется в fancybox открыть некоторый контент (с этим проблем нет), затем, при нажатии на определенный элемент страницы (допустим, на изображение) закрыть fancybox, и после этого сделать редирект на родительской странице. Подскажите, как это реализовать? На данный момент не могу программно закрыть fancybox.
Для этого надо немного посмотреть код самого плагина. Закрыть можно так:
$(«#fancy_wrap»).hide(«slow»);
Здравствуйте Геннадий! Столкнулся с такой проблемой. Не знаю как с ней бороться. У меня на сайте в шапке есть флэш-ролик и ниже есть фотография подкрученная к fancybox. Когда открывается большая картинка то она попадает под ролик. Как с этим можно разобраться. Помоги пожалуйста!
Заранее спасибо
Добрый день! Очень понравился сайт, попробывал у себя такое сделать но вот под ИА 6 не хочет мне показывать видео в отдельном окне,гляньте пжлста если вас не затруднит
http://www.kravl.ru/advertising/
кликаем на фото справа
Вы слишком буквально приняли пример. У Вас работает только первый ролик, потому что все ролики имеют id=»video». id – это идентификатор элемента, он уникален, его не должно быть более одного! Дайте своим роликам не id, а например class=»video», и тогда уже пишите:
$(«a.video).fancybox({
zoomSpeedIn: 0,
zoomSpeedOut:0,
frameWidth: 425,
frameHeight: 340
});
разобрался
<embed wmode=»opaque»……..
И диву в котором лежит флэш делаем z-index:1
Извини за «не в тему», но может кому пригодиться )
Строчка потерялась
<embed wmode=»opaque»……..
И диву в котором лежит флэш делаем z-index:1
А как в скрипте изменить размеры открываемого изображения? Мне нужно размер окна на 10% больше, если оно не достигает 100% размера изображения. А также мне нужны изменения что-бы картинка открывалась только в 100% размере. Помогите с проблемой.
Но картинки и открываются в реальном размере. Если Вас смущают опции frameWidth, frameHeight – то они в основном для вывода любого контента через iframe.
Здравствуйте
Моя CMS генерит имена картинок из хэшей, соответственно хранит вот в таком виде
«h_fbd4fec9702c3f725f1673d2c8104ae4″
код для FancyBox выглядит следующим образом
но Fancybox не понимает что это изображение и открывает его как html-контент во фрейме… с полосами прокрутки
как быть? помогите!
Если все картинки одинакового размера, можно попробовать определить ширину и высоту с помощью опций frameWidth, frameHeight…
Пользуюсь давно, но вдруг возникла пролема – флешки на сайте упорно лезут поверх открываемых картинок….
>>Пользуюсь давно, но вдруг возникла пролема – >>флешки на сайте упорно лезут поверх открываемых >>картинок….
проставьте у флешек параметр
wmode=»transparent»
но есть минус..
если у флешки большой fps то в msie пойдут тормоза
2Zergalius
<param name=»wmode» value=»opaque»>
<embed wmode=»opaque»….
И диву в котором лежит флэш делаем z-index:1
Спасибо, помогло.
Ошибка: [Exception... "'Syntax error, unrecognized expression: [@rel=fancy-tour]‘ when calling method: [nsIDOMEventListener::handleEvent]» nsresult: «0×8057001e (NS_ERROR_XPC_JS_THREW_STRING)» location: «» data: no]
Причём такая ерунда с Квери 1.3, на 1.2.6 нормально работает
Придется Вам поискать свежую версию плагина под 1.3.1 заточенную – иначе работать не будет.
Вы, как я понял ведущий программист, поэтому поясню по простому, цитатой из оригинальной документации:
Note: In jQuery 1.3 [@attr] style selectors were removed (they were previously deprecated in jQuery 1.2). Simply remove the ‘@’ symbol from your selectors in order to make them work again.
Gennady, спасибо
У меня все отлично сработало. Спасибо.
Опечатка вкралась..
вместо $(«#video»).fancybox({
должно быть
$(«#testvideo»).fancybox({
Здравствуйте! Помогите мне, пожалуйста! Я установил данный модуль, но при нажатии на картинку у меня исходная картинка (большого размера) появляется не по середине страницы, как у Вас в примере, а в конце страницы… Что мне нужно сделать, чтобы у меня картинка открывалась в центре страницы? ..
Сергей, здравствуйте! Я сталкивался с такой же проблемой, помогло обновление jQuery до версии 1.3.2.
Доброго времени суток.
Интересует применение, JS функций в JQery.
как допустим switch применяется в JQery ?
пробую нечто подобное:
$(«#galery a»).hover(function() {
var ob = $(this).next(«ul»);
switch (ob){
case ‘mn1′ : var SWHt = 30 break;
case ‘mn2′ : var SWHt = 50 break;
case ‘mn3′ : var SWHt = 100 break;
case ‘mn4′ : var SWHt = 70 break;
case ‘mn5′ : var SWHt = 200 break;
}
далее..
}
но файрбуг консоль ошибку выдает.
mn1 и т.д это id обьектов.
Но jQuery – это JS-библиотека, это по сути и есть javascript-код. Давайте просто попробуем вместе разобраться, что Вы пишете:
- выбираете элементы а, являющиеся дочерними по отношению к элементу с идентификатором galery;
- связываете с этим набором событие hover();
- при наступлении этого события Вы выбираете следующий за элементом а сестринский элемент ul и сохраняете ссылку на него в переменной ob;
А вот вероятный источник ошибки – Вы сохраняете ссылку на объект jQuery, а Вам надо было сохранить в переменной значение атрибута id, т.е.
var ob = $(this).next('ul').attr('id');спасибо =), действительно так и было все.
Добрый день. Скажите я установил этот скрипт, но при нажатии на другие ссылки на сайте открывается (грузится) страница в окошко. Почему?
Добрый.
Во-первых – это не скрипт. Это плагин к библиотеке jQuery.
Во-вторых, стоит хотя бы немного разобраться в API этой библиотеки, чтобы не задавать таких вопросов.
В-третьих, я не телепат, чтобы не глядя сказать почему так.
Предположить могу: в селектор jQuery, к которому Вы цепляете функциональность плагина попадают все элементы а на странице.
Поэтому я и написал, что стоит уделить внимание хотя бы начальному знакомству с библиотекой.
В «деловой книге» хочу чтобы переход по картинкам осуществлялся вот так: 1-4-2-5-3-6. т.е. не просто переходить из первого изображения на второе и т.д. а как я указала. Можно было бы тупо поменять расположение изображений, но тогда рушится наглядность изображений. Вопрос: есть ли способ, чтобы можно было переходить как указано в коде???
Добрый день.
Я очень полохо разбираюсь. Так как первый сайт начал писать 2 недели назад. Галерея работает, всё в норме, но почему-то не отображаются иконки для ссылок. Тоесть ссылки работают, но не видно самих значков.
Gifки пиктограм скачал, всё вроде там где надо лежит, но не отображается блин.
Помогите плиз, мне очень нужна именно эта галерея, так как здесь за одной превьюхой можно прятать несколько фоток.
Заранее спасибо
To: east-belle
Разве написать свой код… Вы посмотрите как это в принципе делается – там особенно ничего сложного то нет.
Мини фотогалерея из 11 строк кода
To Дмитрий:
Проверяйте, обязательно ошибка найдется… Попробуйте для начала вообще без javascript-кода сделать страничку и добиться, чтобы картинки отображались…
Я прошу прощения, уже всё работает.
Ещё один глупый вопрос. Где прописать ссылку на папку с картинками пиктограм(прокрутка влево и вправор, закрытие и.т.д)?
Хочу упорядочить хаос в корневой папке сайта.
Заранее приготовленное большое человеческое спасибо.
но вид-то совершенно не тот. Ладненько обойдемся))) Спасибо за быстрый ответ)
Можно ли размещать несколько галерей, где одна превьюха прячет массив картинок на одной сранице?
У меня не получается, если знаете подскажите пожалуйста.
To Дмитрий:
в стилевом файле галереи fancybox.css
Можно. Только для каждой галереи придется задать отдельные настройки в отдельном селекторе и отдельный массив, где определяется url и title. Ну например:
$('#gal1').fancybox({ itemLoadCallback: getGroupItems }); $('#gal2').fancybox({ itemLoadCallback: getGroupItems });Придется малость переписать getGroupItems, хотя если идти в лоб, можно просто написать ее два раза и в первой указать первый массив, во второй – второй и т.д. Не лучший вариант, но если не уверены в своих силах – лучше так.
Кстати, новая версия плагина в этом плане имеет баг, который пока не исправлен, так что лучше наверное пока использовать версию старую.
Интересно, не это ли баг:
Сделал две рядом превьюшки, за котороми по 15 фоток… Сделал «в лоб» : 2 селектора, 2 массива….
только по кликам на каждую првьюшку открывается один и тот массив…
Здравствуйте! Помогите мне, пожалуйста! Я установил данный модуль, все работает прекрасно. Решил немного усложнить задачу, на WEB страницу с модулем jQuery DataTables (у меня таблица с данными) добавил модуль jQuery FancyBox, я сделал, чтобы в таблице нажимая на ссылку открывалась новая WEB страница с нужной информацией (как в примере с Google ). Проблема состоит в том, что два модуля конфликтуют друг с другом, если работает jQuery FancyBox и новое окно красиво открывается, то не работает DataTables (не отображается поиск и сортировка таблици) и наоборот. Надеюсь, что понятно объяснил и жду помощи. Заранее спасибо Генадий.
Евгений, по описанию довольно сложно сказать в чем может быть причина, Вы бы ссылку сбросили на посмотреть. Может и подсказал бы что-то…
Спасибо за статью, всё очень понятно написано.
Решил поделиться опытом:
Данный модуль работает прекрасно во всех браузерах, но в IE6 была проблема при подключении $(document).ready(function(). Все активные элементы (ссылки) на странице становились неактивными. Тоесть, сайт после загрузки словно превращался в стационарную картинку – мышкой водишь над ссылками, а они вообще не реагируют.
Решение крылось в следующем: в style.css для body был прописан background с картинкой в формате .png.
Изменение на .jpg решило проблему.
Здравствуйте! Помогите мне, пожалуйста! Скачал этот пример, то место, где несколько картинок скрываются под одной, ссылки и ролики открываются нормально. А вот обычные картинки не открываются, просто сбрасывает меня по ссылке на саму картинку и выдает еще ошибку
Ошибка: [Exception... "'Syntax error, unrecognized expression: [@rel=fancy-tour]‘ when calling method: [nsIDOMEventListener::handleEvent]» nsresult: «0×8057001e (NS_ERROR_XPC_JS_THREW_STRING)» location: «» data: no]
Надеюсь что все понятно объяснил,заранее спасибо. Боб
Я уверен, что Вы подключили версию 1.3+ библиотеки jQuery. Вам надо или подключать 1.2.6 или лезть в код плагина и заменить везде, где найдете [@rel=fancy-tour] на [rel=fancy-tour], т.е. просто уберите @.
Gennady спасибо большое, все заработало! Действительно подключал версию 1.3Ю когда убрал @, все заработало. Спасибо за быстрый ответ
Здравствуйте!Прощу прощения за идиотский вопрос- а можно ли сделать так, что когда под одной картинкой кучу других прячешь, во время просмотра тоже появлялся темный фон, при нажатии на который просмотр прекратился бы.
Заранее спасибо. Боб
Вопрос действительно не очень…. Вы же вроде уже «пытали» этот плагин, даже вопросы по нему задавали. Посмотрите демо – там есть такой вариант…
Геннадий, доброго времени суток.
Отличный скрипт. Но у меня есть мелкие непонятки на тему ширины iframe’а: не получается его сделать такой ширины, чтобы влезала страница =(
настройка параметров ничего не дала. css тоже.
чтобы было понятнее – сайт express.ru ссылка калькулятор
To:drcrasher
Что касается express.ru – а причем здесь фотогалерея?! Вам надо для этой формы просто dialog использовать. Также будет модальное окно с формой на затемненном фоне.
To: Alex_M
в целом, мне нужен был iframe. Он себя прекрасно показал, но единственное, что он не собирается делать – нормально менять ширину. Остальное меня устраивает.
Про «просто dialog» -можно подробностей?
Добрый день. У меня следующий вопрос: на странице есть формочка в сркытом диве, есть ссылка, которая заполняет с помощью js эту формочку и открывает fancybox с этим дивом. В IE, в fancybox-e форма открывается заполенной, в Opera 9.6 – форма не заполняется. Подскажите, пожалуйста, как можно устранить эту проблему.
To drcrasher:
Я бы даже дополнил мысль, которую высказал Alex_M – имхо тут и dialog-то тоже не нужен. Обычный div, позиционированный абсолютно и изначально скрытый. А в нем уже – что угодно. Зачем усложнять, подключая нехилого веса плагины, когда нужную функциональность можно организовать «штатными» методами jQuery.
Использую вашу галерею. Спасибо за неё и за комменатрии. Во всех браузерах работает хорошо, кроме IE6. Причём ошибка появляется при загрузке страницы. IE пишет: «Internet Explorer cannot open the Internet site. Operation abborted.» После нажатия на OK в сообщении об ошибке The page cannot be displayed.
Может кто сталкивался с подобной проблемой?
Вообще-то это совсем даже не моя галерея – чужого нам не надо
Что касается ошибки в IE6 – не знаю, открыл в нем, посмотрел – все без проблем…
Вот сайт http://www.makeup.na.by на котором все сделано по вашей статье а скрипт не работает
взгляните пожалуйста
Пожалуйста, взглянул. Но там не все сделано….
Вы все подключили – это да, но где с каким элементом Вы связываете подключенную функциональность?
В статье есть вот такой код:
$(document).ready(function(){ $("#gallery a").fancybox(); });При Вашей разметке он конечно будет немного другим, что то вроде:
$(document).ready(function(){ $("p a").fancybox(); });проблему решил
Что-то я этого не заметил… Вы изменили разметку, вставив список, но JS-кода я так и не заметил – не работает она у Вас пока…
Что-то я этого не заметил… Вы изменили разметку, вставив список, но JS-кода я так и не заметил – не работает она у Вас пока…
я скрипт вставил только на нужной странице
http://www.makeup.na.by/portfolio.html
Да, теперь вижу – вроде все ок!
Добрый вечер Gennady!
у меня вопрос, не подскажите как поменять событие появления большой картинки с ONClick на OnMouseOver?
То есть не при щелчке на маленькой, а при наведении.
Имхо, придется лезть в код плагина и менять событие в нужных местах – по другому никак.
действительно, отличная галерея!
Интересно, вот этот кусок в файле jquery.fancybox.js:
…….
.attr(’src’, url + ‘?rand=’ + Math.floor(Math.random() * 999999999)
……
Генерировать каждый раз новые адреса для одинх и техже картинок, нагружать канал, забивать кеш, создавать пустой трафик, заставлять каждый раз ждать загрузки ожних и техже картинок, раздражать посетителя …
Это такое ТОНКОЕ издевательство над «счасливыми» посетителями моих страниц или надо мною ?
Геннадий, подскажите, пожалуйста, как запускать показ больших фоток не по клику мыши, а сразу после загрузки страницы?
Если Вы про FancyBox спрашиваете, то можно попробовать просто при готовности DOM сгенерировать событие клик и этим вызвать плагин. Ну примерно так:
$(‘.selector’).fancybox().click();
Здравствуйте, спасибо за совет!
Еще столкнулся с проблемой, нигде не могу найти, как изменить навигацию фотографий.
Нужно чтобы по щелчку на фото в любом месте она перелистывалась вперед, а дойдя до последней фотки переходила на первую.
разобрался сам, если кому интересно, нужно в fancy.css
для a#fancy_right указать параметр width: 100%;
а тег a#fancy_left убрать совсем
Далее в самом скрипте меняем строки:
if (opts.itemNum != (opts.itemArray.length – 1)) {
$(«#fancy_nav»).append(‘‘);
$(‘#fancy_right’).click(function(){
$.fn.fancybox.changeItem(opts.itemNum + 1); return false;
});
}
НА:
$(«#fancy_nav»).append(‘‘);
if (opts.itemNum != (opts.itemArray.length – 1)) {
$(‘#fancy_right’).click(function(){
$.fn.fancybox.changeItem(opts.itemNum + 1); return false;
});
}
else{
if(opts.itemArray.length != 1){
$(‘#fancy_right’).click(function(){
$.fn.fancybox.changeItem(0); return false;
});
}
}
и будет вам счастье =)
СПАСИБО ВАМ ЗА ВАШ БЛОГ!
по поводу вашего совета для автозапуска показа фоток.
Конструкция $(’.selector’).fancybox().click(); работает только в том случае, если мы запускаем отдельную фотку. Но если за ‘.selector’ мы прячем массив фоток, то отображается просто пустой квадрат. Возможно это связано с отсутствием текущего элемента массива? Помогите, пожалуйста )
Понял. Нет время самому попробовать, но в качестве идеи – если попробовать вариант:
$(‘.selector’).fancybox();
// и эмулируем клик на первом элементе объекта
$(‘.selector:first’).click();
Напишите тогда, получилось или нет…
Геннадий, выход где-то рядом, общий ход вашей идеи понял, но не хватает знаний для маневров.
При конструкции
$(’.selector’).fancybox();
// и эмулируем клик на первом элементе объекта
$(’.selector:first’).click();
Автоматом открывается сам сайт в окне. Забавный такой эффект клонирования =))))
Попробовал прямо в файле примера
http://www.linkexchanger.su/example_jquery/fancybox.html
у меня конструкция
$(«#gallery a:first»).click();
работает как задумано – при загрузке открывается первое фото, а далее можно перебирать остальные.
Я пока оставил это – можете взглянуть, потом уберу.
Геннадий, спасибо большое.
надо было эту конструкцию в $(document).ready(function(){…..})
кидать. Все заработало! )
Ну, и отлично. А я про ready() и не упоминал, поскольку это ес-но, с этого и начинается все…
Ув., Gennady, скажите есть ли жесткие требования к хостингу?
Опробовал плагин на локальной машине (Win, Denwer – apache2.2.4, php5.2.4) – все замечательно работает. Настроил под себя, интегрировал в сайт. Залил на хостинг ( Apache 2.2.11 (Unix) , PHP 5.2.9) и облом
изображения отрываются в новом окне..
В коде вроде все аутентично, неужели изза хоста проблема?
Сервер не при чем – ведь весь JS-код выполняется на клиенте. Так что либо в браузере отключена поддержка JS, либо с путями к JS-файлам напутали. В общем что-то в этом роде…
…
Забыл сказать – оригинальный пример на хостинге тоже не работает, открывает в новом окне.
А кто-нибудь реализовал, чтобы дергался счетчик (liveinternet например) при смене фоток?
Геннадий, здравстуйте! Большое спасибо за статью, очень хорошо и понятно написано!
Возник вопрос такого характера – можно ли при нажатии на ссылку организовать, чтоб в модальном окне (iframe) выводилась страница 1.html, и при этом в главной странице загружалась страница 2.html?
Заранее спасибо за ответ!
Здесь простого пути не вижу. Может стоит не Fancy использовать, а например clueTip? Контент через ajax он подгрузит, но в отличие от Fancy, у него есть несколько полезных методов. Например в onShow можно определить callback-функцию, которая вызывается при показе окна подсказки. Соответственно в этой функции попробовать сделать смену главного окна. Или попробовать использовать не onShow, а onActivate – смысл тот же, но вызывается callback-функция перед показом окна подсказки…
Попробуйте.
Большое спасибо за наводку! Буду пробовать
Gennady, спасибо за статью – очень помогло. Уже ставил в качестве фотогалереи и все прекрасно работает.
Теперь решил выводить форму в модальном окне. Использую Вашу статью по jquery.form: то есть в окно в примере с iframe для Fancybox подгружается файл отправляющий форму айаксом. Все работает. Но теперь проблема – после получения ответа надо программно закрыть окно. Я ставил $(«#fancy_wrap»).hide(«slow»); – в функцию получения ответа function showResponse(responseText, statusText) {…} но это не работает. Посоветуйте пожалуйста
Попробуйте вызвать $.fn.fancybox.close(); – это должно помочь.
Я его уже пробовал в первую очередь, но не помогает. Есть ли другая возможность? Подскажите пожалуйста. Фрагмент:
function showResponse(responseText, statusText) {
alert(‘Статус ответа сервера: ‘ + statusText + ‘\n\nТекст ответа сервера: \n’ + responseText +
‘\n\nЦелевой элемент div обновиться этим текстом.’);
$.fn.fancybox.close();
}
Может проблема в области видимости? Хотя не должно бы вроде…. Пока не могу сказать ничего определенного. Попробую выбрать время и попытать примерчик…
Геннадий, здравствуйте! Хотел задать вопрос такого характера, пытаюсь в iframe вывести flash анимацию (игры), в mozila, opera всё нормально отображается в ie появляются полосы прокрутки, не подскажете как можно решить? В принципе есть идея выводимый элемент размещать не в левом верхнем углу, а по центру рамка просто получится шире, но к сожалению я новичок в этих технологиях и как это реализовать не знаю, не могли бы подсказать? И еще, это просто интересно, не сильно мешает, при закрытии фрейма музыка с флешь объекта продолжает играть в ie и opera до клика по любой из ссылок на сайте, это решается, может кто сталкивался…
Заранее огромное спасибо!
Ссылка на проблему http://rusmediaportal.ru/content-view-1.html кликнуть надо по «Флешь игра!!! ССЫЛКА!!!»
Андрей, а почему именно в iframe выводить надо? Есть же возможность показывать flash-объекты. Посмотрите в примерах – второй ряд, вторая миниатюра слева (там где Жирков гол празднует
).
Великолепно flash-контент выводится. Разве Вам не подходит?
Спасибо за совет! Попробую реализовать таким образом, как вы рекомендуете!
Проблема решена! Окно закрывается если вызвать:
parent.$.fn.fancybox.close();
Геннадий, снова здравствуйте, помните вчера с вами по поводу вывода в iframe flash содержимого, сделал как вы порекомендовали, не хочет отображать ролик, выводится черное окно в верху которого написано null, внимательно всё перепроверил, если ниже постить непосредственно ролик без использования плагина, работает, то есть с путями наколдовать не мог, не могли бы если не сложно еще раз взглянуть…
Ссылка на проблему http://rusmediaportal.ru/content-view-1.html кликнуть надо по “Флешь игра!!! ССЫЛКА!!!”
Спасибо!
В ссылке атрибут href = testvideo, а id div’а – tesvideo…
Извините за невнимательность! Огромное вам спасибо за оперативность, отзывчивость и помощь!
Еще раз извините, только в ie всё равно размеры не хочет понимать… В остальных браузерах всё в порядке, не знаете как быть?
ie6 чего-то у меня навертво подвис на этой странице, 7-го под рукой нет, а 8-й нормально как и в FF, Opera и Google Chrome.
Там везде одно и тоже – мне кажется это не плагин размеры неверно понимает. Окно он дает и менно такого размера как задано. Имхо в игре сама заставка нарисована сверху-слева как-то… И соответственно справа и внизу остается пустое место. А когда уже сама игра пошла – тогда все в норме, окно полностью занято…
Хорошо! Спасибо вам большое!
Генадий, хочу вам порекомендовать хорошую программку ИЕ-тестер. В ней можно проверить сайт под четыре разные версии IE: 5.5, 6.0, 7.0 и 8.0. Мне очень понравилась программка.
http://www.my-debugbar.com/wiki/IETester/HomePage
Прочитал заметку и все комменты, может, чего-то не увидел.
В Вашем примере картинки раскрываются, а при закрытии улетают в thumbnail. Какая переменная за возврат в маленькую картинку отвечает?
Спасибо.
За это отвечают свойства объекта, передаваемые плагину:
zoomSpeedIn – скорость анимации при открытии полноразмерного изображения.
zoomSpeedOut – при его закрытии.
Если они не определены или по нулям – анимации не будет.
Прочитала Вашу статью и надеюсь на помощь.
Как открыть картинку с эффектом FancyBox или lightbox из флэш. Работаю с Flash 8.
Ирина, к сожалению мое знакомство с flash-технологиями весьма поверхностно. Немного пробовал работать в Adobe Flex 3. Macromedia Flash разве что открывал и закрывал.
Попробуйте погуглить на тему как обмениваться данными между flash и javascript, знаю, что материал на эту тему есть, найти несложно.
Спасибо за быстрый ответ. Гуглю.
Не такой он уж и быстрый оказался – не хватает времени на все. Удачи!
Помоги разобраться с проблемой, вроде везде и все нормально работает, но вот ie выдает ошибку, причем только он, при вызове галлереи, скрытой за 1 символом.
Сообщение: ‘opts.itemArray[...]‘ – есть null или не является объектом
Строка: 54
Символ: 5
Код: 0
URI-код: http://www.siteName.ru/assets/templates/cavaletto_v3/js/fancy.js
Вы вероятно старую версию используете, попробуйте поработать с новой. См. тут: http://fancybox.net/
Геннадий, приветствую!
Почему то не получается с выводом массива картинок.
библиотека последняя (http://code.google.com/p/jqueryjs/downloads/detail?name=jquery-1.3.2.min.js&downloadBtn=)
Ошибку выдает следующую:
Сообщение: Разрешение отклонено
Строка: 19
Символ: 27021
Код: 0
URI-код: http://…jquery-1.3.2.min.js
Вы не могли бы предположить, в чем может быть проблема? Где ошибиться могла…?
Код вставялемый непосредственно в нужную стр такой:
$(document).ready(function(){
var imageList = [
{url: "../img_big1.jpg", title: "Эскиз 1"},
{url: "../img_big2.jpg", title: "Эскиз 2"},
{url: "../img_big3.jpg", title: "Эскиз 3"},
];
function getGroupItems(opts) {
jQuery.each(imageList, function(i, val) {
opts.itemArray.push(val);
});
}
$(«#custom»).fancybox({
itemLoadCallback: getGroupItems
});
});
Заранее, спб!
TINA, попробуйте взять старую версию библиотеки (как в примере у меня), тогда все будет работать. В последней версии плагина, которая под 1.3 идет вроде присутствует баг. Именно когда пытаешься прятать за одной миниатюрой несколько картинок. Детально не разбирался – некогда. Может разработчик когда-то поправит. Кстати, он тут живет http://fancybox.net/
да, Геннадий, со старой библиотекой и плагинами – всё заработало..спасибо.
А изначально я и брала это всё хозяйство именно с http://fancybox.net/, а потом уже начала прикручивать ваше решение с 1 миниатюрой…
жалко конечно, что там баг…поэтому такая солянка и получилась… И со стилями тоже …
Классная галлерея! Вот только в Опере 10-ой на четверть экрана отображается, что делать?
Помогите плиз…..
Всем спасибо!
Комментирование статьи завершено. Обсуждение статьи можно продолжить на форуме jQuery.
[...] ' xajaxResponse->addAssign('div1','innerHTML',$data); Посмотрим по дизайну, какое содержимое нам нужно будет менять программно и поместим их в отдельные div? там где их нет в верстке поместим изменяемое содержимое в новые блоки div (смотрим по файлу main.html) 1. Сайт 2-х языковой – поэтому блок со ссылкой на выбор языка div id=lang 2. при смене языка – слоган div id=sl 3. при смене языка – вывод категорий и товаров div id=menubotbg (по категориям товаров решен использование библиотеки jquery) а также ссылки на О марке и Контакты div id=menu2 4. при выборе товара – заголовок для выбранного товара (например Коллекция 2008 / Крабы) div id=menubotbg 5. галерея для выбранного товара div id=myImageFlow используется js библиотека imageFlow официальный сайт 6. описание товара div id=opisanie 7. цена товара div id=price 8. форма заказа товара (по нажатии на кнопку Заказать) div id=data здесь используется в верстке jquery плагин fancybox (несколько нестандартное использование галереи – для имитации всплывающего окна) Официальный сайт Для тех кто хочет ознакомиться с применением библиотеки Примеры на русском языке [...]