Embla vs Swiper: выбирайте по тому, что вы создаёте

Оба — отличные, активно поддерживаемые карусельные движки, и выбор между ними действительно непростой. Всё сводится к одной оси: Swiper поставляет все возможности встроенными; Embla поставляет небольшой headless-движок, на котором вы строите своё. Эту страницу написал мейнтейнер библиотеки, которая не конкурирует ни с одним из них — она же и есть третий ответ внизу, для случаев, когда «карусель» на самом деле вовсе не карусель.

EmblaSwiper
Что это такоеHeadless-движок каруселиПолноценный фреймворк слайдера/карусели
Размер (ядро, min+gzip)≈8 kB≈40 kB (растёт с модулями)
Стилизация и разметкаПолностью ваша — ничего не поставляетсяСобственная DOM-структура и CSS, с темизацией
Эффекты (fade, cube, coverflow…)Плагины сообщества или самостоятельноВстроены, зрелые
Автовоспроизведение, пагинация, миниатюрыОфициальные плагиныВстроенные модули
Интеграция с ReactПолноценный хук (useEmblaCarousel)Компоненты-обёртки над vanilla-ядром
Заметка об экосистемеДвижок под капотом карусели shadcn/uiСамый используемый слайдер в вебе
Лучше всего дляКаруселей с индивидуальным дизайном, дизайн-системСлайдеров с акцентом на изображения, насыщенных функциями галерей

Размеры бандлов приведены для ядра приблизительно — актуальные цифры смотрите на bundlephobia; у Swiper размер растёт с импортируемыми модулями.

Выбирайте Embla, когда важен контроль над дизайном

Embla даёт вам физику прилипания, обработку перетаскивания и модель слайдов — и ничего больше: ни разметки, ни CSS, ни стрелок. В этом её сила: в дизайн-системе всё видимое — ваше, и движок никогда не спорит с вашими стилями. Именно на ней shadcn/ui строит свою карусель, что подсказывает золотую середину: команды, которым нужна карусель, выглядящая как их продукт, а не как карусельная библиотека.

Плата за это в том, что любая функция сверх скольжения — это дополнение или написанный вручную код: автовоспроизведение и имена классов — официальные плагины; точки пагинации, миниатюры и эффекты придётся писать самим.

Выбирайте Swiper, когда нужны готовые функции

Swiper — это ответ в духе «всё включено»: эффекты fade, cube и coverflow, виртуальные слайды, зум, параллакс, галереи миниатюр, модуль a11y, пагинация в нескольких стилях — всё настраивается, а не пишется. Если вашему продукту в этом квартале нужны три из этих функций, Swiper многократно окупает свой размер.

Плата — обратная той, что у Embla: вы наследуете DOM Swiper, его CSS для темизации и vanilla-JS-ядро, обёрнутое для React — тяжелее и в килобайтах, и по площади поверхности API.

Вопрос, который стоит задать перед выбором любого из них

Обе библиотеки исходят из того, что вы показываете слайды — одну вещь или одну страницу вещей за раз, с прилипанием и ощущением позиции. Значительная доля реальных «каруселей» устроена совсем иначе: ряды категорий, полосы логотипов, панели вкладок, фильтры-чипы — ряды кликабельных элементов, которые пользователь просматривает и из которых выбирает. Для них нужна нативная прокрутка (инерция, полоса прокрутки, колесо мыши, доступность — бесплатно) плюс знание того, какие элементы на экране, — а ни Embla, ни Swiper не моделируют видимость по элементам, потому что слайды — не элементы.

Для такой формы есть третий вариант: react-horizontal-scrolling-menu (≈5.7 kB) использует нативную прокрутку и предоставляет useIsVisible, scrollToItem и стрелки, учитывающие края. Посмотрите на него как на ряд в стиле Netflix, панель вкладок или панель чипов, либо загляните в полную сравнительную таблицу против обоих движков.