Слайдер миниатюр с помощью jQuery
В этом уроке мы покажем, как создать и использовать слайдер миниатюр с помощью jQuery. Так как нас много раз просили показать, как создать слайдер миниатюр изображений, работающего отдельно от просмотра изображений в полном размере, в этом уроке мы решили показать только создание слайдера миниатюр.
Идею создания такого слайдера мы позаимствовали в статье Создание галереи с предпросмотром миниатюр.
Мы использовали фотографии талантливого фотографа tibchris, выложенные на сайте Flickr.
Итак, начнем.
Разметка
Структура HTML документа будет построена на основном списке изображений "точек" и специального списка миниатюр. У списка миниатюр будет класс "ts_thumbnails", и он будет содержать маленькие окошки, в которых будут отображаться изображения при наведении на одну из "точек".
<ul class="ts_container"> <li><a href="#">Image 1</a></li> <li><a href="#">Image 2</a></li> <li><a href="#">Image 3</a></li> <li><a href="#">Image 4</a></li> <li><a href="#">Image 5</a></li> <li><a href="#">Image 6</a></li> <li><a href="#">Image 7</a></li> <li><a href="#">Image 8</a></li> <li><a href="#">Image 9</a></li> <li><a href="#">Image 10</a></li> <li class="ts_thumbnails"> <div class="ts_preview_wrapper"> <!-- Список миниатюр --> </div> <span></span> </li> </ul>
В пустой элемент span мы поместим треугольник, который будет указывать на текущее изображение. Структура списка миниатюр, находящегося в блоке "ts_preview_wrapper", будет таковой:
<ul class="ts_preview"> <li><img src="/images/thumbs1/1.jpg" alt="Thumb 1" /></li> <li><img src="/images/thumbs1/2.jpg" alt="Thumb 2" /></li> <li><img src="/images/thumbs1/3.jpg" alt="Thumb 3" /></li> <li><img src="/images/thumbs1/4.jpg" alt="Thumb 4" /></li> <li><img src="/images/thumbs1/5.jpg" alt="Thumb 5" /></li> <li><img src="/images/thumbs1/6.jpg" alt="Thumb 6" /></li> <li><img src="/images/thumbs1/7.jpg" alt="Thumb 7" /></li> <li><img src="/images/thumbs1/8.jpg" alt="Thumb 8" /></li> <li><img src="/images/thumbs1/9.jpg" alt="Thumb 9" /></li> <li><img src="/images/thumbs1/10.jpg" alt="Thumb 10" /></li> </ul>
Теперь давайте займемся стилями.
CSS стили
Список "точек" будет позиционирован относительно и будет иметь ширину, равную сумме ширин всех "точек".
ul.ts_container{ list-style:none; margin:0; padding:0; width:170px; margin:20px auto; position:relative; height:17px; }
Ширина каждой "точки" равна 11 плюс 3 пикселя отступов с каждой стороны. Это общий стиль, который мы будем использовать для всех трех случаев. Если у вас больше 10 "точек", вам придется подогнать собственные значения (как и для высоты).
Для элементов списка "точек" опишем такой стиль:
ul.ts_container li{ float:left; }
Сами точки представляют собой фоновые изображения. Определим для них отступы, чтобы не видеть текст:
ul.ts_container li a{ display:block; text-indent:-9000px; width:11px; height:11px; outline:none; padding:0px 3px; background:transparent url(../images/sliderIcons/dot.png) no-repeat top center; }
При наведении курсора расположение фонового изображения поменяется так, чтобы мы видели его нижнюю часть.
ul.ts_container li a:hover, ul.ts_container li.selected a{ background-position:50% -11px; }
Последний элемент списка - это специальный контейнер миниатюры, который будет позиционирован абсолютно, так как нам необходимо будет его перемещать. В начале он невидим.
ul.ts_container li.ts_thumbnails{ display:none; position:absolute; }
В пустом теге span будет находится наш маленький треугольник. Его расположение будет вычисляться динамически, так как оно зависит от размера миниатюры.
ul.ts_container li.ts_thumbnails span{ background:transparent url(../images/sliderIcons/triangle.png) no-repeat top center; width:15px; height:6px; position:absolute; }
Совет: если вам не нравится использовать пустые HTML теги, просто добавьте какой-то текст в них и определите для него отступы так, чтобы он не был виден. Так ваш HTML код будет читабельным и вы будете спокойны :)
Окошко просмотра изображений будет в белой рамке и с симпотичной тенью. Его размеры будут также вычисляться динамически, так как они зависят от размеров миниатюры. Выходящея за рамки окошка части изображения скрыты, так как у нас есть ряд миниатюр в списке за этим блоком.
.ts_preview_wrapper{ border:5px solid #fff; overflow:hidden; position:relative; -moz-box-shadow:0px 0px 5px #999; -webkit-box-shadow:0px 0px 5px #999; box-shadow:0px 0px 5px #999; }
Список миниатюр будет позиционирован абсолютно, так как мы анимируем его расположение слева после скрытия миниатюры справа. Размеры вычисляются динамически. Например, ширина - это сумма ширин всех миниатюр. Но этим мы займемся в JavaScript коде.
ul.ts_preview{ position:absolute; left:0px; top:0px; margin:0; padding:0; list-style-type:none; }
Сами миниатюры будут расположены в ряд:
ul.ts_preview li{ float:left; }
Миниатюры отображаюся в блоке, чтобы в элементах списка не было отступов:
ul.ts_preview li img{ display:block; }
На этом все со стилями.
Код JavaScript
Главная задача этого небольшого слайдера заключается в том, чтобы отображать изображения любых размеров, а также применять к ним визуальные эффекты. Итак, наш плагин будет выглядеть так:
(function($) { $.fn.thumbnailSlider = function(options) { var opts = $.extend({}, $.fn.thumbnailSlider.defaults, options); return this.each(function() { ... }); }; $.fn.thumbnailSlider.defaults = { speed : 100, //скорость анимации easing : 'jswing', //эффект смягчения thumb_width : 75, //ширина изображений thumb_height: 75, //высота изображений zoom : false, //увеличение изображений zoomratio : 1.3, //коэффициент увеличения (должен быть > 1) zoomspeed : 15000, //скорость увеличения масштаба onClick : function(){return false;} //при клике - callback }; })(jQuery);
Рассмотрим детальнее его функциональность. Во-первых, объявим некоторые переменные.
var $this = $(this), o = $.meta ? $.extend({}, opts, $pxs_container.data()) : opts; var $ts_container = $this.children('.ts_container'), $ts_thumbnails = $ts_container.children('.ts_thumbnails'), $nav_elems = $ts_container.children('li').not($ts_thumbnails), total_elems = $nav_elems.length, $ts_preview_wrapper = $ts_thumbnails.children('.ts_preview_wrapper'), $arrow = $ts_thumbnails.children('span'), $ts_preview = $ts_preview_wrapper.children('.ts_preview');
Нам также необходимо вычислить некоторые значения для определенных элементов. Ширина контейнера "ts_thumbnails", в котором отображается миниатюра, состоит из ширины самой миниатюры + ширина рамки (5 пикселей с каждой стороны). Его высота будет включать также 6 пикселей высоты элемента span с треугольником. Значение top всегда одно и то же, причем отрицательное. Значение left вычисляется из значения left текущей "точки" минус половина ширины миниатюры. Так он расположится в начале соответствующей "точки", так что нам необходимо добавить половину ее ширины, чтобы расположить его прямо над ней.
/* вычисляем размеры $ts_thumbnails: width -> ширина миниатюры + ширина рамки (2*5) height -> высота миниатюры + ширина рамки + высота треугольника(6) top -> -(высота + отступ 5 пикселей) left -> leftDot - 0.5*width + 0.5*widthNavDot будет установлено при наведении на точку, и значение по умолчанию будет соответствовать первому nav dot */ var w_ts_thumbnails = o.thumb_width + 2*5, h_ts_thumbnails = o.thumb_height + 2*5 + 6, t_ts_thumbnails = -(h_ts_thumbnails + 5), $first_nav = $nav_elems.eq(0), l_ts_thumbnails = $first_nav.position().left - 0.5*w_ts_thumbnails + 0.5*$first_nav.width();
Теперь зададим все эти значения:
$ts_thumbnails.css({ width : w_ts_thumbnails + 'px', height : h_ts_thumbnails + 'px', top : t_ts_thumbnails + 'px', left : l_ts_thumbnails + 'px' });
Очень важно правильно расположить треугольник. Чтобы посчитать его значение top, необходима высота миниатюры + ширина рамки. Значение left зависит от ширины миниатюры: берем ширину + ширину рамки и делим на 2, а затем отнимаем половину ширины треугольника. Это расположит треугольник по центру:
/* вычисляем значения top и left треугольника top -> высота миниатюры + ширина рамки(2*5) left -> (ширина миниатюры + ширина рамки)/2 - (ширина треугольника)/2 */ var t_arrow = o.thumb_height + 2*5, l_arrow = (o.thumb_width + 2*5) / 2 - $arrow.width() / 2; $arrow.css({ left : l_arrow + 'px', top : t_arrow + 'px', });
Ширина списка миниматюр "ts_preview" равна ширине миниатюры, умноженной на их количество.
/* вычисляем ширину $ts_preview -> ширина миниатюры * количество миниатюр */ $ts_preview.css('width' , total_elems*o.thumb_width + 'px');
Устанавливаем ширину, а также высоту, равную высоте миниатюры:
$ts_preview_wrapper.css({ width : o.thumb_width + 'px', height : o.thumb_height + 'px' });
Теперь зададим действия, которые будут выполняться при наведении курсора на один из элементов управления, т.е. "точку". Получаем индекс точки, чтобы знать к какой миниатюре перейти. Затем вычислим значение left, чтобы знать, куда переместить окошко просмотра, т.е. элемент списка "ts_thumbnails". Мы также анимируем список миниатюр вправо, так как нам известен индекс текущей точки.
Если была выбрана опция zoom, то будем увеличивать ширину и высоту миниатюры:
$nav_elems.bind('mouseenter',function(){ var $nav_elem = $(this), idx = $nav_elem.index(); /* вычисляем новое значение left для $ts_thumbnails */ var new_left = $nav_elem.position().left - 0.5*w_ts_thumbnails + 0.5*$nav_elem.width(); $ts_thumbnails.stop(true) .show() .animate({ left : new_left + 'px' },o.speed,o.easing); $ts_preview.stop(true) .animate({ left : -idx*o.thumb_width + 'px' },o.speed,o.easing); //увеличиваем размер миниатюры, если zoom = true if(o.zoom && o.zoomratio > 1){ var new_width = o.zoomratio * o.thumb_width, new_height = o.zoomratio * o.thumb_height; //увеличиваем ширину $ts_preview var ts_preview_w = $ts_preview.width(); $ts_preview.css('width' , (ts_preview_w - o.thumb_width + new_width) + 'px'); $ts_preview.children().eq(idx).find('img').stop().animate({ width : new_width + 'px', height : new_height + 'px' },o.zoomspeed); } }).bind('mouseleave',function(){ //устанавливаем значения ширины и высоты по умолчанию if(o.zoom && o.zoomratio > 1){ var $nav_elem = $(this), idx = $nav_elem.index(); $ts_preview.children().eq(idx).find('img').stop().css({ width : o.thumb_width + 'px', height : o.thumb_height + 'px' }); } $ts_thumbnails.stop(true) .hide(); }).bind('click',function(){ var $nav_elem = $(this), idx = $nav_elem.index(); o.onClick(idx); });
На этом все! Рассмотрим пример.
Пример
В демо есть 4 примера. Ниже вы можете увидеть пример вызова последнего. Для этого нам нужно установить ширину и высоту миниатюры и задать некоторые другие значения. Нам нужно, чтобы изображение увеличивалось при наведении курсора на точку:
$('#demo4').thumbnailSlider({ thumb_width : 174, thumb_height: 260, speed : 200, zoom : true, zoomspeed : 10000, zoomratio : 1.7 });
Надеемся, вам понравился наш урок!
Источник: http://feedproxy.google.com/~r/ruseller/CdHX/~3/RuwnB8bc18E/lessons.php
Дайджест новых статей по интернет-маркетингу на ваш email
Новые статьи и публикации
- 2024-11-26 » Капитан грузового судна, или Как начать использовать Docker в своих проектах
- 2024-11-26 » Обеспечение безопасности ваших веб-приложений с помощью PHP OOP и PDO
- 2024-11-22 » Ошибки в Яндекс Вебмастере: как найти и исправить
- 2024-11-22 » Ошибки в Яндекс Вебмастере: как найти и исправить
- 2024-11-15 » Перенос сайта на WordPress с одного домена на другой
- 2024-11-08 » OSPanel 6: быстрый старт
- 2024-11-08 » Как установить PhpMyAdmin в Open Server Panel
- 2024-09-30 » Как быстро запустить Laravel на Windows
- 2024-09-25 » Next.js
- 2024-09-05 » OpenAI рассказал, как запретить ChatGPT использовать содержимое сайта для обучения
- 2024-08-28 » Чек-лист: как увеличить конверсию интернет-магазина на примере спортпита
- 2024-08-01 » WebSocket
- 2024-07-26 » Интеграция с Яндекс Еда
- 2024-07-26 » Интеграция с Эквайринг
- 2024-07-26 » Интеграция с СДЕК
- 2024-07-26 » Интеграция с Битрикс-24
- 2024-07-26 » Интеграция с Travelline
- 2024-07-26 » Интеграция с Iiko
- 2024-07-26 » Интеграция с Delivery Club
- 2024-07-26 » Интеграция с CRM
- 2024-07-26 » Интеграция с 1C-Бухгалтерия
- 2024-07-24 » Что такое сторителлинг: техники и примеры
- 2024-07-17 » Ошибка 404: что это такое и как ее использовать для бизнеса
- 2024-07-03 » Размещайте прайс-листы на FarPost.ru и продавайте товары быстро и выгодно
- 2024-07-01 » Профилирование кода в PHP
- 2024-06-28 » Изучаем ABC/XYZ-анализ: что это такое и какие решения с помощью него принимают
- 2024-06-17 » Зачем вам знать потребности клиента
- 2024-06-11 » Что нового в работе Яндекс Метрики: полный обзор обновления
- 2024-06-11 » Поведенческие факторы ранжирования в Яндексе
- 2024-06-11 » Скорость загрузки сайта: почему это важно и как влияет на ранжирование
Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей Индийская пословица |
Мы создаем сайты, которые работают! Профессионально обслуживаем и продвигаем их , а также по всей России и ближнему зарубежью с 2006 года!
Как мы работаем
Заявка
Позвоните или оставьте заявку на сайте.
Консультация
Обсуждаем что именно Вам нужно и помогаем определить как это лучше сделать!
Договор
Заключаем договор на оказание услуг, в котором прописаны условия и обязанности обеих сторон.
Выполнение работ
Непосредственно оказание требующихся услуг и работ по вашему заданию.
Поддержка
Сдача выполненых работ, последующие корректировки и поддержка при необходимости.