从 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-slides | swiper-container |
ion-slide | swiper-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-container
的 modules
属性来安装 IonicSlides
模块
- Angular
- Angular(独立)
// home.page.ts
import { IonicSlides } from '@ionic/angular';
@Component({
...
})
export class HomePage {
swiperModules = [IonicSlides];
}
// home.page.ts
import { IonicSlides } from '@ionic/angular/standalone';
@Component({
...
})
export class HomePage {
swiperModules = [IonicSlides];
}
<!-- home.page.html -->
<swiper-container [modules]="swiperModules"> ... </swiper-container>
如果您使用的是 Swiper 的核心版并且已安装其他模块,请确保 IonicSlides
是数组中的最后一个模块。这将允许它自动自定义分页、滚动条、缩放等模块的设置。
属性
Swiper 选项应作为单独的属性直接提供给 <swiper-container>
组件。
假设在一个使用 ion-slides
的应用程序中,我们设置了 slidesPerView
和 loop
选项
<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 事件 |
---|---|
ionSlideWillChange | swiperslidechangetransitionstart |
ionSlideDidChange | swiperslidechange |
ionSlideDoubleTap | swiperdoubletap |
ionSlideDrag | swiperslidermove |
ionSlideNextStart | swiperslidenexttransitionstart |
ionSlideNextEnd | swiperslidenexttransitionend |
ionSlidePrevStart | swiperslideprevtransitionstart |
ionSlidePrevEnd | swiperslideprevtransitionend |
ionSlideReachStart | swiperreachbeginning |
ionSlideReachEnd | swiperreachend |
ionSlideTap | swipertap |
ionSlideTouchStart | swipertouchstart |
ionSlideTouchEnd | swipertouchend |
ionSlideTransitionStart | swipertransitionstart |
ionSlideTransitionEnd | swipertransitionend |
ionSlidesDidLoad | swiperinit |
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() | 改为使用 allowSlideNext 、allowSlidePrev 和 allowTouchMove 属性。 |
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