是否可以在离子边栏中使用幻灯片

时间:2019-01-28 08:35:32

标签: ionic-framework ionic3 ion-slides

我正在使用ionic开发移动应用程序,我想通过放置幻灯片来制作类似松弛的侧边菜单。

例如,当您单击主菜单项时,它会像松弛一样在侧菜单中滑出另一张幻灯片。

我尝试在离子菜单中使用离子幻灯片,但幻灯片无法正常工作。

请查看屏幕截图。

enter image description here

这是代码段。

<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>

这就是我要构建的。

enter image description here

关于如何实现这一点的任何想法?

谢谢。

1 个答案:

答案 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);
  }

}