Универсальная галерея для сайта на jQuery Универсальная галерея для сайта на jQuery



 

Как вы возможно заметили, мы достаточно много уделяем внимания по созданию различных галерей для сайта, и это совсем не странно, ведь галерей достаточно много, и они весьма специфические. В данном уроке мы рассмотрим как создать адаптированную галерею с каруселью миниатюр для сайта, с помощью плагина jquery. Галерея будет подстраиваться под размер окна браузера, также можно будет отключить или включить карусель миниатюр. Достаточно удобно можно осуществлять навигацию с помощью клавиатуры.

 

ДЕМО
ИСХОДНИКИ

 

Для создания данной галереи мы будем использовать плагин jQuery Touchwipe. Но для начала начнем с более простого, мы рассмотрим построение скелета нашей галереи, а именно разметки HTML. В коде HTML мы будем использовать основной контейнер с классом “rg-gallery”. Также он будет иметь одинаковый с классом идентификатор.

<div id="rg-gallery" class="rg-gallery">
 <div class="rg-thumbs">
 <!-- Карусель Elastislide для миниатюр -->
 <div class="es-carousel-wrapper">
 <div class="es-nav">
 <span class="es-nav-prev">Предыдущий</span>
 <span class="es-nav-next">Следующий</span>
 </div>
 <div class="es-carousel">
 <ul>
 <li>
 <a href="#">
 <img src="images/thumbs/1.jpg" data-large="images/1.jpg" alt="image01" data-description="Здесь описание" />
 </a>
 </li>
 <li>...</li>
 </ul>
 </div>
 </div>
 <!-- Карусель Elastislide для миниатюр -->
 </div><!-- rg-thumbs -->
</div><!-- rg-gallery -->


В другом элементе div с классом “rg-thumbs” будет размещаться структура для карусели Elastislide. Миниатюры будут иметь два атрибута data, которые будут использоваться позже в нашем коде JavaScript. Атрибут “data-large” содержит путь к большому изображению, а атрибут “data-description” содержит подпись, которая будет выводиться под текущим большим изображением.

Для структуры области просмотра больших изображений используется шаблон jQuery, который добавляется в заголовке нашего документа:

<script id="img-wrapper-tmpl" type="text/x-jquery-tmpl">
 <div class="rg-image-wrapper">
 {{if itemsCount > 1}}
 <div class="rg-image-nav">
 <a href="#" class="rg-image-nav-prev">Предыдущее изображение</a>
 <a href="#" class="rg-image-nav-next">Следующее изображение</a>
 </div>
 {{/if}}
 <div class="rg-image"></div>
 <div class="rg-loading"></div>
 <div class="rg-caption-wrapper">
 <div class="rg-caption" style="display:none;">
 <p></p>
 </div>
 </div>
 </div>
</script>

Мы добавляем условие, что навигация будет выводится только в случае наличия более одного изображения. Контейнер “rg-image” будет использоваться для добавления большого изображения. Теперь рассмотрим стилизацию CSS.

Элемент  “rg-image-wrapper”, который используется в шаблоне jQuery, будет иметь относительное позиционирование и полупрозрачное повторяющееся изображение в качестве фона. Рамка будет иметь скругленные углы и минимально допустимую высоту 20 px:

rg-image-wrapper{
   position:relative;
   padding:20px 30px;
   background:transparent url(../images/black.png) repeat top left;
   -moz-border-radius: 10px;
   -webkit-border-radius: 10px;
   border-radius: 10px;
   min-height:20px;
}

Контейнер, который используется для добавления большого изображения будет иметь относительное позиционирование и высоту строки 0. Добавим для него выравнивание текста по центру мы заставим все строчные элементы выравниваться по центру. Но так как мы не используем для изображения “display:block”, нужно установить высоту строки равной 0. Таким образом, не будет зазора  над изображением, так ка оно является строчным элементом по умолчанию:

rg-image{
   position:relative;
   text-align:center;
   line-height:0px;
}

С помощью задания свойству большого изображения max-width значения 100%, мы добиваемся, чтобы оно всегда оставалось окруженным плавающим контейнером. Мы не нуждаемся в данном свойстве, но если вы хотите ограничить размер области предварительного просмотра, то вам придется устанавливать фиксированную высоту для класса “rg-image” и изображение будет заполнять его при изменении ширины области просмотра.

rg-image img{
   max-height:100%;
   max-width:100%;
}

