跳到主要内容
版本:v8

从 ion-slides 迁移到 Swiper.js

正在寻找 ion-slides

ion-slides 已在 v6.0.0 中弃用,并在 v7.0.0 中移除。我们建议直接使用 Swiper.js 库。迁移过程如下所述。

如果你需要现代触摸滑块组件,我们推荐使用 Swiper.js。Swiper 9 引入了 Swiper Element 作为其 Angular 组件的替代品,因此本指南将介绍如何在 Ionic Framework 应用中设置 Swiper Element。它还将介绍从 ion-slides 迁移到 Swiper Element 所需的任何迁移信息。

入门

首先,更新到最新版本的 Ionic:

npm install @ionic/angular@latest

完成后,在项目中安装 Swiper 依赖项:

npm install swiper@latest

接下来,我们需要添加 CUSTOM_ELEMENTS_SCHEMA,告诉 Angular 我们将使用自定义元素。这可以在 app.module.ts 中完成,或者在你将使用 Swiper 的组件的模块文件中完成。

import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';

@NgModule({
schemas: [..., CUSTOM_ELEMENTS_SCHEMA]
});
...

最后,我们需要调用 Swiper 的 register 函数来全局注册 Swiper 的自定义元素。这只需执行一次,因此将其放在 app.component.ts 中。

import { register } from 'swiper/element/bundle';

register();

@Component({
...
})
...

从那里,我们只需将 ion-slides 元素替换为 swiper-container,将 ion-slide 元素替换为 swiper-slide。请注意,这些自定义元素无需导入,因为调用 register 会自动让 Angular 知道它们。

<swiper-container>
<swiper-slide>Slide 1</swiper-slide>
<swiper-slide>Slide 2</swiper-slide>
<swiper-slide>Slide 3</swiper-slide>
</swiper-container>

捆绑版与核心版

默认情况下,请确保从 swiper/element/bundle 导入 register 函数。这使用 Swiper 的捆绑版本,自动包含运行 Swiper 各种功能所需的所有模块和样式表。

如果你希望使用核心版本(不会自动包含额外模块),请参阅 https://swiperjs.com/element#core-version-and-modules。本迁移指南的其余部分将假设你使用捆绑版本。

滑动样式

要迁移 CSS,首先更新选择器以定位新的自定义元素:

ion-slides 选择器Swiper 选择器
ion-slidesswiper-container
ion-slideswiper-slide

如果你使用了 ion-slides 上的 CSS 自定义属性,下面是 Swiper 中对应属性的列表。

ion-slides CSS 属性swiper-container CSS 属性
--bullet-background--swiper-pagination-bullet-inactive-color
--bullet-background-active--swiper-pagination-color
--progress-bar-background--swiper-pagination-progressbar-bg-color
--progress-bar-background-active--swiper-pagination-color
--scroll-bar-background--swiper-scrollbar-bg-color
--scroll-bar-background-active--swiper-scrollbar-drag-bg-color

对于额外的自定义 CSS,由于 Swiper Element 使用 Shadow DOM 封装,样式需要注入到 Shadow DOM 作用域中。请参阅 https://swiperjs.com/element#injecting-styles 获取说明。

额外的 ion-slides 样式

ion-slides 组件有额外的样式,有助于创建原生外观和感觉。这些样式不是在 Ionic 中使用 Swiper.js 所必需的,但如果你希望尽可能保持 ion-slides 的外观,请将以下 CSS 添加到你的 global.scss

swiper-container {
--swiper-pagination-bullet-inactive-color: var(--ion-text-color-step-800, #cccccc);
--swiper-pagination-color: var(--ion-color-primary, #0054e9);
--swiper-pagination-progressbar-bg-color: rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.25);
--swiper-scrollbar-bg-color: rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.1);
--swiper-scrollbar-drag-bg-color: rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.5);
}

swiper-slide {
display: flex;
position: relative;

flex-direction: column;
flex-shrink: 0;
align-items: center;
justify-content: center;

width: 100%;
height: 100%;

font-size: 18px;

text-align: center;
box-sizing: border-box;
}

swiper-slide img {
width: auto;
max-width: 100%;
height: auto;
max-height: 100%;
}

IonicSlides 模块

使用 ion-slides 时,Ionic 自动自定义了数十个 Swiper 属性。这带来了在移动设备上滑动时流畅的体验。我们建议使用 IonicSlides 模块,以确保直接使用 Swiper 时也能设置这些属性。但是,在 Ionic 中使用 Swiper.js 不是必须使用此模块。

建议查看 IonicSlides 设置的属性列表,并决定哪些属性是你想要自定义的。

我们可以通过导入 IonicSlides 模块并将其作为数组传递给 swiper-containermodules 属性来安装它:

// home.page.ts

import { IonicSlides } from '@ionic/angular';

@Component({
...
})
export class HomePage {
swiperModules = [IonicSlides];
}
<!-- home.page.html -->

<swiper-container [modules]="swiperModules"> ... </swiper-container>
备注

如果你使用 Swiper 核心版本并安装了额外的模块,请确保 IonicSlides 是数组中的最后一个模块。这将使其自动自定义分页器、滚动条、缩放等模块的设置。

属性

Swiper 选项应作为独立的属性直接提供给 <swiper-container> 组件。

假设在使用 ion-slides 的应用中,我们设置了 slidesPerViewloop 选项:

<ion-slides [options]="{ slidesPerView: 3, loop: true }">
<ion-slide>Slide 1</ion-slide>
<ion-slide>Slide 3</ion-slide>
<ion-slide>Slide 3</ion-slide>
</ion-slides>

要将这些选项作为属性直接设置在 <swiper-container> 上,我们可以这样做:

<swiper-container [slidesPerView]="3" [loop]="true">
<swiper-slide>Slide 1</swiper-slide>
<swiper-slide>Slide 2</swiper-slide>
<swiper-slide>Slide 3</swiper-slide>
</swiper-container>

以下是从 ion-slides 迁移到 Swiper Element 时的完整属性变更列表:

名称说明
options将每个选项作为属性直接设置在 <swiper-container> 组件上。
mode要根据模式应用不同样式,可以在 CSS 中使用 .ios swiper-container.md swiper-container 来定位幻灯片。
pager改用 pagination 属性。
备注

Swiper Element 中所有可用的属性可以在 https://swiperjs.com/swiper-api#parameters 找到。

事件

由于 swiper-container 组件不是由 Ionic Framework 提供的,事件名称将不会有 ionSlide 前缀。此外,所有事件名称应使用小写而不是驼峰命名。

假设在使用 ion-slides 的应用中,我们使用了 ionSlideDidChange 事件:

<ion-slides (ionSlideDidChange)="onSlideChange()">
<ion-slide>Slide 1</ion-slide>
<ion-slide>Slide 3</ion-slide>
<ion-slide>Slide 3</ion-slide>
</ion-slides>

要迁移,我们将事件名称改为 swiperslidechange

<swiper-container (swiperslidechange)="onSlideChange()">
<swiper-slide>Slide 1</swiper-slide>
<swiper-slide>Slide 2</swiper-slide>
<swiper-slide>Slide 3</swiper-slide>
</swiper-container>

以下是从 ion-slides 迁移到 Swiper Element 时的完整事件名称变更列表:

ion-slides 事件Swiper 事件
ionSlideWillChangeswiperslidechangetransitionstart
ionSlideDidChangeswiperslidechange
ionSlideDoubleTapswiperdoubletap
ionSlideDragswiperslidermove
ionSlideNextStartswiperslidenexttransitionstart
ionSlideNextEndswiperslidenexttransitionend
ionSlidePrevStartswiperslideprevtransitionstart
ionSlidePrevEndswiperslideprevtransitionend
ionSlideReachStartswiperreachbeginning
ionSlideReachEndswiperreachend
ionSlideTapswipertap
ionSlideTouchStartswipertouchstart
ionSlideTouchEndswipertouchend
ionSlideTransitionStartswipertransitionstart
ionSlideTransitionEndswipertransitionend
ionSlidesDidLoadswiperinit
备注

Swiper Element 中所有可用的事件可以在 https://swiperjs.com/swiper-api#events 找到,并且应使用小写并以 swiper 为前缀。

方法

大多数方法已被移除,转而直接访问 Swiper 实例的属性。要访问 Swiper 实例,首先获取 <swiper-container> 元素的引用(例如通过 ViewChild),然后访问其 swiper 属性:

<!-- slides.component.html -->

<swiper-container #swiper>
<swiper-slide>Slide 1</swiper-slide>
<swiper-slide>Slide 2</swiper-slide>
<swiper-slide>Slide 3</swiper-slide>
</swiper-container>
// slides.component.ts

import { ..., ElementRef, ViewChild } from '@angular/core';

@Component({
...
})
export class SlidesExample {
@ViewChild('swiper')
swiperRef: ElementRef | undefined;

logActiveIndex() {
console.log(this.swiperRef?.nativeElement.swiper.activeIndex);
}
}

以下是从 ion-slides 迁移到 Swiper Element 时的完整方法变更列表:

ion-slides 方法说明
getActiveIndex()改用 activeIndex 属性。
getPreviousIndex()改用 previousIndex 属性。
getSwiper()使用 swiper 属性获取 Swiper 实例的引用。参见上面的示例。
isBeginning()改用 isBeginning 属性。
isEnd()改用 isEnd 属性。
length()改用 slides 属性。(例如 swiper.slides.length)
lockSwipeToNext()改用 allowSlidesNext 属性。
lockSwipeToPrev()改用 allowSlidePrev 属性。
lockSwipes()改用 allowSlideNextallowSlidePrevallowTouchMove 属性。
startAutoplay()改用 autoplay 属性。
stopAutoplay()改用 autoplay 属性。
备注

Swiper 实例上的所有可用方法和属性可以在 https://swiperjs.com/swiper-api#methods-and-properties 找到。

效果

诸如 Cube 或 Fade 之类的效果可以在 Swiper Element 中使用,无需额外导入,只要你使用的是 Swiper 的捆绑版本。例如,以下代码将使幻灯片具有翻转过渡效果:

<swiper-container effect="flip"> ... </swiper-container>
备注

有关 Swiper 效果的更多信息,请参阅 https://swiperjs.com/swiper-api#fade-effect

总结

现在你已经安装了 Swiper,有一整套新的 Swiper 功能供你使用。我们建议从 Swiper Element 文档开始,然后参考 Swiper API 文档

常见问题

我在哪里可以找到迁移示例?

你可以在 https://github.com/ionic-team/slides-migration-samples 找到包含 ion-slides 和等效 Swiper 用法的示例应用。

我在哪里可以获得迁移帮助?

如果你在迁移过程中遇到问题,请在 Ionic 论坛上发帖。

我在哪里提交错误报告?

在提交问题之前,请考虑在 Swiper 讨论板Ionic 论坛上发帖,看看你的问题是否可以通过社区解决。

如果你遇到 Swiper 库的问题,新的错误应提交到 Swiper 仓库:https://github.com/nolimits4web/swiper/issues

如果你遇到 IonicSlides 模块的问题,新的错误应提交到 Ionic Framework 仓库:https://github.com/ionic-team/ionic-framework/issues