else - transición/animación angular 2 ngIf y CSS
ngif angular 6 example (6)
De acuerdo con la última angular.io/docs/ts/latest/guide/animations.html , puede animar elementos de "entrada y salida" (como en angular 1).
Ejemplo de animación de desvanecimiento simple:
En el componente @Component relevante, agregue:
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}))
])
])
]
No olvides agregar importaciones
import {style, state, animate, transition, trigger} from ''@angular/animations'';
El elemento html del componente relevante debería verse así:
<div *ngIf="toggle" [@fadeInOut]>element</div>
Creé un ejemplo de animación de diapositiva y desvanecimiento here .
Explicación sobre ''void'' y ''*'':
-
void
es el estado cuandongIf
se establece en falso (se aplica cuando el elemento no está adjunto a una vista). -
*
- Puede haber muchos estados de animación (lea más en documentos). El estado*
tiene prioridad sobre todos ellos como un "comodín" (en mi ejemplo, este es el estado cuandongIf
se establece entrue
).
Aviso (tomado de documentos angulares):
import { BrowserAnimationsModule } from ''@angular/platform-browser/animations'';
adicional
dentro del módulo de la aplicación,
import { BrowserAnimationsModule } from ''@angular/platform-browser/animations'';
Las animaciones angulares se crean sobre la API de animaciones web estándar y se ejecutan de forma nativa en los navegadores que lo admiten. Para otros navegadores, se requiere un polyfill. Toma web-animations.min.js de GitHub y agrégalo a tu página.
Quiero que un div se deslice desde la derecha en angular 2 usando css.
<div class="note" [ngClass]="{''transition'':show}" *ngIf="show">
<p> Notes</p>
</div>
<button class="btn btn-default" (click)="toggle(show)">Toggle</button>
Funciono bien si solo uso [ngClass] para alternar la clase y utilizar opacidad. Pero no quiero que ese elemento se represente desde el principio, así que primero lo "oculto" con ngIf, pero luego la transición no funcionará.
.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;
}
Estoy usando angular 5 y para que un ngif funcione para mí que está en un ngfor, tuve que usar animateChild y en el componente de detalle del usuario usé * ngIf = "user.expanded" para mostrar hide user y funcionó para ingresar una partida
<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%)''}))
])
])
];
Solución única de CSS para navegadores modernos
@keyframes slidein {
0% {margin-left:1500px;}
100% {margin-left:0px;}
}
.note {
animation-name: slidein;
animation-duration: .9s;
display: block;
}
Una forma es usar un setter para la propiedad ngIf y establecer el estado como parte de la actualización del valor. Cuando se establece la propiedad en true, se debe llamar a detectChanges () para asegurarse de que el elemento se vuelva a agregar al dom antes de que cambie el estado de la animación.
example.component.ts
import { Component, AnimationTransitionEvent, OnInit } from ''@angular/core'';
import { trigger, state, style, animate, transition } from ''@angular/animations'';
@Component({
selector: ''example'',
templateUrl: `./example.component.html`,
styleUrls: [`./example.component.css`],
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'')
])
])
]
})
export class ExampleComponent implements OnInit {
state: string;
private _showButton: boolean;
get showButton() {
return this._showButton;
}
set showButton(val: boolean) {
if (val) {
this._showButton = true;
this.state = ''visible'';
} else {
this.state = ''hidden'';
}
}
constructor() {
}
ngOnInit() {
this.showButton = true;
}
animationDone(event: AnimationTransitionEvent) {
if (event.fromState === ''visible'' && event.toState === ''hidden'') {
this._showButton = false;
}
}
log() {
console.log(''clicked'');
}
}
ejemplo.componente.html
<div>
<p>animation state: {{state}}</p>
<p>showButton: {{showButton}}</p>
<button (click)="showButton = !showButton">toggle</button>
</div>
<button class="animation-target" *ngIf="showButton" [@state]="state" (@state.done)="animationDone($event)" (click)="log()" >animation target</button>
ejemplo.componente.css
.animation-target {
background: orange;
height: 150px;
width: 150px;
cursor: pointer;
opacity: 0;
}
actualización 4.1.0
Ver también https://github.com/angular/angular/blob/master/CHANGELOG.md#400-rc1-2017-02-24
actualización 2.1.0
Para más detalles ver Animaciones en 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;
}
original
*ngIf
elimina el elemento del DOM cuando la expresión se vuelve
false
.
No puede tener una transición en un elemento no existente.
Usar en lugar
hidden
:
<div class="note" [ngClass]="{''transition'':show}" [hidden]="!show">
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: ''*'' }))
])
])