логотип PurpleSchool
логотип PurpleSchool

Использование Swiper для создания слайдеров в Vue

Автор

Олег Марков

Введение

Слайдеры давно стали неотъемлемой частью современных веб-приложений. Они позволяют лаконично и эффективно отображать галереи изображений, карусели отзывов, новостные ленты, анимации товаров и многое другое. Среди различных инструментов для создания слайдеров на фронтенде, библиотека Swiper выделяется богатым функционалом, гибкими настройками и отличной совместимостью с их интеграцией во Vue-приложения любого уровня сложности.

В этой статье я покажу вам, как использовать Swiper для создания слайдеров в Vue, обсудим основные методы и возможности библиотеки. Практические примеры, подробные комментарии и разбор решений популярных задач помогут вам внедрить Swiper в свои проекты быстро и без лишних сложностей.

Установка и подключение Swiper в проект Vue

Для начала рассмотрим, как подключить Swiper к вашему Vue-проекту. Допустим, у вас уже есть базовый проект Vue, например, созданный с помощью Vue CLI или Vite.

Установка пакета Swiper

Выполняем в терминале:

npm install swiper

или, если вы используете Yarn: bash yarn add swiper

Импорт стилей Swiper

Стили обязательно нужно добавить на уровень компонента или глобально в проекте. Обычно проще всего импортировать их непосредственно в компоненте или вашем основном файле стилей.

Например, в main.js или main.ts: js import 'swiper/swiper-bundle.css' // импорт основных стилей Swiper

Или если вы хотите подключить только базовые стили: js import 'swiper/css'

Интеграция Swiper во Vue-компонент

В версии Swiper 7+ специально для Vue2 и Vue3 предоставляются отдельные компоненты:

  • swiper/vue — для Vue 3
  • swiper/vue/swiper-vue — для Vue 2 (только для версии 6.x Swiper)

Сфокусируемся на Vue 3 (аналогичные действия выполняются для Vue 2, только синтаксис импортов чуть отличается).

Пример подключения компонентов:

<template>
  <Swiper
    :modules="[Navigation, Pagination]"
    :slides-per-view="1"
    :space-between="20"
    navigation
    pagination
  >
    <SwiperSlide v-for="(slide, idx) in slides" :key="idx">
      {{ slide.text }}
    </SwiperSlide>
  </Swiper>
</template>

<script setup>
import { Swiper, SwiperSlide } from 'swiper/vue'
import { Navigation, Pagination } from 'swiper'
// Не забудьте про стили!
import 'swiper/css'
import 'swiper/css/navigation'
import 'swiper/css/pagination'

const slides = [
  { text: 'Слайд 1' },
  { text: 'Слайд 2' },
  { text: 'Слайд 3' }
]
</script>

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

Основные возможности и методы Swiper

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

Навигация: стрелки и пагинация

Навигация добавляет стрелки вперед/назад, а пагинация — точки или прогресс-бар для обозначения текущего положения в слайдере.

<template>
  <Swiper
    :modules="[Navigation, Pagination]"
    navigation
    pagination
  >
    ...
  </Swiper>
</template>
  • navigation отвечает за добавление стрелок.
  • pagination — за точки-пагинаторы.

Swiper автоматически вставляет необходимые элементы стрелок и пагинации, если не настраивать их кастомно.

Автоматическое пролистывание (autoplay)

Если вам нужен автоматический показ слайдов с определенной задержкой (например, для промо-баннера или отзывов), включайте опцию autoplay.

<template>
  <Swiper
    :modules="[Autoplay, Pagination]"
    :autoplay="{ delay: 2500, disableOnInteraction: false }"
    pagination
  >
    ...
  </Swiper>
</template>

<script setup>
import { Swiper, SwiperSlide } from 'swiper/vue'
import { Autoplay, Pagination } from 'swiper'
import 'swiper/css'
import 'swiper/css/pagination'
</script>
  • delay — задержка между сменой слайдов, в миллисекундах.
  • disableOnInteraction — флаг: останавливаться ли автопрокрутке, если пользователь взаимодействовал со слайдером (полезно для интерактивных галерей).

