Библиотека Swiper для создания слайдеров (swiper js)

Раздел: Веб-разработка -> Библиотеки для слайдеров

Библиотека Swiper для слайдеров (swiper js)

Swiper

Это современная библиотека для создания адаптивных, touch-friendly слайдеров и каруселей. Основное преимущество - модульная архитектура, широкая поддержка браузеров и простота интеграции. Библиотека работает как с CSS-трансформациями, так и с GPU-ускорением, обеспечивая плавность анимаций на мобильных устройствах.

Базовый слайдер создаётся за несколько шагов: подключение CSS и JS файлов, разметка HTML с контейнерами swiper-container и swiper-slide, инициализация new Swiper('.swiper-container', { ... }).

// Подключение в HTML:

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.css" />


<script src="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.js"></script>


<div class="swiper-container">
  <div class="swiper-wrapper">
    <div class="swiper-slide">Слайд 1</div>
    <div class="swiper-slide">Слайд 2</div>
    <div class="swiper-slide">Слайд 3</div>
  </div>
</div>

<script>
  const swiper = new Swiper('.swiper-container', {
    // Основные параметры
    slidesPerView: 1,
    spaceBetween: 10,
    loop: true,
  });
</script>

Swiper js (библиотека swiper для слайдеров)

Цель использования базового решения

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

Как добавить навигационные стрелки и пагинацию?

Для управления слайдером визуально используются модули Navigation и Pagination. Они активируются через параметры navigation и pagination в конфигурации.

<div class="swiper-container">
  <div class="swiper-wrapper">
    <div class="swiper-slide">Слайд 1</div>
    <div class="swiper-slide">Слайд 2</div>
  </div>
  <div class="swiper-pagination"></div>
  <div class="swiper-button-prev"></div>
  <div class="swiper-button-next"></div>
</div>

<script>
  new Swiper('.swiper-container', {
    pagination: {
      el: '.swiper-pagination',
      clickable: true,
    },
    navigation: {
      nextEl: '.swiper-button-next',
      prevEl: '.swiper-button-prev',
    },
  });
</script>

Типичная ошибка

Если стрелки или пагинация не отображаются, проверьте, что HTML-элементы с классами swiper-pagination и swiper-button-prev/next присутствуют в разметке. Также убедитесь, что не пропущен модуль Navigation или Pagination при сборке через ES-модули.

Как сделать автоматическую прокрутку слайдов?

Автопрокрутка (автоплей) реализуется с помощью модуля Autoplay. В конфигурации добавляется параметр autoplay с задержкой в миллисекундах.

new Swiper('.swiper-container', {
  autoplay: {
    delay: 3000,
    disableOnInteraction: false, // автоплей не останавливается при взаимодействии
  },
});

Проблема

Автоплей может не работать, если библиотека инициализируется до загрузки всех слайдов (например, изображений). Решение: обернуть инициализацию в window.onload или использовать updateOnImagesReady: true.

Как адаптировать слайдер под разные разрешения экрана?

Swiper поддерживает респонсивные настройки через параметр breakpoints. Это позволяет менять количество видимых слайдов, отступы и другие опции в зависимости от ширины окна.

new Swiper('.swiper-container', {
  slidesPerView: 1,
  spaceBetween: 10,
  breakpoints: {
    640: {
      slidesPerView: 2,
      spaceBetween: 20,
    },
    1024: {
      slidesPerView: 3,
      spaceBetween: 30,
    },
  },
});

Как использовать эффекты перелистывания, куба или переворота?

Swiper включает модуль Effect. По умолчанию используется slide, но можно применить fade, cube, coverflow, flip и cards. Эффект задаётся в параметре effect.

new Swiper('.swiper-container', {
  effect: 'cube',
  cube: {
    slideShadows: true,
    shadow: true,
    shadowOffset: 20,
    shadowScale: 0.94,
  },
});

Ошибка

При эффекте cube может пропадать вертикальная прокрутка страницы (залипание). Решение: установить touchStartPreventDefault: false или использовать watchOverflow: true.

Как создать слайдер с динамически добавляемыми слайдами?

Используется метод swiper.appendSlide() или swiper.prependSlide(). Полезно для ленивой загрузки контента или подгрузки по мере необходимости.

const swiper = new Swiper('.swiper-container', { ... });

// Добавление слайда в конец
swiper.appendSlide('<div class="swiper-slide">Новый слайд</div>');

// Добавление в начало
swiper.prependSlide('<div class="swiper-slide">Слайд в начало</div>');

// Удаление последнего слайда
swiper.removeSlide(swiper.slides.length - 1);

Проблема

После динамического добавления слайдов могут нарушиться вычисления размеров (особенно при loop: true). Рекомендуется после изменения вызывать swiper.update().

