【问题标题】:Angular animations without ngIf没有 ngIf 的角度动画
【发布时间】:2021-02-23 21:07:47
【问题描述】:

我正在尝试从 CSS 动画 切换到 Angular 动画,但我不知道如何在不显示所有元素的情况下为数组中的元素设置动画并且只显示选择一个带有 *ngIf

动画在 TS 文件中定义如下:

@Component({
  ...
  animations: [
    trigger("carouselAnimation", [
      // Next
      transition(":increment", [
        query(":enter", [
          style({ opacity: 0, transform: "translateX(100%)" }),
          animate(".3s", style({ opacity: 1, transform: "translateX(0)" }))
        ])
      ]),
      // Previous
      transition(":decrement", [
        query(":enter", [
          style({ opacity: 0, transform: "translateX(-100%)" }),
          animate(".3s", style({ opacity: 1, transform: "translateX(0%)" }))
        ])
      ])
    ])
  ]
})

在 HTML 中,选中的图像显示如下:

<div [@carouselAnimation]="counter">
    <ng-container *ngFor="let img of images; let i=index">
        <img [src]="img" style="height:200px; width:200px" *ngIf="i===counter"/>
    </ng-container>
</div>

到目前为止一切正常,但我想做的是在不显示所有其他图像的情况下为图像设置动画,并使用 *ngIf 隐藏它们并仅保留选定的图像:

<div [@carouselAnimation]="counter">
    <img [src]="imgSrc" style="height:200px; width:200px">
</div>

但如果我这样做,动画就不再起作用了。

我还在Stackblitz创建了一个演示。

【问题讨论】:

  • 确保您没有注释掉实际导致问题的复制器部分。毕竟,复制者会显示问题或错误。
  • 已更新,抱歉。

标签: angular typescript


【解决方案1】:

你应该做的是放弃ngFor,而是像这样使用图像:

<img [@carouselAnimation]="counter" [src]="images[counter]" style="height:200px; width:200px" />

您应该用这种方法做的另一件事是将查询从:enter 更改为:self,以便在&lt;img/&gt; 元素上触发动画

这是一个 StackBlitz 带有工作演示(来自您的解决方案)。

这种方法的唯一问题(这也是您*ngFor 解决方案的问题)是,如果图像加载速度比动画慢,用户最终会遇到错误的体验。

【讨论】:

  • 非常感谢,伙计。它按我的意愿工作。所以问题是:enter 查询,我理解。关于您提到的错误,是否有解决方案?我还将动画时间增加到0.6s。我观察到的另一件事是,如果用户快速单击 nextprevious 附件,动画会继续,但图像 src 会更改。这种行为是意料之中的,但我想问问在这种情况下是否有可能“重新启动”动画。
  • 不确定动画取消。关于其他问题(图像加载),您可以以某种方式预取和缓存图像,以保证图像加载速度超快,或者您可以为轮播创建某种组件包装器,您将在其中一次加载例如 5 张图像,并且每次下一个或返回时,您将删除预渲染图像的第一个/最后一个元素并附加将新图像拖到最后(类似于无限滚动,但对于轮播),您将预先获取最近的图像。
猜你喜欢
  • 2016-02-25
  • 2018-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-25
  • 2019-03-31
相关资源
最近更新 更多