Адаптивность: slidesPerView и breakpoints

Иногда требуется показывать разное количество слайдов на разных экранах (мобильные, планшеты, десктоп).

Swiper предлагает свойство breakpoints:

<Swiper
  :modules="[Navigation]"
  :slides-per-view="1"
  :breakpoints="{
    640: { slidesPerView: 2, spaceBetween: 10 },
    1024: { slidesPerView: 3, spaceBetween: 20 }
  }"
  navigation
>
  ...
</Swiper>

Здесь я показываю вам, как передать объект с ключами — это ширина окна в px, а значения — объект с настройками.

Ручное управление через события и методы

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

Работа с текущим слайдом

Вы можете повесить слушатель на событие slideChange:

<Swiper
  @slideChange="onSlideChange"
>
  ...
</Swiper>
function onSlideChange(swiper) {
  // swiper.activeIndex — индекс текущего слайда
  console.log('Новый активный слайд:', swiper.activeIndex)
}

Программное переключение слайдов

В Vue 3 отлично работают ссылки (ref) на компоненты. Давайте добавим пример:

<template>
  <Swiper ref="mySwiper">
    ...
  </Swiper>
  <button @click="slideToNext">Следующий слайд</button>
</template>

<script setup>
import { ref } from 'vue'
import { Swiper, SwiperSlide } from 'swiper/vue'
import 'swiper/css'

const mySwiper = ref(null)

function slideToNext() {
  // Переходим к следующему слайду
  mySwiper.value.swiper.slideNext()
}
</script>

Обратите внимание, что обращение к API происходит через ref.value.swiper.

Кастомизация контента слайдов

Вам не обязательно использовать только изображения — внутри <SwiperSlide> можно размещать любые компоненты или разметку. Например, карточки товаров, отзывы, формы.

<Swiper>
  <SwiperSlide>
    <ProductCard :data="product1" />
  </SwiperSlide>
  <SwiperSlide>
    <ProductCard :data="product2" />
  </SwiperSlide>
</Swiper>

Здесь <ProductCard> — ваш собственный компонент.

Асинхронная загрузка и динамические слайды

Если данные для слайдера приходят по API, вам не нужно хитро обновлять Swiper — достаточно передать им получившийся массив данных:

<Swiper>
  <SwiperSlide v-for="item in asyncSlides" :key="item.id">
    {{ item.text }}
  </SwiperSlide>
</Swiper>

Swiper корректно реагирует на изменение массива через reactivity Vue.

Ленивая загрузка изображений (lazy loading)

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

<Swiper
  :modules="[Lazy]"
  lazy="true"
>
  <SwiperSlide v-for="img in images" :key="img.id">
    <img
      :data-src="img.src" // используем data-src вместо src
      class="swiper-lazy"
      :alt="img.alt"
    />
    <div class="swiper-lazy-preloader"></div>
  </SwiperSlide>
</Swiper>
  • swiper-lazy — специальный css-класс для Swiper.
  • Обратите внимание, здесь указывается data-src, сам src не прописывается.

Глобальные и локальные стили для Swiper

Чтобы Swiper корректно отображался, ему нужны стили. Вы можете:

  • оставить стандартные стили (import 'swiper/css' и пр. в компоненте или main.js)
  • добавить свои стили для кастомизации стрелок, пагинации, скролл-баров

Пример стилизации кнопок навигации:

.swiper-button-next,
.swiper-button-prev {
  color: #2d5aef;  /* делаем стрелки синими */
  width: 40px;
  height: 40px;
  background: rgba(0,0,0,.1);
  border-radius: 50%;
}

Продвинутые возможности Swiper во Vue

Swiper умеет больше, чем кажется на первый взгляд. Посмотрим, как добавить необычные эффекты, адаптировать под SSR и создать уникальный пользовательский опыт.

Эффекты переходов между слайдами

Вы можете выбрать эффект перелистывания: fade, cube, coverflow, flip и другие.

Пример fade-эффекта:

<Swiper
  :modules="[EffectFade]"
  effect="fade"
  :fadeEffect="{ crossFade: true }"
>
  ...
</Swiper>

