需要定期暂停 Carousel 动画并调用一个函数

Posted

技术标签:

【中文标题】需要定期暂停 Carousel 动画并调用一个函数【英文标题】:Need to pause the Carousel animation regularly and call a function 【发布时间】:2021-05-08 16:29:13 【问题描述】:

我有一个轮播动画:

这工作正常,但我需要在一段时间后暂停它并调用一个函数。

一旦卡片改变位置,我想暂停它,调用我的函数,一旦该函数的执行结束,再次重新启动动画。我想无限期地这样做。

我正在使用AnimationBuilderbuild() 函数创建我的动画。

我尝试使用AnimationPlayerpause()restart() 方法,但无法正确设置。

这是 Stackblitz link。

这是我的代码:

.ts: animateCarousel() 包含动画定义。

  @ViewChildren("card") items: QueryList<ElementRef>;
  @ViewChild("container") container: ElementRef;
  @ViewChild("dataInit") dataInit: ElementRef;
  rect: any;
  private player: AnimationPlayer;
  timing = "2000ms ease-in-out";
  selectedIndex = 0;
  rectElement: any;
  order: number[] = this.data.map((_x, i) => this.data.length - i);
  constructor(private builder: AnimationBuilder) 

  ngAfterViewInit() 
    this.calculateDimensions();
    this.animateCarousel();
  

  calculateDimensions() 
    this.rectElement = this.items.first.nativeElement.getBoundingClientRect();
    const rect = this.dataInit.nativeElement.getBoundingClientRect();
    const rectContainer = this.container.nativeElement.getBoundingClientRect();

    this.rect = ;
    this.rect.height = rectContainer.height - rect.y;
    this.rect.y = rect.y;
    this.rect.width = rectContainer.width - this.rectElement.width;
  

  animateCarousel() 
    this.items.forEach((item: ElementRef, index: number) => 
      this.order[index] = this.items.length - ((index + this.selectedIndex) % this.items.length);
      const itemStyle = this.items.length > 5 ? this.getStyle2(index) : this.getStyle(index);

      const myAnimation = this.builder.build([
        animate(this.timing, style(itemStyle))
      ]);

      this.player = myAnimation.create(item.nativeElement);

      if (index == 0)
        this.player.onDone(() => 
          this.calculateDimensions();
          this.selectedIndex =
            (this.selectedIndex + this.items.length - 1) % this.items.length;

          this.animateCarousel();
        );

      this.player.play();
    );
  

.html:

<div #container class="container">

    <div class="header">
        A Simple Carousel
    </div>
    <div #dataInit class="data"></div>
    <div #card class="cards" [ngStyle]="'z-index':order[i]" [style.visibility]="order[i]>=2 && order[i]<=data.length-5?'collapse':null" *ngFor="let item of data; let i = index;">
            <div class="name"> item.name </div>
            <div class="age"> item.age </div>
    </div>
</div>

【问题讨论】:

【参考方案1】:

在你写的时候看看animateFunction

if (index == 0)
   this.calculateDimensions();
          this.selectedIndex =
            (this.selectedIndex + this.items.length - 1) % this.items.length;

          this.animateCarousel();

你是说动画继续。您可以在函数中取出 if,例如,

executeAction()

   console.log(this.data[this.selectedIndex])
   //you,e.g. subscribe to a service to getData, and after subscribe
   //execute the function
   this.dataService.getData().subscribe(res=>
      this.calculateDimensions();
      this.selectedIndex =
        (this.selectedIndex + this.items.length - 1) % this.items.length;

      this.animateCarousel();
   )

然后将“if”转换为类似

 if (index == 0)
    this.player.onDone(() => 
      this.executeAction()
    );

您也可以完全删除 "if" 和按钮

<button> (click)="executeAction()">next</button>

在这个forked stackblitz我使用“定时器”来模拟service.getData().subscribe

【讨论】:

以上是关于需要定期暂停 Carousel 动画并调用一个函数的主要内容,如果未能解决你的问题,请参考以下文章

javascript 播放/暂停BS Carousel

如何暂停和恢复轮播滑块

如何在 Bootstrap Carousel 中使用数据暂停属性

为什么当旋转木马内部的某个元素被调用时,Bootstrap 4旋转木马暂停功能不起作用?

暂停时调用 UIViewPropertyAnimator 完成

Owl Carousel + Animate.css - 动画不起作用