flickity, slick-carousel, and swiper are JavaScript libraries used to create touch-friendly sliders and carousels. swiper is a modern, feature-rich library with official framework components. flickity focuses on simplicity and touch interactions without heavy dependencies. slick-carousel is a legacy option that relies on jQuery and is no longer actively maintained.
Creating sliding content interfaces is a common requirement in web development. flickity, slick-carousel, and swiper all solve this problem, but they differ significantly in architecture, dependencies, and long-term viability. Let's examine how they handle initialization, framework integration, and control.
slick-carousel relies on jQuery.
// slick-carousel: Requires jQuery
$('.your-slider').slick({
infinite: true,
slidesToShow: 3
});
flickity is vanilla JavaScript.
// flickity: Vanilla JS
import Flickity from 'flickity';
const carousel = new Flickity('.carousel', {
cellAlign: 'left',
contain: true
});
swiper is also vanilla JavaScript but modular.
// swiper: Modular Vanilla JS
import Swiper from 'swiper';
import { Navigation, Pagination } from 'swiper/modules';
const swiper = new Swiper('.swiper', {
modules: [Navigation, Pagination],
slidesPerView: 3
});
slick-carousel uses community wrappers.
react-slick.// slick-carousel: React wrapper
import Slider from "react-slick";
function SimpleSlider() {
return <Slider {...settings}>{items}</Slider>;
}
flickity uses community wrappers.
react-flickity-component exist — they manage the instance lifecycle.// flickity: React wrapper
import Flickity from 'react-flickity-component';
function Carousel() {
return <Flickity options={{ wrapAround: true }}>{items}</Flickity>;
}
swiper offers official components.
// swiper: Official React components
import { Swiper, SwiperSlide } from 'swiper/react';
function Carousel() {
return (
<Swiper slidesPerView={3}>
{items.map(item => <SwiperSlide key={item.id}>{item}</SwiperSlide>)}
</Swiper>
);
}
slick-carousel uses jQuery methods.
// slick-carousel: Method call
$('.your-slider').slick('slickNext');
flickity uses instance methods.
// flickity: Method call
carousel.selectCell(2);
swiper uses instance methods.
// swiper: Method call
swiper.slideNext();
slick-carousel is archived.
flickity is actively maintained.
swiper is actively maintained.
| Feature | slick-carousel | flickity | swiper |
|---|---|---|---|
| Dependency | jQuery | Vanilla JS | Vanilla JS (Modular) |
| React Support | Community Wrapper | Community Wrapper | Official Components |
| Maintenance | Archived | Active | Active |
| Complexity | Low | Low | High |
| Bundle Size | Heavy (with jQuery) | Light | Modular |
slick-carousel should be avoided in new development. Its reliance on jQuery and lack of maintenance make it a risk for modern stacks.
flickity is excellent for simple, content-focused carousels where you want minimal setup and no framework overhead.
swiper is the industry standard for complex applications. Choose it if you need official framework support, advanced effects, or guaranteed long-term maintenance.
Choose flickity if you need a lightweight, vanilla JavaScript solution for simple carousels without framework overhead. It is ideal for content-focused sites where you want reliable touch support without complex configuration.
Avoid slick-carousel for new projects. Only consider it if you are maintaining a legacy jQuery codebase where rewriting the slider logic is not feasible due to budget or time constraints.
Choose swiper if you are building a complex application using React, Vue, or Angular. It is the best fit for projects requiring official framework support, advanced effects, and long-term maintenance guarantees.
Touch, responsive, flickable carousels
See flickity.metafizzy.co for complete docs and demos.
Link directly to Flickity files on unpkg.
<link rel="stylesheet" href="https://unpkg.com/flickity@2/dist/flickity.min.css">
<script src="https://unpkg.com/flickity@2/dist/flickity.pkgd.min.js"></script>
Bower: bower install flickity --save
npm: npm install flickity --save
If you want to use Flickity to develop commercial sites, themes, projects, and applications, the Commercial license is the appropriate license. With this option, your source code is kept proprietary. Purchase a Flickity Commercial License at flickity.metafizzy.co
If you are creating an open source application under a license compatible with the GNU GPL license v3, you may use Flickity under the terms of the GPLv3.
Read more about Flickity's license.
Flickity works with a container element and a set of child cell elements
<div class="carousel">
<div class="carousel-cell">...</div>
<div class="carousel-cell">...</div>
<div class="carousel-cell">...</div>
...
</div>
var flky = new Flickity( '.gallery', {
// options, defaults listed
accessibility: true,
// enable keyboard navigation, pressing left & right keys
adaptiveHeight: false,
// set carousel height to the selected slide
autoPlay: false,
// advances to the next cell
// if true, default is 3 seconds
// or set time between advances in milliseconds
// i.e. `autoPlay: 1000` will advance every 1 second
cellAlign: 'center',
// alignment of cells, 'center', 'left', or 'right'
// or a decimal 0-1, 0 is beginning (left) of container, 1 is end (right)
cellSelector: undefined,
// specify selector for cell elements
contain: false,
// will contain cells to container
// so no excess scroll at beginning or end
// has no effect if wrapAround is enabled
draggable: '>1',
// enables dragging & flicking
// if at least 2 cells
dragThreshold: 3,
// number of pixels a user must scroll horizontally to start dragging
// increase to allow more room for vertical scroll for touch devices
freeScroll: false,
// enables content to be freely scrolled and flicked
// without aligning cells
friction: 0.2,
// smaller number = easier to flick farther
groupCells: false,
// group cells together in slides
initialIndex: 0,
// zero-based index of the initial selected cell
lazyLoad: true,
// enable lazy-loading images
// set img data-flickity-lazyload="src.jpg"
// set to number to load images adjacent cells
percentPosition: true,
// sets positioning in percent values, rather than pixels
// Enable if items have percent widths
// Disable if items have pixel widths, like images
prevNextButtons: true,
// creates and enables buttons to click to previous & next cells
pageDots: true,
// create and enable page dots
resize: true,
// listens to window resize events to adjust size & positions
rightToLeft: false,
// enables right-to-left layout
setGallerySize: true,
// sets the height of gallery
// disable if gallery already has height set with CSS
watchCSS: false,
// watches the content of :after of the element
// activates if #element:after { content: 'flickity' }
wrapAround: false
// at end of cells, wraps-around to first for infinite scrolling
});
By Metafizzy 🌈🐻