Slide down animation Angular 4

前端 未结 3 1029
忘掉有多难
忘掉有多难 2021-02-05 14:01

I am trying to animate my page but have the following issue:
I have content div on my page, and a button that opens another div above the content. I would like that div to

3条回答
  •  粉色の甜心
    2021-02-05 14:36

    First, create a file where you would define your animations and export them. Just to make it more clear in your app.component.ts

    In the following example, I used a max-height of the div that goes from 0px (when it's hidden), to 500px, but you would change that according to what you need.

    This animation uses states (in and out), that will be toggle when we click on the button, which will run the animtion.

    animations.ts

    import { trigger, state, style, transition,
        animate, group, query, stagger, keyframes
    } from '@angular/animations';
    
    export const SlideInOutAnimation = [
        trigger('slideInOut', [
            state('in', style({
                'max-height': '500px', 'opacity': '1', 'visibility': 'visible'
            })),
            state('out', style({
                'max-height': '0px', 'opacity': '0', 'visibility': 'hidden'
            })),
            transition('in => out', [group([
                animate('400ms ease-in-out', style({
                    'opacity': '0'
                })),
                animate('600ms ease-in-out', style({
                    'max-height': '0px'
                })),
                animate('700ms ease-in-out', style({
                    'visibility': 'hidden'
                }))
            ]
            )]),
            transition('out => in', [group([
                animate('1ms ease-in-out', style({
                    'visibility': 'visible'
                })),
                animate('600ms ease-in-out', style({
                    'max-height': '500px'
                })),
                animate('800ms ease-in-out', style({
                    'opacity': '1'
                }))
            ]
            )])
        ]),
    ]
    

    Then in your app.component, we import the animation and create the method that will toggle the animation state.

    app.component.ts

    import { SlideInOutAnimation } from './animations';
    
    @Component({
      ...
      animations: [SlideInOutAnimation]
    })
    export class AppComponent  {
      animationState = 'in';
    
      ...
    
      toggleShowDiv(divName: string) {
        if (divName === 'divA') {
          console.log(this.animationState);
          this.animationState = this.animationState === 'out' ? 'in' : 'out';
          console.log(this.animationState);
        }
      }
    }
    

    And here is how your app.component.html would look like :

    THIS DIV IS ANIMATED
    THIS IS CONTENT DIV

    slideInOut refers to the animation trigger defined in animations.ts

    Here is a StackBlitz example I have created : https://stackblitz.com/edit/angular-muvaqu

    Side note : If an error ever occurs and asks you to add BrowserAnimationsModule, just import it in your app.module.ts:

    import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
    
    @NgModule({
      imports: [ ..., BrowserAnimationsModule ],
      ...
    })
    

提交回复
热议问题