Ric*_*ahl 51 angular2-animation angular
我正在使用动画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';
...
}
Run Code Online (Sandbox Code Playgroud)
然后将其分配给组件中的顶级元素:
<div class="container" [@slideIn]="slideInState">
Run Code Online (Sandbox Code Playgroud)
所以这有效,但我怎样才能使这个可重用?我不想将这些元数据粘贴到每个视图上.由于这是元数据,我不确定如何使这个可重用.
ran*_*al9 87
一种可能的方法是将动画触发器代码放在单独的文件中并将其导出为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'))
]);
Run Code Online (Sandbox Code Playgroud)
专辑-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';
...
}
Run Code Online (Sandbox Code Playgroud)
Ale*_*aul 25
也许它有点晚了,但我仍然想为一个更动态的触发器版本提供答案.
将动画触发器代码放在单独的文件中并将其导出为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')),
]);
}
Run Code Online (Sandbox Code Playgroud)
所以,在组件app.component.ts中
import { TranslateX } from './translate';
@Component({
...
templateUrl: './app.component.html',
animations: [
TranslateX( 'trigger1Title','-100%', 200 ),
TranslateX( 'trigger2Title','20vw', 700 )
]
...
})
Run Code Online (Sandbox Code Playgroud)
并在模板app.component.html中
...
<div [@trigger1Title]="token1"> ... </div>
<div [@trigger2Title]="token2"> ... </div>
...
Run Code Online (Sandbox Code Playgroud)
您可以使用更多输入数据自定义触发器,例如分隔转换时间,等等.
归档时间: |
|
查看次数: |
15133 次 |
最近记录: |