Вы можете использовать keyframes
для определения анимации, аналогичной CSS. Попробуйте следующее
Контроллер
import { Component } from '@angular/core';
import { state, keyframes, style, animate, trigger, transition } from '@angular/animations';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ],
animations: [
trigger("inOutAnimation", [
state("in", style({ opacity: 1 })),
transition(":enter", [
animate(
300,
keyframes([
style({ opacity: 0, offset: 0 }),
style({ opacity: 0.25, offset: 0.25 }),
style({ opacity: 0.5, offset: 0.5 }),
style({ opacity: 0.75, offset: 0.75 }),
style({ opacity: 1, offset: 1 }),
])
)
]),
transition(":leave", [
animate(
300,
keyframes([
style({ opacity: 1, offset: 0 }),
style({ opacity: 0.75, offset: 0.25 }),
style({ opacity: 0.5, offset: 0.5 }),
style({ opacity: 0.25, offset: 0.75 }),
style({ opacity: 0, offset: 1 }),
])
)
])
])
]
})
export class AppComponent {
elements = [
{ value: 1, background: 'green' },
{ value: 2, background: 'red' },
{ value: 3, background: 'blue' },
{ value: 4, background: 'yellow' },
{ value: 5, background: 'pink' }
]
add() {
this.elements.splice(2, 0, { value: 6, background: 'violet' });
}
remove() {
this.elements.splice(2, 1);
}
}
Шаблон
<div class="container">
<div [@inOutAnimation]="'in'" *ngFor="let element of elements" [ngStyle]="{ 'background-color': element.background }">
{{ element.value }}
</div>
</div>
<button (click)="add()">Add</button>
<button (click)="remove()">Remove</button>
Анимация должна быть привязана к элементу с *ngFor
, чтобы использовать :enter
и :leave
.
Я изменил ваш Stackblitz .