Swiper 教程:从零开始构建强大的轮播图

Swiper 是一个现代、免费且功能强大的移动端触摸滑动库,同时也在桌面端表现出色,它非常适合用于创建轮播图、图片画廊、多标签页等滑动交互效果。


第一部分:入门指南 - 创建你的第一个 Swiper

安装 Swiper

你有几种方式可以将 Swiper 引入到你的项目中:

直接引入 (CDN) - 最简单,适合快速上手和原型开发

在 HTML 文件的 <head> 中引入 Swiper 的 CSS,在 <body> 底部引入 Swiper 的 JS。

<!-- Swiper CSS -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.css"/>
<!-- Swiper JS -->
<script src="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.js"></script>

使用 npm/yarn - 适合现代前端项目 (如 React, Vue, Angular)

npm install swiper
# 或者
yarn add swiper

然后在你的项目入口文件中引入:

// 引入 Swiper 核心样式
import 'swiper/css';
// 引入所需模块的样式 (Navigation, Pagination)
import 'swiper/css/navigation';
import 'swiper/css/pagination';
// 引入 Swiper 核心
import { Swiper, Navigation, Pagination } from 'swiper';
// 初始化 Swiper 时注册模块
const swiper = new Swiper('.swiper', {
  modules: [Navigation, Pagination],
  // ... 配置选项
});

创建基础的 HTML 结构

Swiper 的核心结构由三个主要部分组成:

  1. 容器: 一个包裹整个滑动组件的 <div>,通常会设置一个 idclass
  2. 包装器: 容器内部的 <div class="swiper-wrapper">,用于包裹所有的“幻灯片”。
  3. 幻灯片: 包装器内部的每个 <div class="swiper-slide">,这就是你想要滑动的内容。
<!-- 1. 定义容器 -->
<div class="swiper mySwiper">
  <!-- 2. 定义包装器 -->
  <div class="swiper-wrapper">
    <!-- 3. 定义幻灯片 -->
    <div class="swiper-slide">Slide 1</div>
    <div class="swiper-slide">Slide 2</div>
    <div class="swiper-slide">Slide 3</div>
    <div class="swiper-slide">Slide 4</div>
    <div class="swiper-slide">Slide 5</div>
  </div>
  <!-- 如果需要分页器 -->
  <div class="swiper-pagination"></div>
  <!-- 如果需要导航按钮 -->
  <div class="swiper-button-next"></div>
  <div class="swiper-button-prev"></div>
  <!-- 如果需要滚动条 -->
  <div class="swiper-scrollbar"></div>
</div>

初始化 Swiper

在 HTML 结构之后,你需要编写 JavaScript 代码来初始化你的 Swiper。

使用 CDN:

直接在 <script> 标签内编写。

<script>
  document.addEventListener('DOMContentLoaded', function () {
    // 初始化 Swiper
    new Swiper(".mySwiper", {
      // 基础配置
      loop: true, // 循环模式
      // 其他配置项...
    });
  });
</script>

使用 npm/yarn:

在你的 JS 文件中,如 main.jsapp.js 中初始化。

import Swiper from 'swiper';
import { Navigation, Pagination } from 'swiper/modules';
// 注册模块
Swiper.use([Navigation, Pagination]);
const swiper = new Swiper('.mySwiper', {
  // 基础配置
  loop: true,
  // 其他配置项...
});

添加一些基础样式

为了让 Swiper 看起来正常,你需要给容器和幻灯片设置宽度和高度。

/* 确保容器有尺寸 */
.mySwiper {
  width: 600px;
  height: 300px;
}
/* 幻灯片内容居中显示 */
.swiper-slide {
  display: flex;
  justify-content: center;
  align-items: center;
  font-size: 18px;
  color: #fff;
  background-color: #007aff;
}

恭喜你!你已经创建了一个最基础的、可以左右滑动的轮播图了。


第二部分:常用配置与功能详解

Swiper 的强大之处在于其丰富的配置选项和模块。

核心配置

配置项 类型 默认值 描述
slidesPerView number | 'auto' 1 每次显示的幻灯片数量。
spaceBetween number 0 幻灯片之间的间距(单位:px)。
initialSlide number 0 初始化时显示的幻灯片索引(从0开始)。
loop boolean false 是否开启循环模式。
speed number 300 切换幻灯片的速度(单位:毫秒)。
autoplay object undefined 自动播放配置。{ delay: 3000, disableOnInteraction: false }
effect 'slide' | 'fade' | 'cube' | 'coverflow' 'slide' 切换效果。'fade'是淡入淡出,'cube'是立方体,'coverflow'是3D流。

示例:创建一个展示多张图片的横向滚动画廊

const swiper = new Swiper(".mySwiper", {
  slidesPerView: 3, // 一次显示3张
  spaceBetween: 30, // 幻灯片间距30px
  loop: true,
  pagination: {
    el: ".swiper-pagination",
    clickable: true,
  },
  navigation: {
    nextEl: ".swiper-button-next",
    prevEl: ".swiper-button-prev",
  },
});

功能模块

Swiper 的很多功能都是通过“模块”实现的,使用时需要先引入 CSS 和 JS,并在初始化时注册。

a. 分页器

显示当前是第几页,并可以点击跳转。

  • HTML: 添加 <div class="swiper-pagination"></div>
  • JS: 引入 'swiper/css/pagination'Pagination 模块。
