vue3 使用swiper轮播组件
本地环境信息
node版本:
nodejs : v18.20.4
npm : 10.7.0
vue版本
"dependencies": {
"vue": "^3.2.13",
...
}
安装swiper依赖
执行命令:
npm i swiper
安装后,查看工程中的package.json文件,新增了swiper依赖(默认最新版):
"dependencies": {
"swiper": "^11.1.14",
"vue": "^3.2.13",
...
}
轮播图默认效果
效果说明:
1、多张图片自动播放
2、有指示器
3、有左右导航按钮(向前、向后)
图片导入工程

代码实现
<template>
<swiper
class="swiper-container"
:slides-per-view="1"
:space-between="0"
@swiper="onSwiper"
@slideChange="onSlideChange"
:modules="modules"
:pagination="{ clickable: true }"
:autoplay="{
delay: 2000,
disableOnInteraction: false,
}"
navigation
:loop="true"
>
<swiper-slide>
<img class="item" src="@/assets/banner/0.jpg"/>
</swiper-slide>
<swiper-slide>
<img class="item" src="@/assets/banner/1.jpg"/>
</swiper-slide>
<swiper-slide>
<img class="item" src="@/assets/banner/2.jpg"/>
</swiper-slide>
<swiper-slide>
<img class="item" src="@/assets/banner/3.jpg"/>
</swiper-slide>
</swiper>
</template>
<script lang="ts" setup>
import {ref} from 'vue';
import {Swiper, SwiperSlide} from 'swiper/vue';
import {Navigation, Pagination, A11y, Autoplay} from 'swiper/modules';
import 'swiper/css';
import 'swiper/css/navigation';
import 'swiper/css/pagination';
import 'swiper/css/autoplay';
const modules = [Navigation, Pagination, A11y, Autoplay]
const swiperInstance = ref<typeof Swiper | null>(null);
const onSwiper = (swiper: typeof Swiper) => {
swiperInstance.value = swiper;
};
const onSlideChange = () => {
console.log('slide change');
};
</script>
<style scoped>
.swiper-container {
background-color: white;
}
.item {
width: 100%;
height: auto;
}
</style>
代码释义:
导入swiper组件:Swiper容器;SwiperSlide子项容器
import {Swiper, SwiperSlide} from 'swiper/vue';
导入module:因为swiper将不同功能进行组件化拆分,使其更灵活化,我们使用具体的功能,只需导入相应的module即可。
导航(左右按钮功能)、Pagination(分页指示器功能)、A11y (辅助功能模块,旨在提高网站或应用的可访问性)、Autoplay(自动播放功能)
import {Navigation, Pagination, A11y, Autoplay} from 'swiper/modules';
const modules = [Navigation, Pagination, A11y, Autoplay]
导入相关样式,按功能导入相应的css:
import 'swiper/css';
import 'swiper/css/navigation';
import 'swiper/css/pagination';
import 'swiper/css/autoplay';
template中使用Swiper、SwiperSlide组件,并配置module、属性、事件等
:slides-per-view: 这个属性设置了每个滑块(slide)的可见数量。在这里,设置为 1 表示每次只显示一个滑块。
:space-between:这个属性设置了滑块之间的间距。在这里,设置为 0 表示滑块之间没有间距。
@swiper="onSwiper":这个属性是一个事件监听器,当 Swiper 初始化完成时会触发名为 "onSwiper" 的方法。
@slideChange="onSlideChange":这个属性是另一个事件监听器,当滑块切换时会触发名为 "onSlideChange" 的方法。
:modules:这个属性指定了 Swiper 实例所使用的模块。通过这个属性,可以配置 Swiper 实例使用的各种功能模块【此处配置了导航、指示器、自动播放等】。
:pagination:这个属性配置了 Swiper 的分页指示器,设置为可点击,用户可以通过点击分页器来切换到不同的滑块。
:autoplay:这个属性配置了自动播放功能,设置了播放延迟为 2000 毫秒(2秒),并且当用户交互时不停止自动播放。
navigation:这个属性开启了 Swiper 的导航按钮,通常会显示左右箭头或其他导航元素,用于用户手动导航滑块。
:loop:这个属性设置了 Swiper 是否循环播放滑块内容,即当滑动到最后一个滑块时是否自动切换到第一个滑块。设置为 true 表示开启循环播放。
<swiper
class="swiper-container"
:slides-per-view="1"
:space-between="0"
@swiper="onSwiper"
@slideChange="onSlideChange"
:modules="modules"
:pagination="{ clickable: true }"
:autoplay="{
delay: 2000,
disableOnInteraction: false,
}"
navigation
:loop="true"
>
<swiper-slide>
<img class="item" src="@/assets/banner/0.jpg"/>
</swiper-slide>
<swiper-slide>
<img class="item" src="@/assets/banner/1.jpg"/>
</swiper-slide>
<swiper-slide>
<img class="item" src="@/assets/banner/2.jpg"/>
</swiper-slide>
<swiper-slide>
<img class="item" src="@/assets/banner/3.jpg"/>
</swiper-slide>
</swiper>
定义swiper实例,用于后续swiper操作,例如:跳转下一页、暂停自动播放等等
const swiperInstance = ref<typeof Swiper | null>(null);
事件方法定义
//初始化swiper后,为swiperInstance赋值
const onSwiper = (swiper: typeof Swiper) => {
swiperInstance.value = swiper;
};
//监听slide滑块更改事件回调
const onSlideChange = () => {
console.log('slide change');
};
实现效果

