Swiper Vue.js plugin is available only via NPM as a part of the main Swiper library:
npm i swiper@6
swiper/vue
exports 2 components: Swiper
and SwiperSlide
:
<template>
<swiper
:slides-per-view="3"
:space-between="50"
@swiper="onSwiper"
@slideChange="onSlideChange"
>
<swiper-slide>Slide 1</swiper-slide>
<swiper-slide>Slide 2</swiper-slide>
<swiper-slide>Slide 3</swiper-slide>
...
</swiper>
</template>
<script>
// Import Swiper Vue.js components
import { Swiper, SwiperSlide } from 'swiper/vue';
// Import Swiper styles
import 'swiper/swiper.scss';
export default {
components: {
Swiper,
SwiperSlide,
},
methods: {
onSwiper(swiper) {
console.log(swiper);
},
onSlideChange() {
console.log('slide change');
},
},
};
</script>
Here is the list of additional modules imports:
Virtual
- Virtual Slides moduleKeyboard
- Keyboard Control moduleMousewheel
- Mousewheel Control moduleNavigation
- Navigation modulePagination
- Pagination moduleScrollbar
- Scrollbar moduleParallax
- Parallax moduleZoom
- 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 moduleThumbs
- Thumbs module<template>
<swiper
:slides-per-view="3"
:space-between="50"
navigation
:pagination="{ clickable: true }"
:scrollbar="{ draggable: true }"
@swiper="onSwiper"
@slideChange="onSlideChange"
>
<swiper-slide>Slide 1</swiper-slide>
<swiper-slide>Slide 2</swiper-slide>
<swiper-slide>Slide 3</swiper-slide>
...
</swiper>
</template>
<script>
// import Swiper core and required modules
import SwiperCore, { Navigation, Pagination, Scrollbar, A11y } from 'swiper';
// Import Swiper Vue.js components
import { Swiper, SwiperSlide } from 'swiper/vue';
// Import Swiper styles
import 'swiper/swiper.scss';
import 'swiper/components/navigation/navigation.scss';
import 'swiper/components/pagination/pagination.scss';
import 'swiper/components/scrollbar/scrollbar.scss';
// install Swiper modules
SwiperCore.use([Navigation, Pagination, Scrollbar, A11y]);
// Import Swiper styles
export default {
components: {
Swiper,
SwiperSlide,
},
methods: {
onSwiper(swiper) {
console.log(swiper);
},
onSlideChange() {
console.log('slide change');
},
},
};
</script>
navigation.nextEl
, pagination.el
, etc.)Swiper package contains different sets of CSS, Less and SCSS styles:
CSS styles available only for bundle version:
swiper-bundle.css
- all Swiper styles including all modules styles (like Navigation, Pagination, etc.)swiper-bundle.min.css
- same as previous but minifiedLess styles are separate styles for core version and modules:
swiper.less
- only core Swiper stylescomponents/a11y/a11y.less
- styles required for A11y modulecomponents/controller/controller.less
- styles required for Controller modulecomponents/effect-coverflow/effect-coverflow.less
- styles required for Coverflow Effect modulecomponents/effect-cube/effect-cube.less
- styles required for Cube Effect modulecomponents/effect-fade/effect-fade.less
- styles required for Fade Effect modulecomponents/effect-flip/effect-flip.less
- styles required for Flip Effect modulecomponents/lazy/lazy.less
- styles required for Lazy modulecomponents/navigation/navigation.less
- styles required for Navigation modulecomponents/pagination/pagination.less
- styles required for Pagination modulecomponents/scrollbar/scrollbar.less
- styles required for Scrollbar modulecomponents/thumbs/thumbs.less
- styles required for Thumbs modulecomponents/zoom/zoom.less
- styles required for Zoom moduleSCSS styles are also separate styles for core version and modules:
swiper.scss
- only core Swiper stylescomponents/a11y/a11y.scss
- styles required for A11y modulecomponents/controller/controller.scss
- styles required for Controller modulecomponents/effect-coverflow/effect-coverflow.scss
- styles required for Coverflow Effect modulecomponents/effect-cube/effect-cube.scss
- styles required for Cube Effect modulecomponents/effect-fade/effect-fade.scss
- styles required for Fade Effect modulecomponents/effect-flip/effect-flip.scss
- styles required for Flip Effect modulecomponents/lazy/lazy.scss
- styles required for Lazy modulecomponents/navigation/navigation.scss
- styles required for Navigation modulecomponents/pagination/pagination.scss
- styles required for Pagination modulecomponents/scrollbar/scrollbar.scss
- styles required for Scrollbar modulecomponents/thumbs/thumbs.scss
- styles required for Thumbs modulecomponents/zoom/zoom.scss
- styles required for Zoom moduleSwiper
Vue.js component receive all Swiper parameters as component props, plus some extra props:
Prop | Type | Default | Description |
---|---|---|---|
tag | string | 'div' | Main Swiper container HTML element tag |
wrapperTag | string | 'div' | Swiper wrapper HTML element tag |
Swiper component supports all Swiper events, including additional swiper
event that returns swiper instance as soon as posible. For example:
<swiper @swiper="..." @slideChange="..." @reachEnd="..." ...></swiper>
Prop | Type | Default | Description |
---|---|---|---|
tag | string | 'div' | Swiper Slide HTML element tag |
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 has the following slot props:
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 (watchSlidesVisibility
Swiper parameter must be enabled)isDuplicate
- true when current slide is a duplicate slide (when loop
mode enabled)
For example:<swiper>
<swiper-slide v-slot="{ isActive }">
<div>Current slide is {{ isActive ? 'active' : 'not active' }}</div>
</swiper-slide>
</swiper>
Swiper Vue.js component uses "slots" for content distribution. There are 4 slots available
container-start
- element will be added to the beginning of swiper-containercontainer-end
(default) - 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>
<swiper-slide>Slide 1</swiper-slide>
<swiper-slide>Slide 2</swiper-slide>
<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-container">
<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>
Virtual Slides rendering here is fully handled by Vue.js and not required anything except setting :virtual="true"
property and setting virtualIndex
on slides:
<template>
<swiper :slides-per-view="3" :space-between="50" virtual>
<swiper-slide
v-for="(slideContent, index) in slides"
:key="index"
:virtualIndex="index"
>{{slideContent}}</swiper-slide
>
</swiper>
</template>
<script>
import SwiperCore, { Virtual } from 'swiper';
import { Swiper, SwiperSlide } from 'swiper/vue';
// install Virtual module
SwiperCore.use([Virtual]);
export default {
components: {
Swiper,
SwiperSlide,
},
data() {
// Create array with 1000 slides
const slides = Array.from({ length: 1000 }).map(
(el, index) => `Slide ${index + 1}`
);
return {
slides,
};
},
};
</script>
Controller requires to pass one Swiper instance to another:
<template>
<!-- Main Swiper -> pass controlled swiper instance -->
<swiper :controller="{ control: controlledSwiper }" ...> ... </swiper>
<!-- Controlled Swiper -> store swiper instance -->
<swiper @swiper="setControlledSwiper" ...> ... </swiper>
</template>
<script>
import SwiperCore, { Controller } from 'swiper';
import { Swiper, SwiperSlide } from 'swiper/vue';
// install Swiper's Controller component
SwiperCore.use([Controller]);
export default {
components: {
Swiper,
SwiperSlide,
},
data() {
return {
controlledSwiper: null,
};
},
methods: {
setControlledSwiper(swiper) {
this.controlledSwiper = swiper;
},
},
};
</script>
For two-way control (when both Swipers control each other) it should be like this:
<template>
<swiper @swiper="setFirstSwiper" :controller="{ control: secondSwiper }" ...>
...
</swiper>
<swiper @swiper="setSecondSwiper" :controller="{ control: firstSwiper }" ...>
...
</swiper>
</template>
<script>
import SwiperCore, { Controller } from 'swiper';
import { Swiper, SwiperSlide } from 'swiper/vue';
// install Swiper's Controller component
SwiperCore.use([Controller]);
export default {
components: {
Swiper,
SwiperSlide,
},
data() {
return {
firstSwiper: null,
secondSwiper: null,
};
},
methods: {
setFirstSwiper(swiper) {
this.firstSwiper = swiper;
},
setSecondSwiper(swiper) {
this.secondSwiper = swiper;
},
},
};
</script>
Same as with controller we need to store thumbs instance and pass it to main gallery:
<template>
<!-- Main Swiper -> pass thumbs swiper instance -->
<swiper :thumbs="{ swiper: thumbsSwiper }" ...> ... </swiper>
<!-- Thumbs Swiper -> store swiper instance -->
<!-- It is also required to set watchSlidesVisibility and watchSlidesProgress props -->
<swiper
@swiper="setThumbsSwiper"
watch-slides-visibility
watch-slides-progress
...
>
...
</swiper>
</template>
<script>
import SwiperCore, { Thumbs } from 'swiper';
import { Swiper, SwiperSlide } from 'swiper/vue';
// install Swiper's Thumbs component
SwiperCore.use([Thumbs]);
export default {
components: {
Swiper,
SwiperSlide,
},
data() {
return {
thumbsSwiper: null,
};
},
methods: {
setThumbsSwiper(swiper) {
this.thumbsSwiper = swiper;
},
},
};
</script>
The following effects are available:
- Fade
- Cube
- Coverflow
- Flip
To use effects you have to import and install them first (as all other modules) (Fade example):
import SwiperCore, { EffectFade } from 'swiper';
SwiperCore.use([EffectFade]);
You can find running effect demos here.
<template>
<swiper effect="fade">
<swiper-slide>Slide 1</swiper-slide>
<swiper-slide>Slide 2</swiper-slide>
<swiper-slide>Slide 3</swiper-slide>
...
</swiper>
</template>
<script>
import SwiperCore, { EffectFade } from 'swiper';
import { Swiper, SwiperSlide } from 'swiper/vue';
import 'swiper/swiper.scss';
import 'swiper/components/effect-fade/effect-fade.scss';
SwiperCore.use([EffectFade]);
export default {
components: {
Swiper,
SwiperSlide,
},
};
</script>