import Swiper from 'swiper';
import { Pagination } from 'swiper/modules';
import 'swiper/css/pagination';
Swiper.use([Pagination]);
new Swiper('.mySwiper', {
  pagination: {
    el: '.swiper-pagination', // 指定分页器元素
    clickable: true, // 点击分页器可切换幻灯片
    dynamicBullets: true, // 动态小点
  },
});

b. 导航按钮

左右箭头,用于手动切换。

  • HTML: 添加 <div class="swiper-button-next"></div><div class="swiper-button-prev"></div>
  • JS: 引入 'swiper/css/navigation'Navigation 模块。
import Swiper from 'swiper';
import { Navigation } from 'swiper/modules';
import 'swiper/css/navigation';
Swiper.use([Navigation]);
new Swiper('.mySwiper', {
  navigation: {
    nextEl: '.swiper-button-next', // 右箭头
    prevEl: '.swiper-button-prev', // 左箭头
  },
});

c. 滚动条

显示一个类似原生浏览器滚动条的指示器。

  • HTML: 添加 <div class="swiper-scrollbar"></div>
  • JS: 引入 'swiper/css/scrollbar'Scrollbar 模块。
import Swiper from 'swiper';
import { Scrollbar } from 'swiper/modules';
import 'swiper/css/scrollbar';
Swiper.use([Scrollbar]);
new Swiper('.mySwiper', {
  scrollbar: {
    el: '.swiper-scrollbar', // 指定滚动条元素
    draggable: true, // 是否可拖动
  },
});

第三部分:进阶技巧

响应式配置

你可以根据屏幕宽度设置不同的参数。

const swiper = new Swiper(".mySwiper", {
  slidesPerView: 1,
  spaceBetween: 10,
  // 当屏幕宽度 >= 640px 时
  breakpoints: {
    640: {
      slidesPerView: 2,
      spaceBetween: 20,
    },
    768: {
      slidesPerView: 3,
      spaceBetween: 30,
    },
    1024: {
      slidesPerView: 4,
      spaceBetween: 40,
    },
  },
});

获取 Swiper 实例并调用方法

你可以在初始化 Swiper 时将实例保存到一个变量中,以便后续调用其方法。

const mySwiper = new Swiper('.mySwiper', {
  // ... 配置
});
// 获取当前活动幻灯片的索引
console.log(mySwiper.activeIndex);
// 切换到第三张幻灯片 (索引从0开始)
mySwiper.slideTo(2, 1000, true); // (index, speed, runCallbacks)
// 开始自动播放
mySwiper.autoplay.start();
// 停止自动播放
mySwiper.autoplay.stop();

监听事件

Swiper 提供了丰富的事件,让你可以在特定时机执行代码。

const swiper = new Swiper('.mySwiper', {
  // ... 配置
});
// 当滑动开始时触发
swiper.on('slideChangeTransitionStart', function () {
  console.log('Slide transition started');
});
// 当滑动结束时触发
swiper.on('slideChangeTransitionEnd', function () {
  console.log('Slide transition ended');
  console.log('Current slide index is:', swiper.activeIndex);
});

第四部分:常见问题与解决方案 (FAQ)

Q1: 为什么我的 Swiper 初始化了,但是不能滑动?

A: 最常见的原因是容器没有设置宽度和高度,Swiper 需要一个明确的尺寸来计算布局,请确保你的 CSS 中给 .swiper 类设置了 widthheight

Q2: 如何在 React/Vue 中使用 Swiper?

A: Swiper 是一个原生 JS 库,不依赖于任何框架,你只需要在组件挂载后(useEffectmounted 钩子)初始化它,并在组件卸载时销毁它,以避免内存泄漏。

React 示例 (使用 useEffectuseRef):

import { useEffect, useRef } from 'react';
import Swiper from 'swiper';
import 'swiper/css';
function MySwiperComponent() {
  const swiperRef = useRef(null);
  useEffect(() => {
    // 初始化 Swiper
    const swiperInstance = new Swiper(swiperRef.current, {
      loop: true,
      pagination: { el: '.swiper-pagination' },
    });
    // 清理函数,在组件卸载时销毁 Swiper 实例
    return () => {
      swiperInstance.destroy();
    };
  }, []); // 空依赖数组确保只在组件挂载和卸载时运行
  return (
    <div ref={swiperRef} className="swiper">
      <div className="swiper-wrapper">
        <div className="swiper-slide">Slide 1</div>
        <div className="swiper-slide">Slide 2</div>
        <div className="swiper-slide">Slide 3</div>
      </div>
      <div className="swiper-pagination"></div>
    </div>
  );
}

Q3: 如何实现垂直方向的滑动?

A: 只需在 CSS 中给 .swiper-wrapper 添加 transform-style: preserve-3d; 并在 JS 中设置 direction: 'vertical'

new Swiper('.mySwiper', {
  direction: 'vertical', // 设置为垂直方向
  loop: true,
});

Q4: Swiper 的官方文档在哪里?

A: Swiper 官方文档 是最权威、最全面的资源,包含了所有配置项、方法和事件的详细说明。


通过这份教程,你应该已经掌握了 Swiper 的基本使用方法,从创建第一个轮播图,到配置分页器、导航按钮,再到响应式布局和框架集成,Swiper 都提供了非常灵活和强大的解决方案。

实践是最好的老师,多尝试不同的配置组合,查看官方文档,你很快就能熟练运用 Swiper 构建出各种精美的滑动交互效果。