Скрипт-дополнение к jQuery-плагину bxSlider

bxSlider

Когда при верстке сайтов на заказ есть необходимость реализовать слайдер, я использую замечательный jQuery-плагин bxSlider. Он очень прост в установке, настройке и стилизации и поддерживает последние тенденции в веб-разработке, такие, как адаптивность, CSS3-анимацию и корректную работу на мобильных устройствах.

Один из примеров данного плагина — это пагинатор из превьюшек, о котором далее и пойдет речь.

Такой способ реализации имеет ряд недостатков:

  1. Используется тег ссылки <a>, у которого атрибут href пустой, т.е. ссылка никуда не ведет. Это не хорошо с точки зрения семантики, а опционально его никак не поменять.
  2. Необходимо прописывать индексы слайдов через атрибут data-slide-index. Я считаю, что не стоило так делать, ведь можно было реализовать то же самое и без этого атрибута.
  3. При клике на превьюшку останавливается автоматическая смена слайдов.
  4. Мне приходилось делать слайдер, в котором слайды переключаются при наведении курсора мыши на превьюшку, а не по клику. Более того, сама превьюшка должна являться ссылкой на какую-то статью сайта. Естественно, вышеуказанный пример с сайта плагина не позволяет это реализовать.

Чтобы обойти данные недостатки, я написал скрипт-дополнение, который работает через предусмотренные на такие случаи опции плагина bxSlider.

Вот код этого скрипта:

var slider = $('#slider'); // селектор слайдера
var pagerItem = $('#slider-pager li'); // селектор пункта пагинатора
var active = 'active'; // класс активного пункта пагинатора

if ( slider.length ) {
	var prev = false;
	function pager() {
		pagerItem.filter('.' + active).each(function() {
			var el = $(this);
			if (prev) {
				if ( el.is(':first-child') ) {
					el.removeClass(active);
					pagerItem.filter(':last').addClass(active);
				} else el.removeClass(active).prev().addClass(active);
			} else {
				if ( el.is(':last-child') ) {
					el.removeClass(active);
					pagerItem.filter(':first').addClass(active);
				} else el.removeClass(active).next().addClass(active);
			}
		})
	}
	slider.bxSlider({
		// опции плагина
		controls: true,
		pager: false,
		auto: true,
		autoHover: true,
		pause: 5000,
		onSlidePrev: function() { prev = true;  pager(); },
		onSlideNext: function() { prev = false; pager(); }
		// конец опций
	});
	pagerItem.click(function() {
		slider.stopAuto();
		var index = pagerItem.index($(this));
		slider.finish().goToSlide(index);
		pagerItem.removeClass(active);
		$(this).addClass(active);
	}).mouseleave(function() {
		slider.startAuto();
	});
	pagerItem.filter(':first').addClass(active);
}

Благодаря данному скрипту, в пагинаторе теперь можно использовать любые теги, нет необходимости прописывать индексы, а автосмена слайдов продолжает работать и после клика на превьюшку. Результат посмотрите на живом примере.

А для того, чтобы реализовать задачу из 4-го пункта недостатков, необходимо внести в скрипт две правки:

  1. Поменять click на hover, чтобы слайд переключался при наведении на превьюшку.
  2. Добавить опцию useCSS: false. Суть в том, что по умолчанию анимация переключения слайдов в плагине bxSlider работает с помощью CSS3. И если мы быстро наводим курсор то на одну превьюшку, то на другую, может произойти сбой, когда активный пункт пагинатора не соответствует изображению слайда. А при отключенной CSS-анимации работает jQuery-анимация, которую можно останавливать в нужный момент, благодаря чему такой сбой избегается.

Посмотрите второй пример в действии.

