跳至主要内容
版本: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({
...
})
...

从那里开始,我们只需要用 swiper-container 替换 ion-slides 元素,用 swiper-slide 替换 ion-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://swiper.js.cn/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://swiper.js.cn/element#injecting-styles

其他 ion-slides 样式

ion-slides 组件有其他样式,这些样式有助于创建原生外观和感觉。这些样式是 必须将 Swiper.js 与 Ionic 一起使用,但如果您想尽可能地保持 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 时也设置这些属性。但是,使用此模块是 必须将 Swiper.js 用于 Ionic。

建议您查看 属性IonicSlides 设置,并确定您希望自定义哪些属性。

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

// 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://swiper.js.cn/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 Angular 时事件名称更改的完整列表

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

Swiper Element 中的所有可用事件都可以在 https://swiper.js.cn/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 元素时方法更改的完整列表。

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://swiper.js.cn/swiper-api#methods-and-properties.

效果

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

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

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

总结

现在您已经安装了 Swiper,您可以享受一系列新的 Swiper 功能。我们建议您从 Swiper 元素文档 开始,然后参考 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