각도 2 ngIf 및 CSS 전환 / 애니메이션


121

div가 CSS를 사용하여 각도 2에서 오른쪽에서 슬라이드하기를 원합니다.

  <div class="note" [ngClass]="{'transition':show}" *ngIf="show">
    <p> Notes</p>
  </div>
  <button class="btn btn-default" (click)="toggle(show)">Toggle</button>

[ngClass] 만 사용하여 클래스를 전환하고 불투명도를 활용하면 잘 작동합니다. 그러나 li은 그 요소가 처음부터 렌더링되는 것을 원하지 않으므로 먼저 ngIf로 "숨기기"하지만 전환이 작동하지 않습니다.

.transition{
  -webkit-transition: opacity 1000ms ease-in-out,margin-left 500ms ease-in-out;
  -moz-transition: opacity 1000ms ease-in-out,margin-left 500ms ease-in-out;
  -ms-transition: opacity 1000ms ease-in-out,margin-left 500ms ease-in-out ;
  -o-transition: opacity 1000ms ease-in-out,margin-left 500ms ease-in-out;
  transition: opacity 1000ms ease-in-out,margin-left 500ms ease-in-out;
  margin-left: 1500px;
  width: 200px;
  opacity: 0;
}

.transition{
  opacity: 100;
  margin-left: 0;
}

답변:


195

4.1.0 업데이트

플 런커

참조 https://github.com/angular/angular/blob/master/CHANGELOG.md#400-rc1-2017-02-24

2.1.0 업데이트

플 런커

자세한 내용은 angular.io의 애니메이션을 참조하십시오.

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

@Component({
  selector: 'my-app',
  animations: [
    trigger(
      'enterAnimation', [
        transition(':enter', [
          style({transform: 'translateX(100%)', opacity: 0}),
          animate('500ms', style({transform: 'translateX(0)', opacity: 1}))
        ]),
        transition(':leave', [
          style({transform: 'translateX(0)', opacity: 1}),
          animate('500ms', style({transform: 'translateX(100%)', opacity: 0}))
        ])
      ]
    )
  ],
  template: `
    <button (click)="show = !show">toggle show ({{show}})</button>

    <div *ngIf="show" [@enterAnimation]>xxx</div>
  `
})
export class App {
  show:boolean = false;
}

실물

*ngIf표현식이이면 DOM에서 요소를 제거합니다 false. 존재하지 않는 요소에 대해서는 전환을 할 수 없습니다.

대신 사용 hidden:

<div class="note" [ngClass]="{'transition':show}" [hidden]="!show">

2
예, 숨김은 보이지 않게 할뿐 요소는 여전히 존재합니다. *ngIfDOM에서 완전히 제거합니다.
Günter Zöchbauer

1
마치 display:none. display:hiddenAFAIK 가 없습니다 .
Günter Zöchbauer

1
@ GünterZöchbauer 예, 불투명도는 하드웨어 가속이므로 더 적합합니다.
Ændri Domi

1
신경 쓰지 마. 불투명도는 요소를 제거하지 않고 여전히 아래 요소를 덮을 것입니다. display : none과 같은 UI에 영향을 미치는 scale (0)을 사용하는 것이 좋습니다. 하지만 좋은 전환이 있습니다. 영업 그는 각 애니메이션을 사용할 수 있습니다 응답하려면 angular.io/docs/ts/latest/guide/animations.html 규모 (0) 무효 상태에서 : 변화와 함께
Ændri 도미

1
이제 트리거, 스타일, 애니메이션 및 전환 항목이 @ angular / animations에서 포함되어야합니다. 그래서 수입{ trigger, style, animate, transition } from '@angular/animations';
조엘 에르난데스

137

최신 angular 2 문서 에 따르면 "Entering and Leaving"요소 (예 : angular 1)를 애니메이션 할 수 있습니다 .

간단한 페이드 애니메이션의 예 :

관련 @Component에서 다음을 추가하십시오.

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

수입품을 추가하는 것을 잊지 마십시오

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

관련 구성 요소의 html 요소는 다음과 같아야합니다.

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

여기슬라이드 및 페이드 애니메이션 예제를 만들었 습니다 .

'void'및 '*'에 대한 설명 :

  • voidngIffalse로 설정된 상태입니다 (요소가 뷰에 연결되지 않은 경우 적용됨).
  • *-애니메이션 상태가 많을 수 있습니다 (문서에서 자세히 알아보기). *상태 (내 예제에서이 상태입니다 "와일드 카드"로 그들 모두보다 우선 ngIf으로 설정됩니다 true).

주의 사항 (각도 문서에서 가져옴) :

앱 모듈 내부에 추가 선언, import { BrowserAnimationsModule } from '@angular/platform-browser/animations';

Angular 애니메이션은 표준 Web Animations API를 기반으로 구축되며이를 지원하는 브라우저에서 기본적으로 실행됩니다. 다른 브라우저의 경우 폴리 필이 필요합니다. GitHub에서 web-animations.min.js를 가져와 페이지에 추가합니다.


2
각도 애니메이션을 사용하려면 BrowserAnimationsModule을 가져와야합니다. 내가 틀리지 않았다면 애니메이션 모듈은 자체 모듈로 이동하기 전에 angular 2의 핵심 모듈에서 발견되었으므로 가져 오기없이 많은 플 런커 예제를 찾을 수 있습니다. 다음은 가져 오기로 업데이트 된 plnkr입니다. Link
snaplemouton

1
이러한 접근 방식을 사용할 때 leave애니메이션이 발생하지 않습니다 *ngIf. 그 이전에 구성 요소가 DOM에서 제거되기 때문 입니다.
Slava Fomin II

4
이것은 받아 들여지는 대답이어야하며 실제로 다른 해결 방법이 아닌 ngIf를 사용하려는 사람들에게 해결책을 제공합니다.
Ovi Trif

17
    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: '*' }))
      ])
    ])

11

최신 브라우저를위한 CSS 전용 솔루션

@keyframes slidein {
    0%   {margin-left:1500px;}
    100% {margin-left:0px;}
}
.note {
    animation-name: slidein;
    animation-duration: .9s;
    display: block;
}

좋은 대안 입력 CSS 전용 전환. ng-enter클래스 사용 에서 마이그레이션하기위한 임시 솔루션으로 사용했습니다.
edmundo096

4

한 가지 방법은 ngIf 속성에 setter를 사용하고 값 업데이트의 일부로 상태를 설정하는 것입니다.

StackBlitz 예제

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;
}

3

angular 5를 사용하고 있으며 ngif가 ngfor에있는 나를 위해 작동하려면 animateChild를 사용해야했고 user-detail 구성 요소에서 * ngIf = "user.expanded"를 사용하여 사용자 숨기기를 표시하고 입력을 위해 작동했습니다. 떠나는

 <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

제 경우에는 실수로 잘못된 구성 요소에 애니메이션을 선언했습니다.

app.component.html

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

( appComponent.ts) 에서 요소가 사용되는 컴포넌트에서 애니메이션을 선언해야합니다 . 나는 애니메이션을 선언했다.OrderDetailsComponent.ts대신 .

바라건대 같은 실수를하는 사람에게 도움이되기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.