Carousel hay menu cuộn? Một so sánh trung thực

Swiper, Embla, keen-slider và react-slick là các engine carousel: chúng triển khai lại việc cuộn bằng JavaScript để có ngữ nghĩa slide, vật lý snap và các hiệu ứng. react-horizontal-scrolling-menu không nằm trong số đó — nó dùng cuộn gốc của trình duyệt và thêm theo dõi khả năng hiển thị theo từng mục. Bạn muốn cái nào phụ thuộc vào việc bạn đang xây gì; và với một phần thực tế việc dùng carousel, câu trả lời trung thực là: suốt thời gian qua bạn đang xây một menu.

thư viện nàySwiperEmblakeen-sliderreact-slick
Nó là gìMenu cuộn với theo dõi khả năng hiển thịFramework slider/carousel đầy đủEngine carousel headlessEngine slider độc lập với frameworkBản port React của slider slick của jQuery
Engine cuộnCuộn gốc của trình duyệtBiến đổi JS + vật lýBiến đổi JS + vật lýBiến đổi JS + vật lýBiến đổi JS (chuyển tiếp CSS)
Bundle (lõi, min+gzip)≈5.7 kB≈40 kB≈8 kB≈7 kB≈15 kB + slick CSS
Mục nào đang trên màn hìnhCó sẵn — useIsVisible theo từng mụcDựa trên chỉ số slideSự kiện chỉ số slideSự kiện chỉ số slideDựa trên chỉ số slide
Snap, hiệu ứng, vật lýKhông — cố ýPhong phú (fade, cube, coverflow…)Dựa trên plugin, có tweenCó, bao gồm chế độ tự doFade, chế độ căn giữa
Vòng lặp / tự phátRecipe trên API công khaiProps có sẵnPluginTùy chọn có sẵnProps có sẵn
Thanh cuộn, con lăn, focus bàn phímGốc — miễn phí từ trình duyệtMô phỏng / module chọn tham giaTự làm (headless)Tự làmHạn chế
Phù hợp nhất choHàng danh mục, dải tab, bộ lọc chipSlider toàn màn hình, thư viện ảnhCarousel tùy chỉnh (mặc định của shadcn)Slider tùy chỉnh tối giảnDi chuyển từ slick cũ

Kích thước bundle là phần lõi xấp xỉ — hãy kiểm tra bundlephobia để lấy con số hiện tại trước khi quyết định chỉ dựa trên kích thước.

Trước tiên, câu hỏi thực sự

Một carousel trình bày các slide: một thứ (hoặc một trang các thứ) tại một thời điểm, với snap, hiệu ứng và cảm giác «vị trí 3 trên 8». Một menu trình bày một hàng mà người dùng quét qua và chọn: một ray danh mục, một dải tab, một thanh chip. Carousel muốn ngữ nghĩa slide; menu muốn cuộn gốc — quán tính, thanh cuộn, con lăn, cảm ứng và focus bàn phím hoạt động đúng như phần còn lại của trang — cộng với thứ trình duyệt không cho bạn: biết mục nào đang trên màn hình.

Nếu bạn đang xây một slider ảnh toàn màn hình, một gallery hero, hay bất cứ thứ gì có vật lý snap đến slide, hãy dùng một thư viện carousel — Embla hay Swiper đều xuất sắc. Trang này tồn tại cho trường hợp còn lại, trường hợp mà mọi FAQ về carousel đều lặng lẽ bỏ qua: các hàng thứ có thể bấm mà chưa bao giờ thực sự là slide.

đấu với Swiper

Swiper là framework slider đầy đủ nhất hiện có: hiệu ứng (fade, cube, coverflow), slide ảo, zoom, parallax, phân trang và một hệ sinh thái trưởng thành. ≈40 kB của nó xứng đáng khi bạn dùng thứ nó cung cấp. Nó triển khai lại việc cuộn bằng biến đổi, nên thanh cuộn gốc, hành vi con lăn và khả năng tiếp cận khi cuộn là các mô phỏng bạn cấu hình, chứ không phải mặc định bạn thừa hưởng.

đấu với Embla

Embla là một engine carousel headless với vật lý đẹp và một adapter React hạng nhất — đó là thứ shadcn/ui xây carousel của mình trên đó, và là mặc định đúng khi bạn muốn kiểm soát trực quan đầy đủ một carousel thực sự. Headless là con dao hai lưỡi với menu: cuộn-đến-view khi chọn, khả năng hiển thị theo từng mục, vô hiệu hóa mũi tên và quản lý focus đều là của bạn để tự xây.

đấu với keen-slider

keen-slider là một engine slider gọn nhẹ, độc lập với framework — một lựa chọn tốt cho các slider tùy chỉnh tối giản khi bạn muốn một dependency duy nhất xuyên suốt các framework. Như những cái khác, nó sở hữu lớp cử chỉ bằng biến đổi, và API của nó được định hình theo chỉ số slide: ổn cho slide, gượng gạo cho «cuộn chip đang chọn vào view và cho tôi biết cái gì đang hiển thị».

đấu với react-slick

react-slick chuyển carousel slick thời jQuery sang React. Nó vẫn hoạt động, nhưng kéo theo một file CSS riêng, kiến trúc có trước hooks và việc bảo trì thưa thớt. Các đội rời bỏ nó thường rơi vào hai phe: carousel thực sự (chuyển sang Embla hoặc Swiper) — và các hàng điều hướng bị bẻ vào centerMode vì slick đã được cài sẵn. Phe thứ hai chính là hình dạng của thư viện này: chọn căn giữa, tiến từng mụckéo để cuộn mà không cần engine slider.

Phía menu trông như thế nào

Mọi pattern trên trang này đều trực tiếp và được render trên server, mỗi cái có nguồn đầy đủ: tab cuộn được, chip bộ lọc, hàng tải thêm và — hai tính năng mà người ta cho là cần engine carousel — vòng lặp vô hạntự phát, mỗi cái khoảng sáu mươi dòng trên API công khai.