Навигационные элементы будут иметь следующие стили:

.rg-image-nav a{
    position:absolute;
    top:0px;
    left:0px;
    background:#000 url(../images/nav.png) no-repeat -20% 50%;
    width:28px;
    height:100%;
    text-indent:-9000px;
    cursor:pointer;
    opacity:0.3;
    outline:none;
    -moz-border-radius: 10px 0px 0px 10px;
    -webkit-border-radius: 10px 0px 0px 10px;
    border-radius: 10px 0px 0px 10px;
}

Это стиль для левой стрелки, теперь посмотрим на свойства для правой стрелки:

rg-image-nav a.rg-image-nav-next{
   right:0px;
   left:auto;
   background-position:115% 50%;
   -moz-border-radius: 0px 10px 10px 0px;
   -webkit-border-radius: 0px 10px 10px 0px;
   border-radius: 0px 10px 10px 0px;
}

Так как мы уже определили значение свойства left для элементов в целом, его придется установить в значение auto для правой стрелки. При наведении курсора мыши стрелки будут становиться более четкими:

.rg-image-nav a:hover{
    opacity:0.8;
}

Подписи будут иметь следующие стили:

.rg-caption {
    text-align:center;
    margin-top:15px;
    position:relative;
}
.rg-caption p{
    font-size:11px;
    letter-spacing:2px;
    font-family: 'Trebuchet MS', 'Myriad Pro', Arial, sans-serif;
    line-height:16px;
    padding:0 15px;
    text-transform:uppercase;
}

Для переключателя установим следующие стили:

.rg-view{
    height:30px;
}
.rg-view a{
    display:block;
    float:right;
    width:16px;
    height:16px;
    margin-right:3px;
    background:#464646 url(../images/views.png) no-repeat top left;
    border:3px solid #464646;
    opacity:0.8;
}
.rg-view a:hover{
    opacity:1.0;
}
.rg-view a.rg-view-full{
    background-position:0px 0px;
}
.rg-view a.rg-view-selected{
    background-color:#6f6f6f;
    border-color:#6f6f6f;
}
.rg-view a.rg-view-thumbs{
    background-position:0px -16px;
}

Индикатор загрузки будет появляться в центре изображения:

.rg-loading{
    width:46px;
    height:46px;
    position:absolute;
    top:50%;
    left:50%;
    background:#000 url(../images/ajax-loader.gif) no-repeat center center;
    margin:-23px 0px 0px -23px;
    z-index:100;
    -moz-border-radius: 10px;
    -webkit-border-radius: 10px;
    border-radius: 10px;
    opacity:0.7;
}

Основная идея галереи заключается в ее гибкости. Частично задача решена с с помощью стилей: большое изображение подгоняется под контейнер. Для получения адаптивной карусели миниатюр мы используем плагин Elastislide. Определим некоторые переменные:

// Контейнер галереи
var $rgGallery			= $('#rg-gallery'),
// Контейнер карусели
$esCarousel			= $rgGallery.find('div.es-carousel-wrapper'),
// Пункт карусели
$items				= $esCarousel.find('ul > li'),
// Общее количество пунктов
itemsCount			= $items.length;

Затем функцию галереи:

Gallery = (function() {
    //Функция галереи
})();

Gallery.init();

Здесь мы определяем переменные для текущего изображения, режима вывода и контроля за загрузкой изображения. Затем вызываем несколько функций, которые определяются ниже:

// Индекс текущего пункта
var current			= 0,
// Режим : карусель || во весь экран
mode 			= 'carousel',
// Проверка, если одно изображение загружено
anim			= false,
init			= function() {

	// (Не обязательно) предварительная загрузка изображений здесьы...
	$items.add('</pre>
<img src="images/ajax-loader.gif" alt="" /><img src="images/black.png" alt="" />
<pre>').imagesLoaded( function() {
		// Добавляем опции
		_addViewModes();

		// Добавляем обертку большого изображения
		_addImageWrapper();

		// Выводим первое изображение
		_showImage( $items.eq( current ) );
	});

	// Инициализуем карусель
	_initCarousel();

},

Вызываем плагин Elastislide:

_initCarousel= function() {

	// Используем плагин elastislide:
	$esCarousel.show().elastislide({
		imageW 	: 65,
		onClick	: function( $item ) {
			if( anim ) return false;
			anim	= true;
			// По нажатию клавиши мыши выводим изображение
			_showImage($item);
			// Меняем текущее
			current	= $item.index();
		}
	});

	// Устанавливаем текущее для elastislide
	$esCarousel.elastislide( 'setCurrent', current );

},

