Библиотека 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>Результат: внешние кнопки управляют слайдером.