角度2 ngIf 和 CSS 转换/动画

我想要一个 div 从右侧滑入角度2使用 css。

  <div class="note" [ngClass]="{'transition':show}" *ngIf="show">
<p> Notes</p>
</div>
<button class="btn btn-default" (click)="toggle(show)">Toggle</button>

如果我只使用[ ngClass ]来切换类和利用不透明性,我的工作很好。 但是 li 不希望从一开始就呈现这个元素,所以我首先用 ngIf“隐藏”它,但是这个转换不起作用。

.transition{
-webkit-transition: opacity 1000ms ease-in-out,margin-left 500ms ease-in-out;
-moz-transition: opacity 1000ms ease-in-out,margin-left 500ms ease-in-out;
-ms-transition: opacity 1000ms ease-in-out,margin-left 500ms ease-in-out ;
-o-transition: opacity 1000ms ease-in-out,margin-left 500ms ease-in-out;
transition: opacity 1000ms ease-in-out,margin-left 500ms ease-in-out;
margin-left: 1500px;
width: 200px;
opacity: 0;
}


.transition{
opacity: 100;
margin-left: 0;
}
199520 次浏览

更新4.1.0

笨蛋

参见 https://github.com/angular/angular/blob/master/CHANGELOG.md#400-rc1-2017-02-24

更新2.1.0

笨蛋

有关详细信息,请参阅 < strong > 动画制作: angular.io

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


@Component({
selector: 'my-app',
animations: [
trigger(
'enterAnimation', [
transition(':enter', [
style({transform: 'translateX(100%)', opacity: 0}),
animate('500ms', style({transform: 'translateX(0)', opacity: 1}))
]),
transition(':leave', [
style({transform: 'translateX(0)', opacity: 1}),
animate('500ms', style({transform: 'translateX(100%)', opacity: 0}))
])
]
)
],
template: `
<button (click)="show = !show">toggle show (\{\{show}})</button>


<div *ngIf="show" [@enterAnimation]>xxx</div>
`
})
export class App {
show:boolean = false;
}

原创的

当表达式变成 false时,*ngIf从 DOM 中删除元素。不能对不存在的元素进行转换。

改用 hidden:

<div class="note" [ngClass]="{'transition':show}" [hidden]="!show">

根据最新的 角度2文件 你可以动画“进入和离开”的元素(像在角1)。

简单渐变动画示例:

在相关@Component 中添加:

animations: [
trigger('fadeInOut', [
transition(':enter', [   // :enter is alias to 'void => *'
style({opacity:0}),
animate(500, style({opacity:1}))
]),
transition(':leave', [   // :leave is alias to '* => void'
animate(500, style({opacity:0}))
])
])
]

不要忘记添加导入

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

相关组件的 html 元素应该如下所示:

<div *ngIf="toggle" [@fadeInOut]>element</div>

我建立了 幻灯片和渐变动画 这里的例子。

关于“ void”和“ *”的解释 :

  • void是将 ngIf设置为 false 时的状态(当 元素没有附加到视图)。
  • *-可以有许多动画状态(在文档中阅读更多)。作为“通配符”,*状态优先于所有这些状态(在我的示例中,这是将 ngIf设置为 true时的状态)。

注意 (取自角度文档) :

在 app 模块中声明, import { BrowserAnimationsModule } from '@angular/platform-browser/animations';

角动画是在标准 Web 动画 API 之上构建的 并在支持它的浏览器上本机运行 需要填充。从 GitHub 获取 web 动画.min.js 并添加 翻到你的页面。

    trigger('slideIn', [
state('*', style({ 'overflow-y': 'hidden' })),
state('void', style({ 'overflow-y': 'hidden' })),
transition('* => void', [
style({ height: '*' }),
animate(250, style({ height: 0 }))
]),
transition('void => *', [
style({ height: '0' }),
animate(250, style({ height: '*' }))
])
])

现代浏览器的 CSS 解决方案

@keyframes slidein {
0%   {margin-left:1500px;}
100% {margin-left:0px;}
}
.note {
animation-name: slidein;
animation-duration: .9s;
display: block;
}

我使用的角度5和一个 ngIf 为我工作,在一个 ngfor,我必须使用 animateChild 和在用户详细信息组件,我使用 * ngIf = “ user.exped”显示隐藏用户,它工作为输入一个离开

 <div *ngFor="let user of users" @flyInParent>
<ly-user-detail [user]= "user" @flyIn></user-detail>
</div>


//the animation file




export const FLIP_TRANSITION = [
trigger('flyInParent', [
transition(':enter, :leave', [
query('@*', animateChild())
])
]),
trigger('flyIn', [
state('void', style({width: '100%', height: '100%'})),
state('*', style({width: '100%', height: '100%'})),
transition(':enter', [
style({
transform: 'translateY(100%)',
position: 'fixed'
}),
animate('0.5s cubic-bezier(0.35, 0, 0.25, 1)', style({transform: 'translateY(0%)'}))
]),
transition(':leave', [
style({
transform: 'translateY(0%)',
position: 'fixed'
}),
animate('0.5s cubic-bezier(0.35, 0, 0.25, 1)', style({transform: 'translateY(100%)'}))
])
])
];

一种方法是为 ngIf 属性使用 setter 并设置状态作为更新值的一部分。

StackBlitz 的例子

Fade.Component. ts

 import {
animate,
AnimationEvent,
state,
style,
transition,
trigger
} from '@angular/animations';
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';


export type FadeState = 'visible' | 'hidden';


@Component({
selector: 'app-fade',
templateUrl: './fade.component.html',
styleUrls: ['./fade.component.scss'],
animations: [
trigger('state', [
state(
'visible',
style({
opacity: '1'
})
),
state(
'hidden',
style({
opacity: '0'
})
),
transition('* => visible', [animate('500ms ease-out')]),
transition('visible => hidden', [animate('500ms ease-out')])
])
],
changeDetection: ChangeDetectionStrategy.OnPush
})
export class FadeComponent {
state: FadeState;
// tslint:disable-next-line: variable-name
private _show: boolean;
get show() {
return this._show;
}
@Input()
set show(value: boolean) {
if (value) {
this._show = value;
this.state = 'visible';
} else {
this.state = 'hidden';
}
}


animationDone(event: AnimationEvent) {
if (event.fromState === 'visible' && event.toState === 'hidden') {
this._show = false;
}
}
}

Fade.Component. html

 <div
*ngIf="show"
class="fade"
[@state]="state"
(@state.done)="animationDone($event)"
>
<button mat-raised-button color="primary">test</button>
</div>

Css

:host {
display: block;
}
.fade {
opacity: 0;
}

在我的例子中,我错误地在错误的组件上声明了动画。

App.Component. html

  <app-order-details *ngIf="orderDetails" [@fadeInOut] [orderDetails]="orderDetails">
</app-order-details>

动画需要在使用元素的组件(appComponent.ts)上声明。我改用 OrderDetailsComponent.ts播放动画了。

希望它能帮助犯同样错误的人