Следующая функция выводит переключатели режимов просмотра и управляет ими:

_addViewModes= function() {

	// Кнопки вверху справа: скрыть / показать карусель

	var $viewfull	= $(''),
		$viewthumbs	= $('');

$rgGallery.prepend( $('</pre>
<div></div>
<pre>').append( $viewfull ).append( $viewthumbs ) );

	$viewfull.bind('click.rgGallery', function( event ) {
		$esCarousel.elastislide( 'destroy' ).hide();
		$viewfull.addClass('rg-view-selected');
		$viewthumbs.removeClass('rg-view-selected');
		mode	= 'fullview';
		return false;
	});

	$viewthumbs.bind('click.rgGallery', function( event ) {
		_initCarousel();
		$viewthumbs.addClass('rg-view-selected');
		$viewfull.removeClass('rg-view-selected');
		mode	= 'carousel';
		return false;
	});

},

Функция  _addImageWrapper добавляет структуру для большого изображения и кнопки навигации, если общее количество изображений больше, чем одно.

_addImageWrapper= function() {

	// Добавляем структуру для больших изображений и кнопок навигации (если общее количество пунктов  > 1)

	$('#img-wrapper-tmpl').tmpl( {itemsCount : itemsCount} ).appendTo( $rgGallery );

	if( itemsCount > 1 ) {
		// Добавляем навигацию
		var $navPrev		= $rgGallery.find('a.rg-image-nav-prev'),
			$navNext		= $rgGallery.find('a.rg-image-nav-next'),
			$imgWrapper		= $rgGallery.find('div.rg-image');

		$navPrev.bind('click.rgGallery', function( event ) {
			_navigate( 'left' );
			return false;
		});

		$navNext.bind('click.rgGallery', function( event ) {
			_navigate( 'right' );
			return false;
		});

		// Добавляем событие touchwipe для обертки большого изображения
		$imgWrapper.touchwipe({
			wipeLeft			: function() {
				_navigate( 'right' );
			},
			wipeRight			: function() {
				_navigate( 'left' );
			},
			preventDefaultEvents: false
		});

		$(document).bind('keyup.rgGallery', function( event ) {
			if (event.keyCode == 39)
				_navigate( 'right' );
			else if (event.keyCode == 37)
				_navigate( 'left' );
		});

	}

},

Также инициализируются события навигации. Используя плагин jQuery Touchwipe, мы добавляем поддержку навигации с помощью сенсорного экрана и клавиатуры. Навигация по большим изображениям контролируется следующей функцией:

_navigate		= function( dir ) {

	// Навигация по большим изображениям

	if( anim ) return false;
	anim	= true;

	if( dir === 'right' ) {
		if( current + 1 >= itemsCount )
			current = 0;
		else
			++current;
	}
	else if( dir === 'left' ) {
		if( current - 1 < 0 )
			current = itemsCount - 1;
		else
			--current;
	}

	_showImage( $items.eq( current ) );

},

Функция _showImage добавляет большое изображение и его название:

_showImage= function( $item ) {

		// Выводим большое изображение, которое ассоциировано с $item

		var $loader	= $rgGallery.find('div.rg-loading').show();

		$items.removeClass('selected');
		$item.addClass('selected');

		var $thumb		= $item.find('img'),
			largesrc	= $thumb.data('large'),
			title		= $thumb.data('description');

		$('</pre>
<img alt="" />
<pre>').load( function() {

			$rgGallery.find('div.rg-image').empty().append('</pre>
<img src="' + largesrc + '" alt="" />
<pre>');

			if( title )
				$rgGallery.find('div.rg-caption').show().children('p').empty().text( title );

			$loader.hide();

			if( mode === 'carousel' ) {
				$esCarousel.elastislide( 'reload' );
				$esCarousel.elastislide( 'setCurrent', current );
			}

			anim	= false;

		}).attr( 'src', largesrc );

	};

return { init : init };

 

Материал взят из зарубежного источника - tympanus.net/codrops/2011/09/20/responsive-image-gallery и представлен исключительно в ознакомительных целях.


Top

🔖 Выбор по тегам ×

💌 Написать сообщение ×

Все поля обязательны для заполнения!