Angular 2 animate * ng Для элемента списка один за другим, используя новую поддержку анимации в RC 5
У меня есть компонент, который извлекает список элементов с сервера, а затем отображает этот список, используя * ngFor в шаблоне.
Я хочу, чтобы список отображался с некоторой анимацией, но один за другим. Я имею в виду, что каждый элемент списка должен анимироваться после другого.
Я пробую что-то вроде этого:
import { Component, Input, trigger, state, animate, transition, style } from '@angular/core';
@Component({
selector: 'list-item',
template: ` <li @flyInOut="'in'">{{item}}</li>`,
animations: [
trigger('flyInOut', [
state('in', style({ transform: 'translateX(0)' })),
transition('void => *', [
style({ transform: 'translateX(-100%)' }),
animate(100)
]),
transition('* => void', [
animate(100, style({ transform: 'translateX(100%)' }))
])
])
]
})
export class ListItemComponent {
@Input() item: any;
}
и в моем шаблоне компонента списка я использую его как:
<ul>
<li *ngFor="let item of list;">
<list-item [item]="item"></list-item>
</li>
</ul>
То, что он делает, отображает весь список сразу. Я хочу, чтобы элементы вводились один за другим с некоторой анимацией.
Ответы
Ответ 1
Я не смог найти stagger
поддержку на ngFor
в документации, но
теперь animation.done
events
, который можно использовать для создания staggering ngFor
см. @PLUNKER
@Component({
selector: 'my-app',
template: `
<ul>
<li *ngFor="let hero of staggeringHeroes; let i = index"
(@flyInOut.done)="doNext()"
[@flyInOut]="'in'" (click)="removeMe(i)">
{{hero}}
</li>
</ul>
`,
animations: [
trigger('flyInOut', [
state('in', style({transform: 'translateX(0)'})),
transition('void => *', [
animate(300, keyframes([
style({opacity: 0, transform: 'translateX(-100%)', offset: 0}),
style({opacity: 1, transform: 'translateX(15px)', offset: 0.3}),
style({opacity: 1, transform: 'translateX(0)', offset: 1.0})
]))
]),
transition('* => void', [
animate(300, keyframes([
style({opacity: 1, transform: 'translateX(0)', offset: 0}),
style({opacity: 1, transform: 'translateX(-15px)', offset: 0.7}),
style({opacity: 0, transform: 'translateX(100%)', offset: 1.0})
]))
])
])
]
})
export class App {
heroes: any[] = ['Alpha', 'Bravo', 'Charlie', 'Delta', 'Echo', 'Foxtrot', 'Golf', 'Hotel', 'India'];
next: number = 0;
staggeringHeroes: any[] = [];
constructor(){
this.doNext();
}
doNext() {
if(this.next < this.heroes.length) {
this.staggeringHeroes.push(this.heroes[this.next++]);
}
}
removeMe(i) {
this.staggeringHeroes.splice(i, 1);
}
}
Ответ 2
Чтобы использовать анимацию angular2, я установил свойство состояния в итерированный элемент, а затем просто установил функцию переключения для функций mouseover и mouseout. Таким образом, каждый элемент инкапсулировал его анимированное состояние, а затем я мог изменить его по мере необходимости
<li
*ngFor="let item of itemsList"
(mouseover)="toogleAnimation(item)"
(mouseout)="toogleAnimation(item)"
>{{ item.name }}
<div class="animation_wrapper" [@slideInOut]="item.state">
<span class="glyphicon glyphicon-refresh"></span>
<span class="glyphicon glyphicon-trash"></span>
</div>
</li>
Ответ 3
что вы хотите, времени между каждым элементом в списке, см. этот код. измените файл .css на .scss
как https://codepen.io/jhenriquez856/pen/baPagq
$total-items: 5;
body {
font-family: sans-serif;
background: #111;
color: #fff;
}
ul {
width: 300px;
left: 50%;
margin-top: 25px;
margin-left: -150px;
position: absolute;
}
li {
position: relative;
display: block;
border: 1px solid hotpink;
margin-bottom: 5px;
padding: 10px;
text-align: center;
text-transform: uppercase;
animation: fadeIn 0.5s linear;
animation-fill-mode: both;
}
// Set delay per List Item
@for $i from 1 through $total-items {
li:nth-child(#{$i}) {
animation-delay: .25s * $i;
}
}
// Keyframe animation
@-webkit-keyframes fadeIn {
0% {
opacity: 0;
}
75% {
opacity: 0.5;
}
100% {
opacity: 1;
}
}
<ul>
<li>item 1</li>
<li>item 2</li>
<li>item 3</li>
<li>item 4</li>
<li>item 5</li>
</ul>