我正在使用ionic开发移动应用程序,我想通过放置幻灯片来制作类似松弛的侧边菜单。
例如,当您单击主菜单项时,它会像松弛一样在侧菜单中滑出另一张幻灯片。
我尝试在离子菜单中使用离子幻灯片,但幻灯片无法正常工作。
请查看屏幕截图。
这是代码段。
<ion-menu [content]="mycontent" [swipeEnabled]="false">
<ion-content>
<ion-slides>
<ion-slide>
<h1>Slide 1</h1>
</ion-slide>
<ion-slide>
<h1>Slide 2</h1>
</ion-slide>
<ion-slide>
<h1>Slide 3</h1>
</ion-slide>
</ion-slides>
</ion-content>
</ion-menu>
<ion-nav #mycontent [root]="rootPage"></ion-nav>
这就是我要构建的。
关于如何实现这一点的任何想法?
谢谢。
答案 0 :(得分:0)
离子滑动组件利用引擎盖下的Swiper库。 Swiper的部分初始化代码取决于了解幻灯片容器的宽度,并且该代码使用clientWidth
来获取它。由于菜单以display:none
开始,因此检索到的宽度始终为零,并且初始化代码将依托于您。
您可以通过在Swiper初始化时临时设置display:block
来解决此问题。我在组件内有侧面菜单,因此您可能需要根据情况调整以下代码:
app.html:
<sidebar [content]="content"></sidebar>
<ion-nav #content [root]="rootPage" swipeBackEnabled="false"></ion-nav>
sidebar.html:
<ion-menu [content]="content" swipeEnabled="false">
<ion-content>
<ion-slides pager>
<ion-slide>
<h2>Slide 1</h2>
</ion-slide>
<ion-slide>
<h2>Slide 2</h2>
</ion-slide>
<ion-slide>
<h2>Slide 3</h2>
</ion-slide>
</ion-slides>
</ion-content>
</ion-menu>
sidebar.component.ts:
...
@Component({
selector: 'sidebar',
templateUrl: 'sidebar.html',
})
export class SidebarComponent implements AfterViewInit {
@Input('content') content: NavController;
@ViewChild(Slides) slides: Slides;
@ViewChild(Menu, { read: ElementRef }) menuRef: ElementRef;
// Use Renderer2 instead of direct DOM manipulation through the
// ElementRef.nativeElement.
//
// @see: https://medium.com/@kmathy/angular-manipulate-properly-the-dom-with-renderer-16a756508cba
//
constructor(private renderer: Renderer2) {
}
// ViewChild template references might not be available until
// AfterViewInit lifecycle hook runs.
//
// @see: https://blog.angular-university.io/angular-viewchild/
//
ngAfterViewInit() {
this.renderer.setStyle(this.menuRef.nativeElement, 'display', 'block');
setTimeout(() => {
// Swiper init has its own ngAfterViewInit code that delays 300ms
// before running. Don't remove the 'display' style until after that.
this.renderer.removeStyle(this.menuRef.nativeElement, 'display');
}, 310);
}
}