Карусель или меню прокрутки? Честное сравнение

Swiper, Embla, keen-slider и react-slick — это движки каруселей: они заново реализуют прокрутку на JavaScript, чтобы получить семантику слайдов, физику снапа и эффекты. react-horizontal-scrolling-menu не из их числа — он едет на нативной прокрутке браузера и добавляет отслеживание видимости каждого элемента. Что вам нужно, зависит от того, что вы строите; и для заметной доли использования каруселей честный ответ таков: всё это время вы строили меню.

эта библиотекаSwiperEmblakeen-sliderreact-slick
Что этоМеню прокрутки с отслеживанием видимостиПолноценный фреймворк слайдера/каруселиHeadless-движок каруселиНе зависящий от фреймворка движок слайдераПорт jQuery-слайдера slick на React
Движок прокруткиНативная прокрутка браузераJS-трансформации + физикаJS-трансформации + физикаJS-трансформации + физикаJS-трансформации (CSS-переходы)
Бандл (ядро, min+gzip)≈5,7 КБ≈40 КБ≈8 КБ≈7 КБ≈15 КБ + slick CSS
Какие элементы на экранеВстроено — useIsVisible по элементамНа основе индекса слайдаСобытия индекса слайдаСобытия индекса слайдаНа основе индекса слайда
Снап, эффекты, физикаНет — намеренноБогато (fade, cube, coverflow…)На основе плагинов, с твиномЕсть, включая свободный режимFade, режим по центру
Цикл / автовоспроизведениеРецепты на публичном APIВстроенные пропыПлагиныВстроенные опцииВстроенные пропы
Полоса прокрутки, колесо, фокус клавиатурыНативно — бесплатно из браузераЭмуляция / модули по подпискеСвоими руками (headless)Своими рукамиОграниченно
Лучше всего дляСтрок категорий, вкладок, чип-фильтровПолноэкранных слайдеров, галерейКастомных каруселей (дефолт shadcn)Минималистичных кастомных слайдеровМиграции с устаревшего slick

Размеры бандлов — приблизительные ядра; прежде чем решать по одному размеру, сверьтесь с bundlephobia.

Сначала — настоящий вопрос

Карусель показывает слайды: одну вещь (или одну страницу вещей) за раз, со снапом, эффектами и ощущением «позиция 3 из 8». Меню показывает ряд, который пользователь просматривает и из которого выбирает: строку категорий, полосу вкладок, бар чипов. Каруселям нужна семантика слайдов; меню — нативная прокрутка — инерция, полоса прокрутки, колесо, касание и фокус клавиатуры, ведущие себя ровно как на остальной странице, — плюс то, чего браузер не даёт: знание, какие элементы на экране.

Если вы строите полноэкранный слайдер изображений, хиро-галерею или что-то с физикой снапа к слайду, используйте карусельную библиотеку — Embla или Swiper превосходны. Эта страница существует для другого случая, который каждый FAQ по каруселям тихо игнорирует: ряды кликабельных вещей, которые никогда не были слайдами.

против Swiper

Swiper — самый полный существующий фреймворк слайдеров: эффекты (fade, cube, coverflow), виртуальные слайды, зум, параллакс, пагинация и зрелая экосистема. Его ≈40 КБ окупаются, когда вы используете то, что он поставляет. Он заново реализует прокрутку трансформациями, так что нативная полоса прокрутки, поведение колеса и доступность прокрутки — это эмуляции, которые вы настраиваете, а не дефолты, которые наследуете.

против Embla

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

против keen-slider

keen-slider — компактный, не зависящий от фреймворка движок слайдера, хороший выбор для минималистичных кастомных слайдеров, когда нужна одна зависимость на все фреймворки. Как и остальные, он владеет слоем жестов через трансформации, а его API заточен под индекс слайда: для слайдов хорошо, а для «прокрути выбранный чип в видимость и скажи, что видно» — неловко.

против react-slick

react-slick переносит карусель slick эпохи jQuery на React. Он всё ещё работает, но тащит за собой отдельный CSS-файл, его архитектура старше хуков, а поддержка редка. Команды, уходящие с него, обычно делятся на два лагеря: настоящие карусели (к Embla или Swiper) — и навигационные ряды, которые вогнали в centerMode лишь потому, что slick уже был установлен. Второй лагерь — это в точности форма этой библиотеки: выбор по центру, шаг в один элемент и перетаскивание для прокрутки без движка слайдера.

Как выглядит сторона меню

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