Angular animation

html:


<section class="animation-slider">

  <div *ngFor="let sliderItem of sliderList; let itemIndex = index" >

    <div [@animationDefault]

         [@animationSlider]="sliderIndex"

         *ngIf="sliderIndex === itemIndex + 1">

      <h3>{{ sliderItem }}</h3>

    </div>

  </div>





  <button (click)="prevItem()">Prev</button>

  <button (click)="nextItem()">Next</button>

</section>





<section class="animation-default">

  <h3 [@animationDefault]

      *ngIf="isVisible">Title is visible or not</h3>



  <button (click)="isVisible = !isVisible">Hide/Show</button>

</section>

javascript:


import {Component, OnInit} from '@angular/core';

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



import {animationEnter, animationLeave, animationNext, animationPrev} from '@core/animations/animations';





@Component({

  selector: 'app-slider',

  templateUrl: './slider.component.html',

  styleUrls: ['./slider.component.scss'],

  animations: [

    trigger('animationDefault', [

      transition(':enter', animationEnter),

      transition(':leave', animationLeave)

    ]),

    trigger('animationSlider', [

      transition(':increment', animationNext),

      transition(':decrement', animationPrev)

    ])

  ]

})

export class SliderComponent implements OnInit {

  sliderList = [

    'First one',

    'Second item',

    'Third and last one',

    'Fourth item'

  ];

  sliderIndex = 1;

  isVisible = true;



  constructor() {

  }



  ngOnInit(): void {

  }



  prevItem() {

    this.sliderIndex--;

    if (this.sliderIndex < 1) {

      this.sliderIndex = 1;

    }

  }



  nextItem() {

    this.sliderIndex++;

    if (this.sliderIndex > this.sliderList.length) {

      this.sliderIndex = this.sliderList.length;

    }

  }



}

animation.ts:


import {animate, group, query, style} from '@angular/animations';



const animationTiming = '500ms ease-in';



export const animationEnter = [

  query(

    ':self',

    style({position: 'fixed', width: '100%'}),

    {optional: true}

  ),

  style({transform: 'translateX(100%)'}),

  animate(

    animationTiming,

    style({transform: 'translateX(0%)'})

  )

];



export const animationLeave = [

  query(

    ':self',

    style({position: 'fixed', width: '100%'}),

    {optional: true}

  ),

  animate(

    animationTiming,

    style({transform: 'translateX(-100%)'})

  )

];



export const animationNext = [

  query(

    ':enter, :leave',

    style({position: 'fixed', width: '100%'}),

    {optional: true}

  ),

  group([

    query(

      ':enter',

      [

        style({transform: 'translateX(100%)'}),

        animate(

          animationTiming,

          style({transform: 'translateX(0%)'})

        )

      ],

      {optional: true}

    ),

    query(

      ':leave',

      [

        style({transform: 'translateX(0%)'}),

        animate(

          animationTiming,

          style({transform: 'translateX(-100%)'})

        )

      ],

      {optional: true}

    )

  ])

];



export const animationPrev = [

  query(

    ':enter, :leave',

    style({position: 'fixed', width: '100%'}),

    {optional: true}

  ),

  group([

    query(

      ':enter',

      [

        style({transform: 'translateX(-100%)'}),

        animate(

          animationTiming,

          style({transform: 'translateX(0%)'})

        )

      ],

      {optional: true}

    ),

    query(

      ':leave',

      [

        style({transform: 'translateX(0%)'}),

        animate(

          animationTiming,

          style({transform: 'translateX(100%)'})

        )

      ],

      {optional: true}

    )

  ])

];

Leave a Comment