Animation APIで遊んでいます。トップレベルのルータービューのコンテンツをスライドさせるなど、再利用可能なアニメーションを作成したいと思います。ファンキーなメタデータ構文(メタデータを使用するというおかしなアイデアをすり抜けると、かなりクールです)を通過して、アニメーションをほぼ機能させることができました。
@Component({
//moduleId: module.id,
selector: 'album-display',
templateUrl: './albumDisplay.html',
animations: [
trigger('slideIn', [
state('*', style({
transform: 'translateX(100%)',
})),
state('in', style({
transform: 'translateX(0)',
})),
state('out', style({
transform: 'translateX(-100%)',
})),
transition('* => in', animate('600ms ease-in')),
transition('in => out', animate('600ms ease-in'))
])
]
})
export class AlbumDisplay implements OnInit {
slideInState = 'in';
...
}
そして、それをコンポーネントの私のトップレベル要素に割り当てます:
<div class="container" [@slideIn]="slideInState">
これは機能しますが、どうすればこれを再利用可能にできますか?このメタデータをすべてのビューに貼り付けたくありません。これはメタデータであるため、この再利用可能にする方法がわかりません。
可能な方法の1つは、アニメーショントリガーコードを別のファイルに配置し、const
変数としてエクスポートし、以下のようにコンポーネントで使用することです。
animations.ts
import { trigger, state, style, transition, animate } from '@angular/core';
export const slideIn = trigger('slideIn', [
state('*', style({
transform: 'translateX(100%)',
})),
state('in', style({
transform: 'translateX(0)',
})),
state('out', style({
transform: 'translateX(-100%)',
})),
transition('* => in', animate('600ms ease-in')),
transition('in => out', animate('600ms ease-in'))
]);
album-display.component.ts
import { slideIn } from './animations'; // path to your animations.ts file
@Component({
//moduleId: module.id,
selector: 'album-display',
templateUrl: './albumDisplay.html',
animations: [
slideIn
]
})
export class AlbumDisplay implements OnInit {
slideInState = 'in';
...
}
少し遅れているかもしれませんが、トリガーのより動的なバージョンの答えを出したいと思っています。
アニメーショントリガーコードを別のファイルに配置し、function
としてエクスポートします。
translate.ts
import { AnimationEntryMetadata, trigger, state, style, transition, animate } from '@angular/core';
export function TranslateX( name: string, x: string, duration: number ): AnimationEntryMetadata {
return trigger( name, [
state('false', style({ transform: 'translateX(0)' }) ),
state('true', style({ transform: 'translateX(' + x + ')' }) ),
transition('0 => 1', animate( duration + 'ms ease-in')),
transition('1 => 0', animate( duration + 'ms ease-out')),
]);
}
そのため、コンポーネントではapp.component.ts
import { TranslateX } from './translate';
@Component({
...
templateUrl: './app.component.html',
animations: [
TranslateX( 'trigger1Title','-100%', 200 ),
TranslateX( 'trigger2Title','20vw', 700 )
]
...
})
およびテンプレートでapp.component.html
...
<div [@trigger1Title]="token1"> ... </div>
<div [@trigger2Title]="token2"> ... </div>
...
より多くの入力データを使用してトリガーをカスタマイズできます(たとえば、遷移時間の分離など)。
Angular 4のルーターアニメーションの例
Angular 4、.
詳細とライブデモについては、 この投稿 をご覧ください。
Angular 4 Slide in/out animation
// import the required animation functions from the angular animations module
import { trigger, state, animate, transition, style } from '@angular/animations';
export const slideInOutAnimation =
// trigger name for attaching this animation to an element using the [@triggerName] syntax
trigger('slideInOutAnimation', [
// end state styles for route container (Host)
state('*', style({
// the view covers the whole screen with a semi tranparent background
position: 'fixed',
top: 0,
left: 0,
right: 0,
bottom: 0,
backgroundColor: 'rgba(0, 0, 0, 0.8)'
})),
// route 'enter' transition
transition(':enter', [
// styles at start of transition
style({
// start with the content positioned off the right of the screen,
// -400% is required instead of -100% because the negative position adds to the width of the element
right: '-400%',
// start with background opacity set to 0 (invisible)
backgroundColor: 'rgba(0, 0, 0, 0)'
}),
// animation and styles at end of transition
animate('.5s ease-in-out', style({
// transition the right position to 0 which slides the content into view
right: 0,
// transition the background opacity to 0.8 to fade it in
backgroundColor: 'rgba(0, 0, 0, 0.8)'
}))
]),
// route 'leave' transition
transition(':leave', [
// animation and styles at end of transition
animate('.5s ease-in-out', style({
// transition the right position to -400% which slides the content out of view
right: '-400%',
// transition the background opacity to 0 to fade it out
backgroundColor: 'rgba(0, 0, 0, 0)'
}))
])
]);
Angular 4 Fade in animation
// import the required animation functions from the angular animations module
import { trigger, state, animate, transition, style } from '@angular/animations';
export const fadeInAnimation =
// trigger name for attaching this animation to an element using the [@triggerName] syntax
trigger('fadeInAnimation', [
// route 'enter' transition
transition(':enter', [
// css styles at start of transition
style({ opacity: 0 }),
// animation and styles at end of transition
animate('.3s', style({ opacity: 1 }))
]),
]);
遷移が添付されたコンポーネント
import { Component } from '@angular/core';
// import fade in animation
import { fadeInAnimation } from '../_animations/index';
@Component({
moduleId: module.id.toString(),
templateUrl: 'home.component.html',
// make fade in animation available to this component
animations: [fadeInAnimation],
// attach the fade in animation to the Host (root) element of this component
Host: { '[@fadeInAnimation]': '' }
})
export class HomeComponent {
}
適切な解決策は、ディレクティブでアニメーションをサポートすることです。
そうではありませんが、AngularのGithubに問題があります: https://github.com/angular/angular/issues/9947
それがすぐに解決されることを願っています。
クラスを使用すると、拡張することができます、
import { trigger, style, state, animate, transition, AnimationMetadata } from "@angular/core";
export class MyAwesomeAnimations {
/**
*
* @param nameTrigger Name of triggers
* @param setNewsStates add states for animations
* @param setNewTransitions add transitions for states
*/
SetTrigger(nameTrigger: string, setNewsStates?: AnimationMetadata[], setNewTransitions?: AnimationMetadata[]): any {
let metaData: AnimationMetadata[] = [
state('*', style({
transform: 'translateX(100%)',
})),
state('in', style({
transform: 'translateX(0)',
})),
state('out', style({
transform: 'translateX(-100%)',
})),
transition('* => in', animate('600ms ease-in')),
transition('in => out', animate('600ms ease-in'))
];
if (setNewsStates)
metaData.concat(setNewsStates);
if (setNewTransitions)
metaData.concat(setNewTransitions);
return trigger(nameTrigger, metaData);
}
}
使用する
@Component({
selector: "orden-detail-component",
animations: [new MyAwesomeAnimations().SetTrigger("slideIn")],
template:"<div class="container" [@slideIn]="slideInState">"
})
export class OrdenDetailComponent {
slideInState = 'in';
}
その方法があなたを助けることを願っています