Swiper Svelte is available only via NPM as a part of the main Swiper library:
npm i swiper
swiper/svelte
exports 2 components: Swiper
and SwiperSlide
:
<Swiper
spaceBetween={50}
slidesPerView={3}
on:slideChange={() => console.log('slide change')}
on:swiper={(e) => console.log(e.detail[0])}
>
<SwiperSlide>Slide 1</SwiperSlide>
<SwiperSlide>Slide 2</SwiperSlide>
<SwiperSlide>Slide 3</SwiperSlide>
<SwiperSlide>Slide 4</SwiperSlide>
...
</Swiper>
<script>
// Import Swiper Svelte components
import { Swiper, SwiperSlide } from 'swiper/svelte';
// Import Swiper styles
import 'swiper/css';
</script>
Virtual
- Virtual Slides moduleKeyboard
- Keyboard Control moduleMousewheel
- Mousewheel Control moduleNavigation
- Navigation modulePagination
- Pagination moduleScrollbar
- Scrollbar moduleParallax
- Parallax moduleFreeMode
- Free Mode moduleGrid
- Grid moduleManipulation
- Slides manipulation module (only for Core version)Zoom
- Zoom moduleLazy
- Lazy moduleController
- Controller moduleA11y
- Accessibility moduleHistory
- History Navigation moduleHashNavigation
- Hash Navigation moduleAutoplay
- Autoplay moduleEffectFade
- Fade Effect moduleEffectCube
- Cube Effect moduleEffectFlip
- Flip Effect moduleEffectCoverflow
- Coverflow Effect moduleEffectCards
- Cards Effect moduleEffectCreative
- Creative Effect moduleThumbs
- Thumbs module <Swiper
modules={[Navigation, Pagination, Scrollbar, A11y]}
spaceBetween={50}
slidesPerView={3}
navigation
pagination={{ clickable: true }}
scrollbar={{ draggable: true }}
on:slideChange={() => console.log('slide change')}
on:swiper={(e) => console.log(e.detail[0])}
>
<SwiperSlide>Slide 1</SwiperSlide>
<SwiperSlide>Slide 2</SwiperSlide>
<SwiperSlide>Slide 3</SwiperSlide>
<SwiperSlide>Slide 4</SwiperSlide>
...
</Swiper>
<script>
// import Swiper core and required modules
import { Navigation, Pagination, Scrollbar, A11y } from 'swiper';
import { Swiper, SwiperSlide } from 'swiper/svelte';
// Import Swiper styles
import 'swiper/css';
import 'swiper/css/navigation';
import 'swiper/css/pagination';
import 'swiper/css/scrollbar';
</script>
navigation.nextEl
, pagination.el
, etc.)Swiper package contains different sets of CSS, Less and SCSS styles:
swiper/css
- only core Swiper stylesswiper/css/bundle
- all Swiper styles including all modules styles (like Navigation, Pagination, etc.)Modules styles (not required if you already imported bundle styles):
swiper/css/a11y
- styles required for A11y moduleswiper/css/autoplay
- styles required for Autoplay moduleswiper/css/controller
- styles required for Controller moduleswiper/css/effect-cards
- styles required for Cards Effect moduleswiper/css/effect-coverflow
- styles required for Coverflow Effect moduleswiper/css/effect-creative
- styles required for Creative Effect moduleswiper/css/effect-cube
- styles required for Cube Effect moduleswiper/css/effect-fade
- styles required for Fade Effect moduleswiper/css/effect-flip
- styles required for Flip Effect moduleswiper/css/free-mode
- styles required for Free Mode moduleswiper/css/grid
- styles required for Grid moduleswiper/css/hash-navigation
- styles required for Hash Navigation moduleswiper/css/history
- styles required for History moduleswiper/css/keyboard
- styles required for Keyboard moduleswiper/css/lazy
- styles required for Lazy moduleswiper/css/manipulation
- styles required for Manipulation moduleswiper/css/mousewheel
- styles required for Mousewheel moduleswiper/css/navigation
- styles required for Navigation moduleswiper/css/pagination
- styles required for Pagination moduleswiper/css/parallax
- styles required for Parallax moduleswiper/css/scrollbar
- styles required for Scrollbar moduleswiper/css/thumbs
- styles required for Thumbs moduleswiper/css/virtual
- styles required for Virtual moduleswiper/css/zoom
- styles required for Zoom moduleFor Less styles replace css
with less
in imports paths, e.g.:
import 'swiper/less';
import 'swiper/less/navigation';
import 'swiper/less/pagination';
For SCSS styles replace css
with scss
in imports paths, e.g.:
import 'swiper/scss';
import 'swiper/scss/navigation';
import 'swiper/scss/pagination';
Swiper
Svelte component receive all Swiper parameters as component props.
<Swiper
slidesPerView="{3}"
spaceBetween="{50}"
navigation
pagination
...
></Swiper>
Swiper component supports all Swiper events, including additional swiper
event that returns swiper instance as soon as possible.
event.detail
. <Swiper
on:swiper={onSwiper}
on:slideChange={() => console.log('slide change')}
on:progress={onProgress}
>
...
</Swiper>
<script>
import { Swiper, SwiperSlide } from 'swiper/svelte';
/* "progress" event emitted with "swiper" and "progress" argumentts */
const onProgress = (e) => {
const [swiper, progress] = e.detail;
console.log(progress);
}
/* "swiper" event emitted with "swiper" instance argument */
const onSwiper = (e) => {
const [swiper] = e.detail;
console.log(swiper);
}
</script>
Prop | Type | Default | Description |
---|---|---|---|
zoom | boolean | false | Enables additional wrapper required for zoom mode |
virtualIndex | number | Actual swiper slide index. Required to be set for virtual slides |
SwiperSlide
component receives the following data
object:
isActive
- true when current slide is activeisPrev
- true when current slide is the previous from activeisNext
- true when current slide is the next from activeisVisible
- true when current slide is visible (watchSlidesProgress
Swiper parameter must be enabled)isDuplicate
- true when current slide is a duplicate slide (when loop
mode enabled)
For example:<Swiper>
<SwiperSlide let:data="{{ isActive }}">
<div>Current slide is { isActive ? 'active' : 'not active' }</div>
</SwiperSlide>
</Swiper>
Swiper Svelte uses "slots" for content distribution. There are 4 slots available
container-start
- element will be added to the beginning of swiper-containercontainer-end
- element will be added to the end of swiper-containerwrapper-start
- element will be added to the beginning of swiper-wrapperwrapper-end
- element will be added to the end of swiper-wrapperFor example:
<Swiper>
<SwiperSlide>Slide 1</SwiperSlide>
<SwiperSlide>Slide 2</SwiperSlide>
<span slot="container-start">Container Start</span>
<span slot="container-end">Container End</span>
<span slot="wrapper-start">Wrapper Start</span>
<span slot="wrapper-end">Wrapper End</span>
</Swiper>
Will be rendered as:
<div class="swiper">
<span slot="container-start">Container Start</span>
<div class="swiper-wrapper">
<span slot="wrapper-start">Wrapper Start</span>
<div class="swiper-slide">Slide 1</div>
<div class="swiper-slide">Slide 2</div>
<span slot="wrapper-end">Wrapper End</span>
</div>
<span slot="container-end">Container End</span>
</div>
To implement Virtual Slides we need to:
pass array with slides to Swiper's virtual.slides
property
render slides based on virtualData
slot's data. It is also mandatory to pass virtualIndex
. virtualData
is the object with following properties:
offset
- slides left/top offset in pxfrom
- index of first slide required to be renderedto
- index of last slide required to be renderedslides
- slides to render <Swiper
modules={[Virtual]}
spaceBetween={50}
slidesPerView={3}
virtual={{ slides: virtualSlides }}
let:virtualData={{ slides, offset, from }}
>
{#each slides as slide, index (from + index)}
<SwiperSlide
virtualIndex={from + index}
style={`left: ${offset}px`}
>{slide}</SwiperSlide>
{/each}
</Swiper>
<script>
import { Virtual } from 'swiper';
import { Swiper, SwiperSlide } from 'swiper/svelte';
// Create array with 1000 slides
const virtualSlides = Array.from({ length: 1000 }).map((el, index) => `Slide ${index + 1}`);
</script>
Controller requires to pass one Swiper instance to another:
<!-- Main Swiper -> pass controlled swiper instance -->
<Swiper
modules={[Controller]}
controller={{ control: controlledSwiper }}
...
>
<!-- ... -->
</Swiper>
<!-- Controlled Swiper -> store swiper instance -->
<Swiper
modules={[Controller]}
on:swiper={setControlledSwiper}
...
>
<!-- ... -->
</Swiper>
<script>
import { Controller } from 'swiper';
import { Swiper, SwiperSlide } from 'swiper/svelte';
// store Controller swiper instance
let controlledSwiper = null;
const setControlledSwiper = (e) => {
const [swiper] = e.detail;
// set Controller swiper instance
setTimeout(() => {
controlledSwiper = swiper;
});
};
</script>
For two-way control (when both Swipers control each other) it should be like this:
<Swiper
modules={[Controller]}
on:swiper={setFirstSwiper}
controller={{ control: secondSwiper }}
...
>
<!-- ... -->
</Swiper>
<Swiper
modules={[Controller]}
on:swiper={setSecondSwiper}
controller={{ control: firstSwiper }}
...
>
<!-- ... -->
</Swiper>
<script>
import SwiperCore, { Controller } from 'swiper';
import { Swiper, SwiperSlide } from 'swiper/svelte';
// store swiper instances
let firstSwiper = null;
let secondSwiper = null;
const setFirstSwiper = (e) => {
const [swiper] = e.detail;
setTimeout(() => {
firstSwiper = swiper;
});
};
const setSecondSwiper = (e) => {
const [swiper] = e.detail;
setTimeout(() => {
secondSwiper = swiper;
});
};
</script>
Same as with controller we need to store thumbs instance and pass it to main gallery:
<!-- Main Swiper -> pass thumbs swiper instance -->
<Swiper
modules={[Thumbs]}
thumbs={{ swiper: thumbsSwiper }}
...
>
<!-- ... -->
</Swiper>
<!-- Thumbs Swiper -> store swiper instance -->
<!-- It is also required to set watchSlidesProgress prop -->
<Swiper
modules={[Thumbs]}
watchSlidesProgress
on:swiper={setThumbsSwiper}
...
>
<!-- ... -->
</Swiper>
<script>
import { Swiper, SwiperSlide } from 'swiper/svelte';
import SwiperCore, { Thumbs } from 'swiper';
// store Thumbs swiper instance
let thumbsSwiper = null;
const setThumbsSwiper = (e) => {
const [swiper] = e.detail;
// set Thumbs swiper instance
setTimeout(() => {
thumbsSwiper = swiper;
});
};
</script>
The following effects are available:
- Fade
- Cube
- Coverflow
- Flip
- Cards
- Creative
To use effects you have to import and install them first (as all other modules).
You can find running effect demos here.
<Swiper modules="{[EffectFade]}" effect="fade">
<SwiperSlide>Slide 1</SwiperSlide>
<SwiperSlide>Slide 2</SwiperSlide>
<SwiperSlide>Slide 3</SwiperSlide>
</Swiper>
<script>
import { Swiper, SwiperSlide } from 'swiper/svelte';
import { EffectFade } from 'swiper';
import 'swiper/css';
import 'swiper/css/effect-fade';
</script>
As you see it is really easy to integrate Swiper into your website or app. So here are your next steps:
Go to API Documentation to learn more about all Swiper API and how to control it.
If you have questions about Swiper ask them in StackOverflow or Swiper Discussions.
Create issue on GitHub if you found a bug.
If you are looking for support, we have a private Discord support chat room for Swiper Patrons.