• Записи 162
  • Теги 66
  • Комментарии 330

Компьютерное

jsImageBox -- легкий аналог lightbox без jQuery

Делал сегодня фотогалерею для одного из своих сайтов, и потребовался скрипт, который показывал бы фотографию во всплывающей рамке с затемнением фона (так называемый lightbox), причем так, чтобы можно было просматривать сразу целую серию фотографий, переходя от одной к другой. Оригинальный lightbox не подходил именно по причине отсутствия поддержки серий, а его вторая версия использует jQuery. Для того сайта мне покзалось это слишком тяжелым решением, и я стал искать легкий скрипт, не требующий больших библиотек. И такое решение было найдено: jsImageBox, в сжатом виде занимающий всего 9 Kb.


Использование очень простое: подключаем файл с помощью тега script, как обычно, для каждой фотографии в серии задаем rel="rr" и событие onclick="return jsiBoxOpen(this)", а также аттрибут title для ссылки, если хотим выводить не только фотографию, но и ее название. Важный момент: если в верстке сайта используются блоки с относительным позиционированием (position: relative), тег script нужно помещать в head, или сразу после открывающего тега body, иначе всплывающая рамка может оказаться совсем не там, где вы ее ожидаете.


В целом скрипт понравился мне всем, кроме юзабилити: пользование социальным сетями приучило к тому, что если щелкнуть по самой фотографии, происходит переход к следующей, здесь же при щелчке не происходило ничего, а для перехода приходилось целиться в маленькую стрелочку наверху. То же самое и с закрытием: привычное закрытие по щелчку вне рамки не работало. Решил доработать самостоятельно. Это оказалось просто: в функции инициализации jsiBoxInit добавил обработчик, вызывающий функцию перехода к следующему сообщению, если оно не последнее или функцию закрытия в противном случае:


jsiBox.mainImg.onclick=function() {
if (jsiBox.currentImgIndex+1 < jsiBox.linkNodesArray.length) jsiBoxNext();
else jsiBoxClose();
}
jsiBox.wrapNode.onclick = jsiBoxClose;

Вставлять этот код следует после


jsiBox.mainImg       = document.getElementById('jsiBoxMainImage');

Также поправил цвет фона заливки в настройках в начале файла:


overlayColor   : '#000',

Общее впечатление осталось такое: хорошее решение там, где требуется легкость и простота, но автору есть куда его совершенствовать. В частности, улучшить юзабилити, вынести в настройки скорость разворачивания рамки и сделать добавление HTML-кода не через document.write, а через appendChild к тегу body.

8 комментариев:

Нет
Михаил
0

Может вы подскажете как решить еще одну важную проблему? Представим ситуацию, есть страница, на ней 20 строк текста, под ними миниатюра фотографии. Т.е. высота страницы умещается на одном экране, даже меньше. Если нажать на миниатюру, которая находится почти у футера, то она расширится вниз, при этом серое затенение будет ровно до конца страницы, а так как картинка большой высоты, и разворачивается вниз дальше чем футер, то половина изображения получается без затенения, т.е. на белом фоне. Надеюсь понятно объяснил.

4X_Pro
0

Да, вполне понятно. Тут есть два варианта: либо приписать миниатюре большой margin-bottom, чтобы снизу был запас места (как вариант, добавлять его динамически при щелчке), либо влезть в скрипт и поменять стили отображения вот тут:
&lt;div style="position: absolute; top: 0; left: 0; width: 100%; z-index: 2000;"&gt;
Например, попробовать поставить вместо absolute fixed и увеличить top и left, чтобы миниатюра выводилась не в самом верху экрана, а с каким-то отступом.

Нет
Денис
0

Здравствуйте, а можно зафиксировать размер картинки которая выводиться после нажатия на миниатюру. Если у фото большое разрешение, то оно открывается как есть, - за пределы поля браузера, а нужно что бы фото открывалось например по фиксированной ширине??

4X_Pro
0

Можно. Для этого в CSS сайта нужно прописать такое:
#jsiBoxMainImage { max-width: ширина }
Или, если нужно принудительно одинаковую ширину везде,
#jsiBoxMainImage { width: ширина }

Нет
Денис
0

Спасибо. Но, например при использовании #jsiBoxMainImage { max-width: 800 } ширина картинки уменьшается как надо, а вот ширина и высота самого окна остается прежнего размера (размера картинки). Если - #jsiBoxMainImage { width: 800 } и задать фиксированную высоту, то высота картинки меняется, а ширина нет. При этом само окно остается прежнего размера (размера картинки).

4X_Pro
0

Можно еще попробовать позадавать свойства height и width для #jsiMainBox. Но тогда придется сделать размер окна полностью фиксированным, скорее всего.

Нет
Гульнара
0

На Yii2 advanced не работает, хотя в basic все было ок.
Открывается черное окно, без изображение, в стилях #jsiBoxMainImage стоит display: none; opacity: 0;
Печалька!
Кто-нибудь знает что делать?

4X_Pro
0

Скорее всего, происходит конфликт CSS Lightbox со стилями, прописанными где-то в Yii. Или, как вариант, блокировщик рекламы срабатывает по каким-то причинам.

Написать комментарий


Задать вопрос