documentation/blog/2023-12-07-swiper-js.md
Sliders have become an integral part of websites and web applications as they have been used to rapidly capture a user's attention as well as emphasize important information, items, or characteristics. There are an array of libraries used to make sliders, but one worth noting is Swiper.
Swiper.js is a powerful JavaScript library that lets you quickly add touch-enabled and responsive sliders to your website or web application. It has been highly embraced by many due to its flexibility in customization as well as being available in various Javascript frameworks. In this article, we will take a dive into the Swiper.js library
There are a few ways to include Swiper in your project:
To download Swiper locally, visit here
You can include Swiper in your project by adding the following code to your HTML file:
<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>
If you use ES modules in your browser, there is a CDN version as well:
<script type="module">
import Swiper from 'https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.mjs'
const swiper = new Swiper(...)
</script>
Install Swiper into your project using the command below:
npm install swiper
Next, import swiper into your Javascript file.
// import Swiper JS
import Swiper from 'swiper';
// import Swiper styles
import 'swiper/swiper-bundle.min.css';
const swiper = new Swiper(...);
Swiper exports only the basic version by default, without any additional modules (such as Navigation, Pagination, and so on). As a result, you must import and configure these as well from swiper/modules.
// core version + navigation, pagination modules:
import Swiper from 'swiper';
import { Navigation, Pagination } from 'swiper/modules';
// import Swiper and modules styles
import 'swiper/swiper.min.css';
import 'swiper/modules/navigation.min.css';
import 'swiper/modules/pagination.min.css';
// init Swiper:
const swiper = new Swiper('.swiper', {
// configure Swiper to use modules
modules: [Navigation, Pagination],
...
});
If you wish to import Swiper with all modules (bundle), import it from swiper/bundle.
// import Swiper bundle with all modules installed
import Swiper from 'swiper/bundle';
// import styles bundle
import 'swiper/swiper-bundle.min.css';
// init Swiper:
const swiper = new Swiper(...);
After the installation process, we will then add the Swiper's HTML layout to our project.
// Slider main container
<div class="swiper">
// Additional required wrapper
<div class="swiper-wrapper">
// Slides
<div class="swiper-slide">Slide 1</div>
<div class="swiper-slide">Slide 2</div>
<div class="swiper-slide">Slide 3</div>
...
</div>
// If we need pagination
<div class="swiper-pagination"></div>
// If we need navigation buttons
<div class="swiper-button-prev"></div>
<div class="swiper-button-next"></div>
// If we need scrollbar
<div class="swiper-scrollbar"></div>
</div>
Next, we need to initialize Swiper after adding the HTML.
const swiper = new Swiper(".swiper", {
// Optional parameters
direction: "vertical",
loop: true,
// If we need pagination
pagination: {
el: ".swiper-pagination",
},
// Navigation arrows
navigation: {
nextEl: ".swiper-button-next",
prevEl: ".swiper-button-prev",
},
// And if we need scrollbar
scrollbar: {
el: ".swiper-scrollbar",
},
});
The Swiper object accepts two parameters:
CSS selector reference to that element (in our case, the .swiper element in the example above ).navigation, pagination, modules, scrollbar, direction, loop, and many more.Swiper has an array of parameters that can be passed into its configuration options. visit its docs to view these parameters.
After Initializing Swiper, we can access helpful methods and properties in the Swiper object. For example, the properties:
swiper.activeIndex allows you to access the slider's current index value, which you can set to a number.swiper.previousIndex allows you to access the slider's previous index value, which you can set to a number.swiper.allowSlideNext can disable or enable the ability to slide to the next slide.swiper.allowSlidePrev can disable or enable the ability to slide to the previous slideswiper.el holds the slider container HTML elementswiper.width holds the width of the slider containerswiper.height holds height of the slider containerswiper.swipeDirectionlets you specify the direction of sliding as either 'prev' | 'next'for methods:
swiper.changeDirection(direction, needUpdate)swiper.slidePrev(speed, runCallbacks)swiper.slideTo(index, speed, runCallbacks)To see more methods and properties that the Swiper Object exposes, visit here
Swiper includes a number of useful events to which you can listen. There are two techniques to assign events:
on parameter during swiper initialization:const swiper = new Swiper(".swiper", {
// ...
on: {
init: function () {
console.log("swiper initialized");
},
},
});
on parameter after swiper initialization:const swiper = new Swiper(".swiper", {
// ...
});
swiper.on("slideChange", function () {
console.log("slide changed");
});
Swiper has some events such as:
activeIndexChange, an event that is fired when the active index of the slides changes.slide change, an event that is fired when the active index of the slides changes.click, an event that is fired when the Swiper container is clickedYou can listen to a number of events on Swiper. To see more events that Swiper supports, visit here.
Swiper includes several CSS style sets:
swiper/swiper-bundle.min.css - bundled Swiper core styles(including modules styles).swiper/swiper.min.css - Swiper only style(excluding modules styles).swiper/modules/{{moduleName}}.min.css - a minified Swiper style, based on a module name in lowercase (such as Navigation, Pagination, and so on).swiper/modules/{{moduleName}}.css - Swiper style (not minified), based on a module name in lowercase (such as Navigation, Pagination, and so on).Swiper also allows for separate modular styles. That is if you only want to import specific styles for specific modules.
For example, you can access the minified styles for the navigation module simply by importing swiper/modules/navigation.min.css
Check out the Swiper style docs to discover additional style options (as Swiper also supports SCSS and Less options).
N/B: Modules styles are optional if you've already imported bundle styles.
Swiper modules can be customized in a variety of ways. We'll look at different swiper modules and how they can be customized.
in Swiper, you can customize Navigation Parameters as Swiper provides
string which is a CSS selector or HTML element of the element that will function as a "prev" button when clicked.string which is a CSS selector or HTML element of the element that will function as a "next" button when clicked.Here is an example of how some parameters are used. In the code below, we are targeting the classes:
.swiper-button-prev element on the HTML template with the navigation.prevEl parameter.swiper-button-next element on the HTML template with the navigation.nextEl parameterJavascript code:
import Swiper from 'swiper';
import { Navigation } from 'swiper/modules';
// import Swiper and modules styles
import 'swiper/swiper.min.css';
import 'swiper/modules/navigation.min.css';
const swiper = new Swiper('.swiper', {
modules: [Navigation],
....,
// Navigation arrows
navigation: {
nextEl: '.swiper-button-next',
prevEl: '.swiper-button-prev',
},
});
// OR (Alternative)
const swiper = new Swiper('.swiper', {
modules: [Navigation],
....,
});
swiper.nextEl = '.swiper-button-next';
swiper.prevEl = '.swiper-button-prev';
The HTML template:
// Slider main container
<div class="swiper">
// Additional required wrapper
<div class="swiper-wrapper">
// Slides
<div class="swiper-slide">Slide 1</div>
<div class="swiper-slide">Slide 2</div>
<div class="swiper-slide">Slide 3</div>
...
</div>
// navigation buttons
<div class="swiper-button-prev"></div>
<div class="swiper-button-next"></div>
</div>
To explore more Navigation options, visit here.
in Swiper, you can customize Pagination Parameters as Swiper provides
array of pagination bullets HTML elements. To get specific slide HTMLElement use swiper.pagination.bullets[1].Here is an example of how a parameter is used. In the code below, we are targeting the class:
.swiper-pagination element on the HTML template with the navigation.el parameterJavascript code:
import Swiper from 'swiper';
import { Pagination, Navigation } from 'swiper/modules';
// import Swiper and modules styles
import 'swiper/swiper.min.css';
import 'swiper/modules/navigation.min.css';
import 'swiper/modules/pagination.min.css';
const swiper = new Swiper('.swiper', {
modules: [Pagination, Navigation],
// If we need pagination
pagination: {
el: '.swiper-pagination',
clickable: true
},
...
});
// OR (Alternative)
const swiper = new Swiper('.swiper', {
modules: [Pagination, Navigation],
...,
});
swiper.el = '.swiper-pagination';
The HTML template:
// Slider main container
<div class="swiper">
// Additional required wrapper
<div class="swiper-wrapper">
// Slides
<div class="swiper-slide">Slide 1</div>
<div class="swiper-slide">Slide 2</div>
<div class="swiper-slide">Slide 3</div>
...
</div>
// If we need pagination
<div class="swiper-pagination"></div>
</div>
Some other customization features include:
in Swiper, you can customize Scrollbar parameters as Swiper provides:
Here is an example of how a parameter is used. In the code below, we are targeting a class:
.swiper-scrollbar element on the HTML template with the scrollbar.el parameterJavascript code:
import Swiper from 'swiper';
import { Scrollbar } from 'swiper/modules';
// import Swiper and modules styles
import 'swiper/swiper.min.css';
import 'swiper/modules/scrollbar.min.css';
const swiper = new Swiper('.swiper', {
modules: [Scrollbar],
// And if we need scrollbar
scrollbar: {
el: '.swiper-scrollbar',
},
});
// OR (Alternative)
const swiper = new Swiper('.swiper', {
modules: [Scrollbar],
....,
});
swiper.el = '.swiper-scrollbar';
The HTML template:
// Slider main container
<div class="swiper">
// Additional required wrapper
<div class="swiper-wrapper">
// Slides
<div class="swiper-slide">Slide 1</div>
<div class="swiper-slide">Slide 2</div>
<div class="swiper-slide">Slide 3</div>
...
</div>
// If we need scrollbar
<div class="swiper-scrollbar"></div>
</div>
For Thumbs, you would require two Swiper instances:
in Swiper, you can customize Thumb Parameters as Swiper provides:
Here is an example of how a thumb parameter is used. In the code below, we are targeting the thumbs.swiper property in the swiper2 Swiper instance with the swiper Swiper instance.
Javascript code:
import Swiper from "swiper";
import { Thumbs } from "swiper/modules";
// import Swiper and modules styles
import "swiper/swiper.min.css";
import "swiper/modules/thumbs.min.css";
// Initialize Swiper
let swiper = new Swiper(".mySwiper", {
spaceBetween: 10,
slidesPerView: 4,
freeMode: true,
watchSlidesProgress: true,
});
let swiper2 = new Swiper(".mySwiper2", {
modules: [Thumbs],
spaceBetween: 10,
thumbs: {
swiper: swiper,
},
});
The HTML template:
<div class="swiper-container">
<div class="swiper mySwiper2">
<div class="swiper-wrapper">
<div class="swiper-slide slide_1">Slide 1</div>
<div class="swiper-slide slide_2">Slide 2</div>
<div class="swiper-slide slide_3">Slide 3</div>
<div class="swiper-slide slide_4">Slide 4</div>
<div class="swiper-slide slide_5">Slide 5</div>
</div>
<div class="swiper-button-next"></div>
<div class="swiper-button-prev"></div>
</div>
<div thumbsSlider="" class="swiper mySwiper">
<div class="swiper-wrapper">
<div class="swiper-slide slide_1">Slide 1</div>
<div class="swiper-slide slide_2">Slide 2</div>
<div class="swiper-slide slide_3">Slide 3</div>
<div class="swiper-slide slide_4">Slide 4</div>
<div class="swiper-slide slide_5">Slide 5</div>
</div>
</div>
</div>
To explore more module customization options, visit here.
Swiper is supported by javascript frameworks like as React, Vue, and Angular. However, in this article, we will focus on Swiper for React.
Swiper React is a component of the main Swiper library that is only accessible through NPM:
npm i swiper
After installation, you can access Swiper React packages from the swiper/react exports
swiper/react exports 2 components:
<Swiper></Swiper, which represents the Swiper container element.<SwiperSlide></SwiperSlide>, which represents the individual Swiper slides.// Import Swiper React components
import { Swiper, SwiperSlide } from "swiper/react";
// Import Swiper styles
import "swiper/css";
export default () => {
return (
<Swiper>
<SwiperSlide>Content 1</SwiperSlide>
<SwiperSlide>Content 2</SwiperSlide>
<SwiperSlide>Content 3</SwiperSlide>
<SwiperSlide>Content 4</SwiperSlide>
</Swiper>
);
};
N/B: Swiper React by default utilizes the core version of Swiper (without any additional modules). If you wish to use Navigation, Pagination, and other modules, you must first install them.
// import Swiper core and required modules
import { Navigation, Pagination, Scrollbar, A11y } from "swiper/modules";
import { Swiper, SwiperSlide } from "swiper/react";
// Import Swiper styles
import "swiper/css";
import "swiper/css/navigation";
import "swiper/css/pagination";
import "swiper/css/scrollbar";
export default () => {
return (
<Swiper
// install Swiper modules
modules={[Navigation, Pagination, Scrollbar, A11y]}
navigation={true}
pagination={true}
>
<SwiperSlide>Content 1</SwiperSlide>
<SwiperSlide>Content 2</SwiperSlide>
<SwiperSlide>Content 3</SwiperSlide>
<SwiperSlide>Content 4</SwiperSlide>
...
</Swiper>
);
};
All of the Swiper parameters are sent as component props to the Swiper React component, along with a few extra properties:
tag: The Swiper container HTML element tag.wrapperTag: The Swiper wrapper HTML element tag.onSwiper: This is a Callback that receives the Swiper instance.Also, it supports all Swiper events in the format of on{Eventname}. SlideChange event, for instance, becomes onSlideChange prop:
...
<Swiper
onSlideChange={() =>}
...
>
The <SwiperSlide></SwiperSlide> component accepts the following extra properties:
tag : Swiper Slide HTML element tagzoom: Enables the extra wrapper needed for the zoom mode.virtualIndex: The real index of Swiper slides. It Must be configured for virtual slidesThe <SwiperSlide></SwiperSlide> can accept render functions that return an object with the following properties:
isActive: When the current slide is active, this is true.isPrev: returns true when the current slide is the previous one from the activeisNext: returns true when the current slide is the next slide after the active slideisVisible: returns true when the current slide is visible (the watchSlidesProgress Swiper argument must be enabled).isDuplicate: returns true if the current slide is a duplicate (when loop mode is enabled).An example of the use of a render function is shown below:
<Swiper>
<SwiperSlide>
{({ isActive }) => (
<div>Current slide is {isActive ? "active" : "Slide 1"}</div>
)}
</SwiperSlide>
</Swiper>
Swiper hooks are simply hooks in react that easily make available the Swiper instance and SwiperSlides values.
useSwiper hook to easily obtain the Swiper instance in Swiper components:// some-inner-component.jsx
import { React } from "react";
import { useSwiper } from "swiper/react";
export default function SlideNextButton() {
const swiper = useSwiper();
return (
<button onClick={() => swiper.slideNext()}>Slide to the next slide</button>
);
}
useSwiperSlide is an additional hook for components inside Swiper slides to obtain slide data (the same data as in the <SwiperSlide></SwiperSlide> render function).// some-inner-component.jsx
import { React } from "react";
import { useSwiperSlide } from "swiper/react";
export default function SlideTitle() {
const swiperSlide = useSwiperSlide();
return (
<p>Current slide is {swiperSlide.isActive ? "active" : "not active"}</p>
);
}
Let's look more closely at how to use the Swiper web component in React.
Because React does not yet have native support for custom elements (web components), it is necessary to use Swiper Element in React by giving parameters as props and using custom initialization.
Also, events cannot be allocated using React's on[Event] syntax and must be added using the.addEventListener function or by handing them in on in parameters:
import { useEffect, useRef } from "react";
import { register } from "swiper/element/bundle";
register();
export default function App() {
const swiperElRef = useRef(null);
useEffect(() => {
// listen for Swiper events using addEventListener
swiperElRef.current.addEventListener("swiperprogress", (e) => {
const [swiper, progress] = e.detail;
console.log(progress);
});
swiperElRef.current.addEventListener("swiperslidechange", (e) => {
console.log("slide changed");
});
}, []);
return (
<swiper-container
ref={swiperElRef}
slides-per-view="3"
navigation="true"
pagination="true"
>
<swiper-slide>Slide 1</swiper-slide>
<swiper-slide>Slide 2</swiper-slide>
<swiper-slide>Slide 3</swiper-slide>
...
</swiper-container>
);
}
This post covered Swiper.JS, a versatile and user-friendly tool for creating customizable carousels and sliders.
Swiper.JS is a feature-rich library, so it's important that you look through its documentation to learn about all of its features and maybe even give it a try.