我们如何在 Angular 中为 *ngIf 添加过渡效果?

Posted

技术标签:

【中文标题】我们如何在 Angular 中为 *ngIf 添加过渡效果?【英文标题】:how do we add transition effects to *ngIf in Angular? 【发布时间】:2018-04-20 14:30:11 【问题描述】:

假设你在 component.html 上有两个这样的 div

<div *ngIf="htmlSegment == 'a" >
    someMessage
</div>


<div *ngIf="htmlSegment == 'b" >
    someMessage
</div>

当您将 htmlSegment 设置为 a 或 b 时,我们知道真值段会活跃,而另一个会消失。那里没有问题。

但是,如何让这些片段的出现和消失通过一些过渡效果变得生动起来?例如淡入或淡出等?

是否可以确保在新的 htmlSegment 中完成 dom 之后开始转换? (这样用户不会遇到任何闪烁或页面抖动,除了令人敬畏的淡入和淡出。)

【问题讨论】:

【参考方案1】:

这样的事情怎么样?

span 
  opacity: 0;
  transition: opacity 1s;


.active span 
  opacity: 1;

然后在您的模板中:

<div [ngClass]="(htmlSegment=='a')?'active':'not-active'" >
    <span>someMessage</span>
</div>

<div [ngClass]="(htmlSegment=='b')?'active':'not-active'" >
    <span>someMessage</span>
</div>

【讨论】:

不透明度为 0 的元素存在于 DOM 中。所以使用 *ngIf 是不同的情况 - 元素不在 DOM 中。 @AleksGrunwald 我不明白——你想为不在 DOM 上的元素的不透明度设置动画? 是的,我们可以这样做。 Angular 动画也可以。在这里查看答案:***.com/questions/36417931/… @AleksGrunwald 啊太棒了!【参考方案2】:

Animate 模块不会为您的 HTML 元素设置动画,但是当 Animate 注意到某些事件(例如隐藏或显示 HTML 元素)时,该元素会获得一些可用于制作动画的预定义样式(或类)。

将动画模块添加到您的项目中:

import 
  trigger,
  state,
  style,
  animate,
  transition
 from '@angular/animations';

为你的组件添加动画属性:

animations: [
  trigger('heroState', [
    state('a', style(
     backgroundColor: 'yellow',
     opacity:0.5
    )),
    state('b', style(
     backgroundColor: 'black',
     opacity:1
    )),
    transition('a => b', animate('100ms ease-in')),
    transition('b => a', animate('100ms ease-out'))
  ])
]

当 herostate 改变时会调用触发器。

最后,您的 HTML 代码将是:

<div *ngIf="htmlSegment == 'a" 
 [@heroState]="a">
    someMessage
</div>

<div *ngIf="htmlSegment == 'b"
[@heroState]="b" >
    someMessage
</div>

我无法创建此代码的 Angular2 在线示例,但我创建了一个 AngularJS 在线示例来感知动画中究竟发生了什么。(要更改动画,您可以将 'nga-slide-down' 类更改为 'nga- fade' 或你自己的类)

Check Online(AngularJS - check auto-run js at the right panel and click on change button)

【讨论】:

以上是关于我们如何在 Angular 中为 *ngIf 添加过渡效果?的主要内容,如果未能解决你的问题,请参考以下文章

Angular2 内置指令 NgFor 和 NgIf 详解

Angular2 使用 *ngif 在 html 代码中设置类名

如何在Angular 6中将异步管道的结果分配给没有*ngIf的变量

在 Angular 中使用 Jasmine 使用 *ngIf 指令时,如何对元素是不是可见进行单元测试

带有 *ngIf 的 Angular 数据表显示错误

Angular 5. 检查子组件中的父 *ngIf