web-dev-qa-db-ja.com

角度2 ngIfおよびCSSトランジション/アニメーション

CSSを使用してdivを角度2で右からスライドさせたい。

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

私はクラスを切り替えて不透明度を利用するために[ngClass]を使用するだけならうまくいきます。しかし、その要素が最初からレンダリングされることを望まないので、最初に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;
}
98
Han Che

アップデート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;
}

オリジナル

式がfalseになると、*ngIfはDOMから要素を削除します。存在しない要素への遷移はできません。

代わりにhiddenを使用してください。

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

最新の angle 2のドキュメント によればあなたは "Entering and Leaving"要素をアニメーション化することができます ).

単純なフェードアニメーションの例:

関連する@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'と '*':

  • voidは、ngIfがfalseに設定されている状態です(これは、要素がビューにアタッチされていない場合に適用されます)。
  • * - 多くのアニメーション状態があり得ます(詳しくはdocsをご覧ください)。 *状態は「ワイルドカード」としてそれらのすべてよりも優先されます(この例ではngIftrueに設定されているときの状態です)。

に注意してください(角度付きの文書から取得)。

追加の appモジュール内で宣言する、import { BrowserAnimationsModule } from '@angular/platform-browser/animations';

Angularアニメーションは標準のWeb Animations APIの上に構築されており、それをサポートするブラウザ上でネイティブに実行されます。他のブラウザでは、ポリフィルが必要です。 GitHubからweb-animations.min.jsを入手してページに追加します。

111
Asaf Hananel
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: '*' }))
])
14
kravits88

最近のブラウザ用のCSSのみのソリューション

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

Angular 5を使用していて、ngforで動作するようにngifを使用するには、animateChildを使用する必要があり、ユーザー詳細コンポーネントでは非表示のユーザーを表示するために* 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%)'}))
    ])
  ])
];
3
ramon22

1つの方法は、ngIfプロパティに設定メソッドを使用し、値を更新することの一部として状態を設定することです。プロパティをtrueに設定するとき、アニメーションの状態が変更される前に要素がdomに追加されたことを確認するためにdetectChanges()を呼び出す必要があります。

StackBlitzの例

example.component.ts

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

@Component({
  selector: 'example',
  templateUrl: `./example.component.html`,
  styleUrls: [`./example.component.css`],
  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')
      ])
    ])
  ]
})
export class ExampleComponent implements OnInit  {
  state: string;

    private _showButton: boolean;
    get showButton() {
      return this._showButton;
    }
    set showButton(val: boolean) {
      if (val) {
        this._showButton = true;
        this.state = 'visible';
      } else {
        this.state = 'hidden';
      }
    }

    constructor() {
    }

    ngOnInit() {
      this.showButton = true;
    }

    animationDone(event: AnimationTransitionEvent) {
      if (event.fromState === 'visible' && event.toState === 'hidden') {
        this._showButton = false;
      }
    }

    log() {
      console.log('clicked');
    }
}

example.component.html

<div>
  <p>animation state: {{state}}</p>
  <p>showButton: {{showButton}}</p>
  <button (click)="showButton = !showButton">toggle</button>
</div>
<button class="animation-target" *ngIf="showButton" [@state]="state" (@state.done)="animationDone($event)" (click)="log()" >animation target</button>

example.component.css

.animation-target {
    background: orange;
    height: 150px;
    width: 150px;
    cursor: pointer;
    opacity: 0;
}
2
JayChase