Как синхронизировать два слайдера (например, один показывает миниатюры)?

Используется параметр thumbs, который привязывает один Swiper как дочерний контроллер для другого.

<!-- Основной слайдер -->
<div class="swiper-main"> ... </div>
<!-- Слайдер миниатюр -->
<div class="swiper-thumbs"> ... </div>

<script>
  const thumbsSwiper = new Swiper('.swiper-thumbs', {
    spaceBetween: 10,
    slidesPerView: 4,
    freeMode: true,
    watchSlidesProgress: true,
  });
  const mainSwiper = new Swiper('.swiper-main', {
    thumbs: {
      swiper: thumbsSwiper,
    },
  });
</script>

Ошибка

Если миниатюры не переключаются вместе с основным слайдером, возможно, не указаны параметры watchSlidesProgress: true и freeMode: true в дочернем слайдере.

Расширенные примеры использования Swiper

Пример 1: Lazy loading изображений

Подгружает изображения только при приближении к текущему слайду. Используется модуль Lazy.

Пример
<div class="swiper-container">
  <div class="swiper-wrapper">
    <div class="swiper-slide">
      <img data-src="https://picsum.photos/800/400?random=1" class="swiper-lazy" />
      <div class="swiper-lazy-preloader"></div>
    </div>
    <div class="swiper-slide">
      <img data-src="https://picsum.photos/800/400?random=2" class="swiper-lazy" />
    </div>
  </div>
</div>

<script>
  new Swiper('.swiper-container', {
    lazy: true,
  });
</script>
Результат: изображения загружаются только когда слайд становится видимым или приближается к нему.

Пример 2: Слайдер с параллакс-эффектом

Движение элементов внутри слайда с разной скоростью при перелистывании. Требует наличие data-атрибутов и включенного модуля Parallax.

Пример
<div class="swiper-container" data-parallax="-300">
  <div class="swiper-wrapper">
    <div class="swiper-slide">
      <div class="slide-content" data-swiper-parallax="-400">Текст смещается на 400px</div>
      <img src="bg.jpg" data-swiper-parallax="-200" />
    </div>
  </div>
</div>

<script>
  new Swiper('.swiper-container', {
    parallax: true,
  });
</script>
Результат: при свайпе элементы движутся с разной скоростью, создавая глубину.

Пример 3: Вертикальный слайдер

Направление прокрутки задается параметром direction: 'vertical'. Полезен для полноэкранных секций.

Пример
new Swiper('.swiper-container', {
  direction: 'vertical',
  slidesPerView: 1,
  mousewheel: true, // листать колёсиком мыши
});
Результат: слайды сменяются по вертикали, как scroll-анимация.

Пример 4: Кастомная пагинация в виде прогресс-бара

Можно переопределить стандартную пагинацию кастомным элементом и обновлять его через событие slideChange.

Пример
<div class="swiper-container">
  <div class="swiper-wrapper">...</div>
  <div class="custom-progress"></div>
</div>

<style>
  .custom-progress {
    height: 4px;
    background: #e0e0e0;
    position: relative;
  }
  .custom-progress .bar {
    height: 100%;
    background: #007aff;
    width: 0%;
    transition: width 0.3s;
  }
</style>

<script>
  const swiper = new Swiper('.swiper-container', {
    on: {
      init() {
        const bar = document.createElement('div');
        bar.className = 'bar';
        document.querySelector('.custom-progress').appendChild(bar);
        this.updateProgress();
      },
      slideChange() {
        this.updateProgress();
      }
    },
    updateProgress() {
      const progress = (this.activeIndex + 1) / this.slides.length * 100;
      document.querySelector('.custom-progress .bar').style.width = progress + '%';
    }
  });
</script>
Результат: пагинация отображается как заполняющийся прогресс-бар.

Пример 5: Бесконечная карусель с loop и freemode

Режим freeMode: true позволяет прокручивать с инерцией, а loop: true зацикливает слайды.

Пример
new Swiper('.swiper-container', {
  loop: true,
  freeMode: true,
  slidesPerView: 'auto',
  centeredSlides: true,
  spaceBetween: 20,
});
Результат: пользователь может перелистывать много слайдов подряд, и слайды будут двигаться с инерцией.

Пример 6: Синхронизация с внешними кнопками

Методы swiper.slideNext() и swiper.slidePrev() можно привязать к любым элементам.

Пример
<button id="prev">Назад</button>
<button id="next">Вперёд</button>

<script>
  const swiper = new Swiper('.swiper-container', { ... });
  document.getElementById('prev').addEventListener('click', () => swiper.slidePrev());
  document.getElementById('next').addEventListener('click', () => swiper.slideNext());
</script>
Результат: внешние кнопки управляют слайдером.

Библиотека Swiper для слайдеров - comments

En
Swiper js (javascript)