angular 2 ngIf and CSS transition/animation

前端 未结 7 1675
予麋鹿
予麋鹿 2020-11-29 16:23

I want a div to slide in from the right in angular 2 using css.

  

相关标签:
7条回答
  • 2020-11-29 16:39

    CSS only solution for modern browsers

    @keyframes slidein {
        0%   {margin-left:1500px;}
        100% {margin-left:0px;}
    }
    .note {
        animation-name: slidein;
        animation-duration: .9s;
        display: block;
    }
    
    0 讨论(0)
  • 2020-11-29 16:44
        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: '*' }))
          ])
        ])
    
    0 讨论(0)
  • 2020-11-29 16:48

    One way is to use a setter for the ngIf property and set the state as part of updating the value.

    StackBlitz example

    fade.component.ts

     import {
        animate,
        AnimationEvent,
        state,
        style,
        transition,
        trigger
      } from '@angular/animations';
      import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
    
      export type FadeState = 'visible' | 'hidden';
    
      @Component({
        selector: 'app-fade',
        templateUrl: './fade.component.html',
        styleUrls: ['./fade.component.scss'],
        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')])
          ])
        ],
        changeDetection: ChangeDetectionStrategy.OnPush
      })
      export class FadeComponent {
        state: FadeState;
        // tslint:disable-next-line: variable-name
        private _show: boolean;
        get show() {
          return this._show;
        }
        @Input()
        set show(value: boolean) {
          if (value) {
            this._show = value;
            this.state = 'visible';
          } else {
            this.state = 'hidden';
          }
        }
    
        animationDone(event: AnimationEvent) {
          if (event.fromState === 'visible' && event.toState === 'hidden') {
            this._show = false;
          }
        }
      }
    

    fade.component.html

     <div
        *ngIf="show"
        class="fade"
        [@state]="state"
        (@state.done)="animationDone($event)"
      >
        <button mat-raised-button color="primary">test</button>
      </div>
    

    example.component.css

    :host {
      display: block;
    }
    .fade {
      opacity: 0;
    }
    
    0 讨论(0)
  • 2020-11-29 16:50

    Am using angular 5 and for an ngif to work for me that is in a ngfor, I had to use animateChild and in the user-detail component I used the *ngIf="user.expanded" to show hide user and it worked for entering a leaving

     <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%)'}))
        ])
      ])
    ];
    
    0 讨论(0)
  • 2020-11-29 16:56

    In my case I declared the animation on the wrong component by mistake.

    app.component.html

      <app-order-details *ngIf="orderDetails" [@fadeInOut] [orderDetails]="orderDetails">
      </app-order-details>
    

    The animation needs to be declared on the component where the element is used in (appComponent.ts). I was declaring the animation on OrderDetailsComponent.ts instead.

    Hopefully it will help someone making the same mistake

    0 讨论(0)
  • 2020-11-29 16:58

    According to the latest angular 2 documentation you can animate "Entering and Leaving" elements (like in angular 1).

    Example of simple fade animation:

    In relevant @Component add:

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

    Do not forget to add imports

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

    The relevant component's html's element should look like:

    <div *ngIf="toggle" [@fadeInOut]>element</div>
    

    I built example of slide and fade animation here.

    Explanation on 'void' and '*':

    • void is the state when ngIf is set to false (it applies when the element is not attached to a view).
    • * - There can be many animation states (read more in docs). The * state takes precedence over all of them as a "wildcard" (in my example this is the state when ngIf is set to true).

    Notice (taken from angular docs):

    Extra declare inside the app module, import { BrowserAnimationsModule } from '@angular/platform-browser/animations';

    Angular animations are built on top of the standard Web Animations API and run natively on browsers that support it. For other browsers, a polyfill is required. Grab web-animations.min.js from GitHub and add it to your page.

    0 讨论(0)
提交回复
热议问题