vue3 使用swiper轮播组件

1. 本地环境信息参考

node版本:

js 复制代码
nodejs : v18.20.4
npm : 10.7.0

vue版本

js 复制代码
  "dependencies": {
    "vue": "^3.2.13",
    ...
  }

2. 安装swiper依赖

执行命令:

js 复制代码
npm i swiper

安装后,查看工程中的package.json文件,新增了swiper依赖(默认最新版):

复制代码
  "dependencies": {
    "swiper": "^11.1.14",
    "vue": "^3.2.13",
    ...
  }

3. 轮播图默认效果

模拟轮播图需求说明:

1、多张图片,可自动播放

2、有指示器

3、有左右导航按钮(向前、向后)

图片导入工程
代码实现 & 释义:

导入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、属性、事件等

js 复制代码
<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>

: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实例,用于后续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');
};
实现效果
完整代码参考
js 复制代码
<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>

4. 优化自动播放效果

如果用户鼠标移入swiper,应该让swiper暂停滑动,方便用户查看当前滑块的具体信息;如果鼠标滑出swiper,应该继续自动滑动。

实现:

swiper ui组件监听鼠标移入、移出事件:

js 复制代码
@mouseenter="pauseSwiper"
@mouseleave="resumeSwiper"

script代码中,实现对应的方法:

js 复制代码
const pauseSwiper = () => {
  if (swiperInstance.value) {
    swiperInstance.value.autoplay.stop();
  }
};
const resumeSwiper = () => {
  if (swiperInstance.value) {
    swiperInstance.value.autoplay.start();
  }
};

5. 自定义左右导航按钮

多数情况下,需要参考项目的UI设计稿,调整左右导航按钮效果/样式。

此处,我们模拟修改下,使用两张图片作为左右导航按钮。

script中,先实现左右切换滑块的功能:

js 复制代码
const goPrev = ()=> {
  if (swiperInstance.value) {
    swiperInstance.value.slidePrev();
  }
};
const goNext = () => {
  if (swiperInstance.value) {
    swiperInstance.value.slideNext();
  }
};

swiper ui组件上不再配置默认的navigation属性。

导入按钮图片:

布局中新增左右按钮,并设置其样式:

js 复制代码
  <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>
相关推荐
csdn2015_26 分钟前
nodejs安装
node.js·vue
布兰妮甜37 分钟前
从 0 搭建企业级 Vue3/Vite 脚手架(规范、eslint、husky、打包、环境变量全流程)
typescript·vue3·vite·脚手架·前端工程化
gis开发之家19 小时前
《Vue3 从入门到大神35篇》Vue3 源码详解(五):effect 依赖收集原理——track 与 trigger 是如何工作的?
javascript·typescript·前端框架·vue3·vue3源码
华玥作者2 天前
uniapp 万条数据不卡顿:我写了个虚拟列表组件 hy-list,原生支持瀑布流
数据结构·uni-app·list·vue3
jieyucx2 天前
Nuxt4阶段一:环境搭建与第一个 Nuxt 4 项目
vue·nuxt·全栈·ssr
小堂子这厢有礼了3 天前
Chet.Admin 模块详解②:用户管理与个人中心
vue·rbac·后台管理系统·用户权限·.net10·vbenadmin
sugar__salt3 天前
Vue.js 前置知识:ES6+ 核心特性完全指南
前端·javascript·vue.js·vue·es6
sugar__salt3 天前
Vue3 基础知识点整理 —— 从入门到响应式核心完全指南
vue.js·笔记·vue·vue3
万亿少女的梦1684 天前
基于微信小程序、Spring Boot与Vue3的智慧养老管理系统设计与实现
spring boot·redis·微信小程序·mybatis·vue3
钛态4 天前
前端安全防线:CSRF 攻击链路与双重 Token 校验的工程实现
前端·vue·react·web