Не забудьте подключить css стили (import 'swiper/css/effect-fade').

Два слайдера, связанные между собой

Swiper позволяет делать синхронизированные слайдеры, например, один для главного изображения, второй — превью.

<template>
  <Swiper
    ref="galleryTop"
    :modules="[Thumbs]"
    :thumbs="{ swiper: galleryThumbs }"
  >
    <SwiperSlide v-for="img in images" :key="img.id">
      <img :src="img.src" />
    </SwiperSlide>
  </Swiper>
  <Swiper
    ref="galleryThumbs"
    :modules="[Thumbs]"
    :slides-per-view="4"
    watch-slides-progress
  >
    <SwiperSlide v-for="img in images" :key="img.id">
      <img :src="img.thumb" />
    </SwiperSlide>
  </Swiper>
</template>

<script setup>
import { ref } from 'vue'
import { Swiper, SwiperSlide } from 'swiper/vue'
import { Thumbs } from 'swiper'
import 'swiper/css'
import 'swiper/css/thumbs'

const galleryTop = ref(null)
const galleryThumbs = ref(null)
const images = [
  { id: 1, src: 'big1.jpg', thumb: 'thumb1.jpg' },
  { id: 2, src: 'big2.jpg', thumb: 'thumb2.jpg' }
]
</script>

Использование с SSR (Nuxt, Vue + SSR)

Чтобы избежать ошибок на стороне сервера (когда нет объекта window), оборачивайте инициализацию Swiper в проверку наличия window или рендерите Swiper только на клиенте:

<template>
  <ClientOnly>
    <Swiper ... />
  </ClientOnly>
</template>

Где <ClientOnly> — компонент Nuxt или аналогичный компонент для вашего SSR фреймворка. Это предотвратит проблемы несоответствия html между сервером и клиентом.

Динамическое управление параметрами

Настройки слайдера можно делать реактивными:

<script setup>
import { ref, watch } from 'vue'
// ...
const slidesPerView = ref(1)
watch(windowWidth, newVal => {
  slidesPerView.value = newVal > 900 ? 3 : 1
})
</script>

<Swiper :slides-per-view="slidesPerView" ...>
  ...
</Swiper>

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

Заключение

Использование Swiper во Vue-проектах — это удобный способ добавить современные, адаптивные и производительные слайдеры с множеством кастомизаций. Библиотека отлично вписывается как в малы проекты, так и в крупные корпоративные интерфейсы. Ее простой API, масса событий и продвинутых настроек позволят создать слайдер под любые нужды: от элементарной галереи до сложных интерактивных блоков. Рекомендую изучить документацию Swiper для более глубокой кастомизации и изучить дополнительные модули для расширения возможностей слайдера в Vue.

Частозадаваемые технические вопросы по теме статьи и ответы на них

Как избавиться от ошибки "Can't find variable: window" при использовании Swiper с SSR?

Эта ошибка возникает из-за попытки использовать Swiper на сервере, где объект window отсутствует. Решение: используйте Swiper только на клиенте, обернув компонент в <client-only> (Nuxt) или аналогичный компонент своего фреймворка, чтобы слайдер рендерился только в браузере.

Как сделать кастомные кнопки навигации, а не стандартные от Swiper?

Вы можете рендерить свои элементы-кнопки вне слайдера и передавать в Swiper ссылки на них через параметры navigation: { nextEl, prevEl }. Для этого добавьте свои кнопки в шаблон, присвойте им классы или ref, затем используйте соответствующие параметры в компоненте Swiper.

Почему слайды Swiper не обновляются после изменения данных во Vue?

Если вы асинхронно обновляете массив слайдов, Swiper может не зафиксировать изменения. Решение: убедитесь, что массив слайдов меняется реактивно (v-for с ключами), и используйте метод Swiper swiper.update(), вызываемый через ref вручную после изменения данных (к примеру, после загрузки изображений асинхронно).

Как подгрузить больше слайдов при прокрутке пользователя (бесконечная прокрутка / infinite scroll)?