Комментарии (60)

  1. Владимир
    17 сентября 2014 г. в 14:34

    А как бы мне реализовать двойную навигацию? Слева и справа?

  2. Игорь
    9 октября 2014 г. в 08:49

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

  3. София
    26 октября 2014 г. в 16:40

    Здравствуйте подскажите пожалуйста а можно цвет заменить при смене слайдера через затемнение ?

    1. 26 октября 2014 г. в 17:07 / ответ на коммент София

      Не совсем понимаю, что вы имеете в виду.

  4. Никита
    27 января 2015 г. в 15:51

    Добрый день. Подскажите, можно ли каждому слайду указать гиперссылку? Допустим, чтобы при переходе по ссылке site.ru#2 у посетителя сразу открывался второй слайд.

    1. 27 января 2015 г. в 16:39 / ответ на коммент Никита

      Для этого нужно дорабатывать скрипт.

  5. Виктор
    2 марта 2015 г. в 18:31

    Добрый день. А можно сделать загрузку самого js слайдера в конце страницы ?

    1. 2 марта 2015 г. в 19:54 / ответ на коммент Виктор

      Конечно можно, как и любой другой скрипт.

      1. Виктор
        1 апреля 2015 г. в 10:51 / ответ на коммент Dimox

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

  6. Никита
    1 апреля 2015 г. в 01:43

    А если нужно проделать тоже самое, но без использования превью картинок, а просто на стандартных «точках»? В скрипте ничего менять не нужно? Собственно проблема только в том, что после переходов по «точкам/стрелкам» автоматическая смена перестает работать. Спасибо!

    1. 1 апреля 2015 г. в 10:29 / ответ на коммент Никита

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

      $('#slider').bxSlider({
      	...,
      	onSlideAfter: function() { slider.startAuto(); }
      });
      
      
      1. Никита
        5 апреля 2015 г. в 02:08 / ответ на коммент Dimox

        Спасибо, но решение не работает(

        1. 5 апреля 2015 г. в 11:48 / ответ на коммент Никита

          У меня работает.

          1. игорь
            24 мая 2015 г. в 01:36 / ответ на коммент Dimox

            Тоже почему-то не работает.

      2. Олег
        1 июня 2015 г. в 02:25 / ответ на коммент Dimox

        Куда вставить ваш текст для запуска автоматического переключения слайдера, после того как в ручную переключил слайды??

        $(‘#slider’).bxSlider({
        …,
        onSlideAfter: function() { slider.startAuto(); }
        });

        1. 1 июня 2015 г. в 11:19 / ответ на коммент Олег

          Туда же, куда и прописываются все остальные опции слайдера. Я же показал пример. Многоточие — это другие опции.

  7. Андрей
    19 апреля 2015 г. в 17:55

    Подскажите пожалуйста, как сделать, чтобы по клику на текущий слайд происходила прокрутка к следующему слайду?

    1. 20 апреля 2015 г. в 12:52 / ответ на коммент Андрей

      После этой строки (которая в самом конце):

      pagerItem.filter(':first').addClass(active);

      вставьте:

      $('#slider li').click(function() {
      	slider.stopAuto();
      	slider.finish().goToNextSlide();
      });
  8. Денис
    20 апреля 2015 г. в 18:06

    Подскажите, а как можно добавить animate.css на элементы в слайде, причем чтоб анимация срабатывала каждый раз при показе слайда?

  9. xyz
    1 мая 2015 г. в 17:28

    Здравствуйте. Помогите пожалуйста. Для слайдера bxslider я задаю пагинацию слайдов с помощью функции buildPager:
    $slider = $(‘.bxslider’).bxSlider({
    auto: true,
    autoControls: true,
    speed: 500,
    buildPager: function(slideIndex){
    switch(slideIndex){
    case 0: /* первый слайд не имеет ячейку пагинации */
    return;
    case 1:
    return ‘

    ‘;
    case 2:
    return ‘

    ‘;
    case 3:
    return ‘

    ‘;

    }
    }
    });
    Где в классах .logon задаются бэкграунд-картинки для неактивных ячеек пагинации.
    Также в классах .logon-active задаются бэкграунд-картинки для активных ячеек пагинации.
    Как сделать, чтобы при клике на соответствую ячейку пагинации, а также для соответствующего этой ячейки слайда (при автоматическом пролистывании), менялся бэкграунд данной ячейки.
    (Всё что я знаю, что тут надо применять методы removeClass() addClass(), или нет?)
    Заранее огромное спасибо!

  10. Никита
    7 июня 2015 г. в 22:14

    А что если будет не 5 слайдов как в примере, а скажем 25, можно ли как-то сделать карусель из превьюшек? Спасибо!

    1. Мне не раз требовался подобный функционал, но с bxSlider мне это так и не удалось сделать. Использую плагин Owl Carousel.

      1. Никита
        7 июня 2015 г. в 22:33 / ответ на коммент Dimox

        Спасибо, попробую

  11. Артем
    14 июля 2015 г. в 21:56

    Спасибо,реально,этот функционал в bx slider реализован очень криво,но благодря вам теперь всё работает как надо,без вашей доработки у меня не работало переключение слайдов по клику миниатюры,из-за id ссылки. которые начинались не с нуля.! Спасибо вам!

  12. Алексей
    17 июля 2015 г. в 17:44

    Слайдер конечно суперовый! Использую и не нарадуюсь ))
    Столкнулся с загвоздкой, может подскажите…
    Слайдер находится в шапке. При клике на слайд, переходим по линку и нужно чтобы на открытой странице, слайдер начинался с того слайда, на который кликнули, а не с самого начала. Был бы очень благодарен за помощь.

  13. Игорь
    26 октября 2015 г. в 19:35

    Здравствуйте! А не подскажите, как сделать так, чтобы пагинация не отображалась когда число слайдов меньше заданного максимума (не для случая с превьюшками). Просто как-то не красиво получается, когда я хочу организовать карусель последних просмотренных пользователем товаров и, например, отображаю их по четыре штуки на экран, а пользователь посмотрел 1 товар и видит его в просмотренных вместе с «единичкой» пагинатора. Скорее всего это можно сделать через функцию buildPager, но никак не могу сообразить как. Может зададите нужный вектор для размышлений или кините ссылку на готовый пример. Заранее огромное спасибо.

  14. Lapkin
    17 марта 2016 г. в 21:16

    Дмитрий! Спасите! нужен код для реализации вашего второго примера! Прошу Вас выслать файлы для его встройки к сайту. Буду Вам очень признателен

    1. 17 марта 2016 г. в 22:24 / ответ на коммент Lapkin

      Весь код находится в примерах.

  15. Lapkin
    18 марта 2016 г. в 12:42

    Сделал все как указанно, но при наведении мыши не срабатывает слайдер. Что может быть не так?

    1. 18 марта 2016 г. в 14:05 / ответ на коммент Lapkin

      Видимо, где-то допустили ошибку в коде. Сравнивайте с примером.

  16. Роман
    1 апреля 2016 г. в 17:16

    Не работает переключение картинок с пейджинга на версии jquery 1.8.2 (превьюшки не кликабельны). Не подскажите что нужно поправить чтобы заработало на данной версии? На версии 1.9.1 работает, но использовать данную библиотеку не могу, т.к. много старых скриптов для старых версий (например pirobox)

    1. Роман
      1 апреля 2016 г. в 17:21 / ответ на коммент Роман

      Сам нашел. Вот решение — http://javascript.ru/forum/showthread.php?p=338588 (второй пост)

    2. 8 октября 2016 г. в 12:39 / ответ на коммент Роман

      А использование плагина jQuery Migrate не поможет?

  17. Александр
    17 апреля 2016 г. в 22:04

    Спасибо! Очень классный скрипт !

  18. SurfRider
    31 марта 2017 г. в 11:33

    Что оставить только для реализации привью без data-slide-index?

  19. Дима
    30 мая 2018 г. в 14:55

    Если кому-то понадобиться генератор кода настроек bxslider то вот Вам ссылка http://www.hmil.ru/generator-bxslider/

  20. Bodo
    25 ноября 2018 г. в 00:49

    Добрый вечер использовал Ваш скрипт, но не понимаю как в превьюве сделать чтоб было больше картинок, всмысле добавляю картинки но они добовляются вторм рядом.

    1. 25 ноября 2018 г. в 09:44 / ответ на коммент Bodo

      Такое, к сожалению, не предусмотрено.

Ваш комментарий

Жирный текст

Ссылка

Цитата

Внутристрочный код

CSS-код

HTML-код

JavaScript-код

PHP-код