ค้นหาเว็บไซต์

javascript - ฉันจะสามารถใช้แอนิเมชันกับรายการขององค์ประกอบทีละรายการโดยใช้แอนิเมชันของ Angular 4 ได้อย่างไร?


ฉันกำลังพยายามใช้แอนิเมชันของ Angular 4 กับรายการขององค์ประกอบ HTML เช่น

facilities = ['<p> <span class="glyphicon glyphicon-hand-right"> </span> Text 1</p>',
        '<p> <span class="glyphicon glyphicon-hand-right"></span>Text 2</p>',
        '<p> <span class="glyphicon glyphicon-hand-right"></span> Text 3</p>',
        '<p> <span class="glyphicon glyphicon-hand-right"></span> Text 4</p>',
];

ทีละหนึ่งด้วยโค้ดด้านล่าง:

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%)'}))
    ])
  ])
]

เมื่อฉันใส่ทริกเกอร์นี้กับองค์ประกอบของรายการ องค์ประกอบทั้งหมดปรากฏบนหน้าจอพร้อมกันทั้งหมด ฉันต้องการให้พวกมันปรากฏทีละตัว เช่น ดึงข้อความ 1 แล้วข้อความ 2 บน HTML ฉันจะทำอย่างนั้นได้อย่างไร?

คำตอบ #1

อัปเดต: การใช้ staggers:

HTML:

<ul [@listAnimation]="items.length">
       <li *ngFor="let item of items" >
          <div [innerHTML]="item"></div>
       </li>
</ul>

ไทป์สคริปต์:

....
animations: [
    trigger('listAnimation', [
   transition('* => *', [

     query(':leave', [
      stagger(500, [
        animate(1000, style({ opacity: 0 }))
      ])
    ], { optional: true }),
     query(':enter', [
           style({ opacity: 0 }),
 stagger(500, [
        animate(1000, style({ opacity: 1 }))
      ])
    ], { optional: true })
  ])
...

สาธิต

มันสามารถทำได้ด้วยการเรียกกลับของแอนิเมชันใน Angular และด้วยความช่วยเหลือบางอย่างที่เขียนใน TypeScript

เอชทีเอ็มแอล:

 <ul>
    <li *ngFor="let item of listCopy;" (@flyInOut.done)="getNextItem()" [@flyInOut]="'in'" >
     <ul>
        <li *ngFor="let item of list" (@flyInOut.done)="getNextItem()" [@flyInOut]="'in'" >
           <div [innerHTML]="item"></div>
        </li>
     </ul>        
   </li>
 </ul>

ไทป์สคริปต์:

   .....
   @Component({
   ....
   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%)'}))
        ])
      ])
    ]
    ....
    list = ['Item1', 'Item2', 'Item3', 'Item4'];
    listCopy = []; 
    next: number = 0;

    constructor(){
        this.getNextItem();
    }

    getNextItem() {
        if(this.next < this.list.length) {
          this.listCopy.push(this.list[this.next++]);
        }
    }

Plunker (ฉันตั้งค่า 1000ms เพื่อเน้นการเคลื่อนไหว)