Вы можете использовать событие reachEnd Swiper, чтобы по достижении конца подгрузить новые данные:
js function onReachEnd() { // Асинхронно добавьте новые данные в массив слайдов } Просто подпишитесь на это событие через @reachEnd="onReachEnd" в Swiper.

Можно ли использовать Swiper со сторонними UI библиотеками (например, Vuetify, Element Plus)?

Да, Swiper отлично работает с любыми UI-библиотеками, если вы размещаете его внутри их компонентов/гридов. Главное, не забывайте добавлять стили Swiper после стилей сторонней библиотеки, чтобы не возникало конфликтов CSS. Также учитывайте, что для корректной работы модулей и кастомных кнопок, возможно потребуется ручная интеграция (как указано выше).

Стрелочка влевоИспользование шаблонов в Vue js для построения интерфейсовРабота со стилями и стилизацией в VueСтрелочка вправо

Все гайды по Vue

Руководство по валидации форм во Vue.jsИнтеграция Tiptap для создания редакторов на VueИнструкция по установке и компонентам Vue sliderРабота с таблицами во Vue через TanStackУправление пакетами Vue js с помощью npmУправление пакетами и node modules в Vue проектахКак использовать meta для улучшения SEO на VueПолный гайд по компоненту messages во Vuejs5 правил использования Inertia с Vue и LaravelРабота с модулями и пакетами в VueИнструкция по работе с grid на VueGithub для Vue проектов - подробная инструкция по хранению и совместной работеНастройка ESLint для Vue проектов и поддержка качества кодаОбработка ошибок и отладка в Vue.jsИспользование Vue Devtools для отладки и мониторинга приложенийРабота с конфигурационными файлами и скриптами VueСоздание и настройка проектов Vue с помощью Vue CLI3 способа интеграции Chart.js с Vue для создания графиковРабота с Canvas во VueИнструкция по реализации календаря во VueРабота с Ant Design Vue для создания UI на Vue
Обзор и использование утилит Vue для удобной разработкиРабота с обновлениями компонента и жизненным циклом updateРазрешение конфликтов и ошибок с помощью Vue resolveИспользование query-параметров и их обработка в маршрутах VueЗагрузка и управление состоянием загрузки в VueИспользование библиотек Vue для расширения функционалаРабота с JSON данными в приложениях VueКак работать с экземплярами компонента Instance во VueПолучение данных и API-запросы во Vue.jsЭкспорт и импорт данных и компонентов в VueОбработка событий и их передача между компонентами VuejsГайд по defineEmits на Vue 3Понимание core функционала Vue и его применениеПонимание и применение Composition API в Vue 3Понимание и работа с компилятором VueКогда и как использовать $emit и call во VueВзаимодействие с внешними API через Axios в Vue
Веб приложения на Vue архитектура и лучшие практикиИспользование Vite для быстрого старта и сборки проектов на Vue 3Работа с URL и ссылками в приложениях на VueРабота с пользовательскими интерфейсами и UI библиотеками во VueОрганизация и структура исходных файлов в проектах VueИспользование Quasar Framework для разработки на Vue с готовыми UI-компонентамиОбзор популярных шаблонов и стартовых проектов на VueИнтеграция Vue с PHP для создания динамичных веб-приложенийКак организовать страницы и маршруты в проекте на VueNuxt JS и Vue 3 для SSR приложенийСоздание серверных приложений на Vue с помощью Nuxt jsИспользование Vue Native для разработки мобильных приложенийОрганизация и управление индексной страницей в проектах VueИспользование Docker для контейнеризации приложений на VueИнтеграция Vue.js с Django для создания полноценных веб-приложенийСоздание и работа с дистрибутивом build dist Vue приложенийРабота со стилями и CSS в Vue js для красивых интерфейсовСоздание и структурирование Vue.js приложенияКак исправить ошибку cannot find module vueНастройка и сборка проектов Vue с использованием современных инструментовИнтеграция Vue с Bitrix для корпоративных решенийРазработка административных панелей на Vue js
5 библиотек для создания tree view во VueИнтеграция Tailwind CSS с Vue для современных интерфейсовИнтеграция Vue с серверной частью и HTTPS настройкамиКак обрабатывать async операции с Promise во VueИнтеграция Node.js и Vue.js для разработки приложенийРуководство по интеграции Vue js в NET проектыПримеры использования JSX во VueГайд по импорту и регистрации компонентов на VueМногоязычные приложения на Vue с i18nИнтеграция FLIR данных с Vue5 примеров использования filter во Vue для упрощения разработки3 примера реализации drag-and-drop во Vue
Управление переменными и реактивными свойствами во VueИспользование v for и slot в VueПрименение v-bind для динамической привязки атрибутов в VueУправление пользователями и их данными в Vue приложенияхСоздание и использование UI Kit для Vue приложенийТипизация и использование TypeScript в VuejsИспользование шаблонов в Vue js для построения интерфейсовИспользование Swiper для создания слайдеров в VueРабота со стилями и стилизацией в VueСтруктура и особенности Single File Components SFC в VueРабота со SCSS в проектах на Vue для стилизацииРабота со скроллингом и прокруткой в Vue приложенияхПрименение script setup синтаксиса в Vue 3 для упрощения компонентовИспользование scoped стилей для изоляции CSS в компонентах Vue3 способа улучшить навигацию Vue с push()Обработка запросов и асинхронных операций в VueПонимание и использование provide inject для передачи данных между компонентамиПередача и использование props в Vue 3 для взаимодействия компонентовПередача данных между компонентами с помощью props в Vue jsУправление property и функциями во Vue.jsРабота со свойствами компонентов VueУправление параметрами и динамическими данными во VueРабота с lifecycle-хуком onMounted во VueОсновы работы с объектами в VueПонимание жизненного цикла компонента Vue js на примере mountedИспользование модальных окон modal в Vue приложенияхИспользование методов в компонентах Vue для обработки логикиИспользование метода map в Vue для обработки массивовИспользование хуков жизненного цикла Vue для управления состоянием компонентаРабота с ключами key в списках и компонентах VueОбработка пользовательского ввода в Vue.jsРабота с изображениями и их оптимизация в VueИспользование хуков жизненного цикла в VueОрганизация сеток и гридов для верстки интерфейсов на VueСоздание и управление формами в VueОрганизация файлов и структура проекта Vue.jsКомпоненты Vue создание передача данных события и emitРабота с динамическими компонентами и данными в Vue3 способа манипулирования DOM на VueРуководство по div во VueИспользование директив в Vue и их расширенные возможностиОсновы и применение директив в VueИспользование директив и их особенности на Vue с помощью defineИспользование компонентов datepicker в Vue для выбора датОрганизация циклов и итераций во VueКак работает компиляция Vue CoreСоздание и использование компонентов в Vue JSОбработка кликов и пользовательских событий в VueИспользование классов в Vue для организации кода и компонентовИспользование директивы checked для управления состоянием чекбоксов в VueГайд на checkbox компонент во VueОтображение данных в виде графиков с помощью Vue ChartСоздание и настройка кнопок в VueСоздание и настройка кнопок в Vue приложенияхРабота с lifecycle-хуками beforeCreate и beforeMount во VueИспользование массивов и методов их обработки в VueИспользование массивов и их обработка в Vue
Использование Vuetify для создания современных интерфейсов на VueИспользование transition во VueТестирование компонентов и приложений на VueРабота с teleport для управления DOM во VueПять шагов по настройке SSR в VuejsИспользование Shadcn UI компонентов с Vue для продвинутых интерфейсовИспользование router-link для навигации в Vue RouterКак использовать require в Vue для динамического импорта модулейРабота с динамическим рендерингом и виртуальным DOM на Vue.jsИспользование ref для управления ссылками и реактивностью в Vue 3Использование Vue Pro и его преимущества для профессиональной разработкиРуководство по nextTick для работы с DOMСоздание и использование компонентов с помощью Vue js и CУправление состоянием и реактивностью через inject и provideДинамическое обновление компонентов и данных на VueГлубокое изучение документации Vue и как эффективно её использоватьИспользование Crystal с Vue для разработкиИспользование вычисляемых свойств для динамического отображения данных на Vue jsОптимизация производительности и предупреждения в Vue
Открыть базу знаний