优化自动播放效果
当前自动播放不受外界影响,如果用户鼠标移入swiper,应该让swiper暂停滑动,方便用户查看当前滑块的具体信息;如果鼠标滑出swiper,应该继续自动滑动。
实现:
swiper组件监听鼠标移入、移出事件:
@mouseenter="pauseSwiper"
@mouseleave="resumeSwiper"
script中,实现对应的方法:
const pauseSwiper = () => {
if (swiperInstance.value) {
swiperInstance.value.autoplay.stop();
}
};
const resumeSwiper = () => {
if (swiperInstance.value) {
swiperInstance.value.autoplay.start();
}
};
自定义左右导航按钮
swiper自带的导航按钮,多数情况下需要根据UI设计调整其效果/样式。
此处我们模拟修改下,作用导航按钮。
script中,先实现左右切换滑块的功能:
const goPrev = ()=> {
if (swiperInstance.value) {
swiperInstance.value.slidePrev();
}
};
const goNext = () => {
if (swiperInstance.value) {
swiperInstance.value.slideNext();
}
};
swiper组件上不再配置默认的navigation属性。
导入按钮图片:

布局中新增左右按钮,并设置样式:
<div class="custom-navigation">
<img src="@/assets/img_pre.png" class="custom-swiper-button-prev" @click="goPrev">
<img src="@/assets/img_next.png" class="custom-swiper-button-next" @click="goNext">
</div>
.custom-swiper-button-prev, .custom-swiper-button-next {
position: absolute;
top: 50%;
transform: translateY(-50%);
z-index: 10;
color: #FFFFFF;
font-size: 20px;
width: 50px;
height: 50px;
}
.custom-swiper-button-next {
right: 20px;
}
.custom-swiper-button-prev {
left: 20px;
}
自定义导航按钮效果:

完整代码
<template>
<swiper
class="swiper-container"
:slides-per-view="1"
:space-between="0"
@swiper="onSwiper"
@slideChange="onSlideChange"
:modules="modules"
:pagination="{ clickable: true }"
:autoplay="{
delay: 2000,
disableOnInteraction: false,
}"
:loop="true"
@mouseenter="pauseSwiper"
@mouseleave="resumeSwiper"
>
<swiper-slide>
<img class="item" src="@/assets/banner/0.jpg"/>
</swiper-slide>
<swiper-slide>
<img class="item" src="@/assets/banner/1.jpg"/>
</swiper-slide>
<swiper-slide>
<img class="item" src="@/assets/banner/2.jpg"/>
</swiper-slide>
<swiper-slide>
<img class="item" src="@/assets/banner/3.jpg"/>
</swiper-slide>
</swiper>
<div class="custom-navigation">
<img src="@/assets/img_pre.png" class="custom-swiper-button-prev" @click="goPrev">
<img src="@/assets/img_next.png" class="custom-swiper-button-next" @click="goNext">
</div>
</template>
<script lang="ts" setup>
import {ref} from 'vue';
import {Swiper, SwiperSlide} from 'swiper/vue';
import {Navigation, Pagination, A11y, Autoplay} from 'swiper/modules';
import 'swiper/css';
import 'swiper/css/navigation';
import 'swiper/css/pagination';
import 'swiper/css/autoplay';
const modules = [Navigation, Pagination, A11y, Autoplay]
const swiperInstance = ref<typeof Swiper | null>(null);
const onSwiper = (swiper: typeof Swiper) => {
swiperInstance.value = swiper;
};
const onSlideChange = () => {
console.log('slide change');
};
const pauseSwiper = () => {
if (swiperInstance.value) {
swiperInstance.value.autoplay.stop();
}
};
const resumeSwiper = () => {
if (swiperInstance.value) {
swiperInstance.value.autoplay.start();
}
};
const goPrev = ()=> {
if (swiperInstance.value) {
swiperInstance.value.slidePrev();
}
};
const goNext = () => {
if (swiperInstance.value) {
swiperInstance.value.slideNext();
}
};
</script>
<style scoped>
.swiper-container {
background-color: white;
}
.item {
width: 100%;
height: auto;
}
.custom-swiper-button-prev, .custom-swiper-button-next {
position: absolute;
top: 50%;
transform: translateY(-50%);
z-index: 10;
color: #FFFFFF;
font-size: 20px;
width: 50px;
height: 50px;
}
.custom-swiper-button-next {
right: 20px;
}
.custom-swiper-button-prev {
left: 20px;
}
</style>
vue3 使用swiper轮播组件的更多相关文章
- 【Vue中的swiper轮播组件】
<template> <swiper :options="swiperOption" ref="mySwiper"> <!-- s ...
- 微信小程序_(组件)swiper轮播图
微信小程序swiper轮播图组件官方文档 传送门 Learn: swiper组件 一.swiper组件 indicator-dots:是否显示面板指示点[默认值false] autoplay:是否自动 ...
- 【Vue项目】尚品汇(三)Home模块+Floor模块+Swiper轮播图
写在前面 今天是7.23,这一篇内容主要完成了Home模块和部分Search模块的开发,主要是使用了swiper轮播图插件获取vuex仓库数据展示组件以及其他信息. 1 Search模块 1.1 Se ...
- 基于移动端Reactive Native轮播组件的应用与开发详解
总结下这段时间学习reactive native的一些东西,我们来认识一下,被炒得这么火的rn,究竟是个什么东西,以及如何去搭建自己的demo. reactive native是什么 由facebo ...
- 移动端Reactive Native轮播组件
移动端Reactive Native轮播组件 总结下这段时间学习reactive native的一些东西,我们来认识一下,被炒得这么火的rn,究竟是个什么东西,以及如何去搭建自己的demo. reac ...
- 使用Swiper轮播插件引起的探索
提到Swiper轮播插件,小伙伴们应该不会感到陌生.以前我主要在移动端上使用,PC端使用较少. 注:这里需要注意的是,在PC端和移动端使用Swiper是不同的 官方给的版本有三个,分别是Swiper2 ...
- vue中引用swiper轮播插件
有时候我们需要在vue中使用轮播组件,如果是在vue组件中引入第三方组件的话,最好通过npm安装,从而进行统一安装包管理. 申明:本文所使用的是vue.2x版本. 通过npm安装插件: npm ins ...
- React-Native之轮播组件looped-carousel的介绍与使用
React-Native之轮播组件looped-carousel的介绍与使用 一,关于react-native轮播组件的介绍与对比 1,react-native-swiper在动态使用网页图片,多张图 ...
- vue中引入awesomeswiper的方法以及编写轮播组件
1.先安装less-loader npm install less less-loader --save 2.再安装css-loader npm install css-loader --save 3 ...
- vue-awesome-swipe 基于vue使用的轮播组件 使用(改)
npm install vue-awesome-swiper --save //基于vue使用的轮播组件 <template> <swiper :options="swi ...
随机推荐
- Python按条件删除Excel表格数据的方法
本文介绍基于Python语言,读取Excel表格文件,基于我们给定的规则,对其中的数据加以筛选,将不在指定数据范围内的数据剔除,保留符合我们需要的数据的方法. 首先,我们来明确一下本文的具体需 ...
- 2024-08-17:用go语言,给定一个从0开始的整数数组nums和一个整数k, 每次操作可以删除数组中的最小元素。 你的目标是通过这些操作,使得数组中的所有元素都大于或等于k。 请计算出实现这个目
2024-08-17:用go语言,给定一个从0开始的整数数组nums和一个整数k, 每次操作可以删除数组中的最小元素. 你的目标是通过这些操作,使得数组中的所有元素都大于或等于k. 请计算出实现这个目 ...
- Cloudflare R2 - 免费图床
前言 之前看了一篇文章,关于介绍 Cloudflare R2 来搭建图床的方案,主要是白嫖 Cloudflare 的空间和 cdn 服务.我现在博客 DevNow 的 CDN 使用的是七牛云,偶尔还是 ...
- pikachu靶场-验证码
先打开靶场,然后打开你的十米大砍刀burp,再把浏览器代理给配置好,开搞 1.先随便输入帐号和密码,用burp抓包 2.burp抓到包后用快捷键ctrl+l打开Intruder 3.确定 4.选择cl ...
- 从cmake解决clion编译生成的可执行文件(.exe)不可执行的问题
我这里没有显示报错,是直接闪退的情况,但是网上搜索的时候大多数是有报错弹窗的,运行报错提示为无法链接动态库.如下图: ![原图来自CSDN@LJY_kt11 一句话说清楚 原因是使用CLion编译的程 ...
- Android Adapter分页显示异常: 首页数据在屏幕内全显示,无法上滑分页
前情提要: Android 端Adapter分页,下拉刷新,上滑分页, 原有流程:上滑时,滑动触及底部,触发Adapter的onScrolled的方法 异常情况:第一页数据完全显示,导致上滑时,未触及 ...
- sicp每日一题[2.1]
Exercise 2.1 Exercise 2.1: Define a better version of make-rat that handles both positive and negati ...
- Redis 入门 - 图形化管理工具如何选择,最全分类
工欲善其事必先利其器,上一章Redis服务环境已经搭建完成,现在就需要一个趁手的工具,有个好工具可以做到事半功倍. Redis图形化管理工具五花八门,可供选择的很多,大家可以根据自己的需求应用场景进行 ...
- Coze插件发布!PDF转Markdown功能便捷集成,打造你的专属智能体
近日,TextIn开发的PDF转Markdown插件正式上架Coze平台. 在扣子搜索"pdf转markdown",或在Coze平台搜索"pdf2markdown&quo ...
- ASP.NET Core – Data Protection & Azure Storage + Azure Key Vault
前言 以前就写过很多篇了 Asp.net core 学习笔记 ( Data protection ) Asp.net core 学习笔记 Secret 和 Data Protect Azure key ...