Плагин jQuery cloud-zoom (лупа)

Автор: Андрей Косяк Дата публикации: 19.11.2010

Внедрять лупу в проекты приходится не так часто, как, к примеру, галереи или слайдеры, но, как оказалось в моем случае, в этой нише есть свои тонкости. Плагины для реализации лупы существуют в сети в достаточном количестве, поэтому задача подбора сводится к тому, чтоб выбрать, примерно, по таким критериям (в порядке важности):

  • Кроссбраузерность
  • Применимость к конкретным условиям
  • Вес скрипта, быстродействие, гибкость настройки и т.п

Перебрав несколько разных плагинов, я остановился на cloud-zoom от профессора Тучи :). Решающим фактором стала возможность внедрения лупы в галерею. Но и некоторые другие реализации лупы мне приглянулись, их рассмотрим в следующих статьях.

Смотрим что умеет: демо

Проверено в:

  • IE 6-8
  • Firefox 3+
  • Opera 9+
  • Safari 3+
  • Chrome 7

Что качать?

Быстрый старт

Как обычно подключаем js и css:

<link rel="stylesheet" type="text/css" href="css/cloud-zoom.css" />

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script>
<script type="text/javascript" src="js/cloud-zoom.1.0.2.js"></script>

html-конструкция:

<a class="cloud-zoom" href="path-to-big-img"> 
    <img src="path-to-normal-img" alt="" width="" height="" />
</a>

Ничего особенного, кроме наличия класса cloud-zoom у ссылки. Результат

Лупа "под лупой"

Взглянув на результат быстрого старта стразу бросается в глаза, что zoom-окно "прилипло" к блоку с картинкой. Само собой, поскольку мы не использовали ни одного параметра плагина. исправим это:

<a class="cloud-zoom" href="path-to-big-img"> 
    <img src="path-to-normal-img" alt="" width="" height="" rel="adjustX: 14, adjustY:0" />
</a>

Результат

Особенностью плагина является способ подачи параметров. Как видим из примера, параметры задаются через атрибут rel у ссылки-контейнера. Расмотрим возможные параметры:

Параметры

Название параметра Описание значение по умолчанию
zoomWidth ширина zoom-окна, при значении "auto" будет равна ширине окна с маленькой картинкой "auto"
zoomHeight высота zoom-окна, при значении "auto" будет равна высоте окна с маленькой картинкой "auto"
position определяет позицию zoom-окна по отношению к окну-родителю, может принимать значения "left", "right", "top" и "bottom", а также "blockId" — id блока, в случае, если нужно разместить zoom-окно в другой части экрана "right"
adjustX корректировка положения zoom-окна по горизонтали 0
adjustY корректировка положения zoom-окна по вертикали 0
tint цвет фона вокруг рамки родительского окна в hex-формате(#RRGGBB) (Не работает в паре с softFocus) false
tintOpacity прозрачность фона вокруг рамки-курсора в родительском окне 0.5
lensOpacity прозрачность рамки-курсора в родительском окне 0.5
softFocus эффект размытия области вокруг рамки-курсора (не работает в паре с tint) false
smoothMove сглаживание движения изображения в zoom-окне(значение 1 будет в точности повторять движение мыши по родительскому окну) 3
showTitle показывать описание (берется из атрибута title изображения) true
titleOpacity прозрачность фона с описанием 0.5

В дополнение к параметрам, мы, как обычно, имеем возможность воздействовать на стили плагина. Все предельно ясно, разобраться труда не составит:

/* Перемещаемая зона под указалелем линзы */
.cloud-zoom-lens {
	border: 4px solid #888;
	margin:-4px;
	background-color:#fff;	
	cursor:move;		
}
/* текст заголовка */
.cloud-zoom-title {
	font-family:Arial, Helvetica, sans-serif;
	position:absolute !important;
	background-color:#000;
	color:#fff;
	padding:3px;
	width:100%;
	text-align:center;	
	font-weight:bold;
	font-size:10px;
	top:0px;
}
/* Окошко зума */
.cloud-zoom-big {
	border:4px solid #ccc;
	overflow:hidden;
}
/* Загрузочное сообщение */
.cloud-zoom-loading {
	color:white;	
	background:#222;
	padding:3px;
	border:1px solid #000;
}

Режим галереи

Теперь рассмотрим вариант с галереей. Структура кода:

<a class="cloud-zoom" href="pic/ukraina-big.gif" id='zoom1' rel="position: 'right', adjustX: 10, adjustY: 0"> 
	<img src="pic/ukraina-middle.png" alt="" width="200" height="185" />
</a>

<ul>
	<li>
		<a class="cloud-zoom-gallery" href="pic/ukraina-big.gif" title='' rel="useZoom: 'zoom1', smallImage: 'pic/ukraina-middle.png'">
			<img src="pic/ukraina-small.png" alt="" width="100" height="105" />
		</a>
	</li>
	<li>
		<a class="cloud-zoom-gallery" href="pic/poland-big.gif" title='' rel="useZoom: 'zoom1', smallImage: 'pic/poland-middle.png'">
			<img src="pic/poland-small.png" alt="" width="100" height="105" />
		</a>
	</li>
	<li>
		<a class="cloud-zoom-gallery" href="pic/armenia-big.gif" title='' rel="useZoom: 'zoom1', smallImage: 'pic/armenia-middle.gif'">
			<img src="pic/armenia-small.gif" alt="" width="100" height="105" />
		</a>
	</li>
</ul>

В идеале, список можно и не использовать(я показал готовый код из примера), достаточно только ссылок с изображениями.

Результат

Для основного окна, вроде бы, все ясно, а вот для, так называемых, thumbnails мы видим два непонятных параметра: useZoom и smallImage. Все просто, useZoom указывает на id основного окна, а smallImage - путь к изображению, которое будет "зумиться". Само собой, для реализации такой галереи, каждое изображение должно быть в наличии в трех размерах: большое (в zoom-окне), среднее (в родительском) и маленькое (условно говоря, в качестве иконок в галерее)

Заметки

В моем случае, набор картинок в галерее мог меняться при помощи ajax, само собой, что действие плагина на подгруженные элементы не распространялось, поэтому стал вопрос переинициалзации плагина, это делается тоже просто:

jQuery('.cloud-zoom, .cloud-zoom-gallery').CloudZoom();

Так же хочу заметить, что в коде плагина инициализация уже присутствует (в самом верху файла), поэтому если не нужно инициализировать плагин при загрузке — просто убираем эту строку.

Преимущества

  • кроссбраузерность
  • простота внедрения
  • легкий вес — 6кб
  • легкая настраиваемость
  • поддержка режима галереи

Недостатки

Возможно до недостатка не дотягивает, но мне не нравится что параметры плагина приходится писать в HTML коде. Как по мне, то лучше, не "сорить" в хтмл, а все выносить во внешний js.

Материалы