对于具有随机值的动画,您需要创建接受参数的动画。这将允许您在动画中提供不同的值,以便获得随机行为。您将需要根据要设置动画的内容设置一个或多个动画,并在值上设置参数,如下所示:
animations: [
trigger('randomAnimation', [
transition('* => colorFade', [
animate("500ms ease-in", keyframes([
style({'background-color': "{{color}}"}),
style({'opacity': "{{opacity}}"}),
]))
], {params : { color: "yellow", opacity: "0" }}),
transition('rotateFade', [
animate("{{time}}ms ease-in", keyframes([
style({'transform': 'rotate({{rotate}}deg);'}),
style({'opacity': "{{opacity}}"}),
]))
], {params : { time: "500", rotate: "45", opacity: "0.6 }})
])
]
然后在视图中,您可以将动画绑定到其中包含随机值的动画对象。
<div class="red-square" [@randomAnimation]="animationConfig"></div>
在您的组件中,您可以创建使动画随机化的对象。
public setRandomAnimation() {
this.animationConfig = {
value: Math.random() > 0.5 ? 'colorFade' : 'rotateFade',
params: {
time: Math.floor(Math.random() * 5000) + 200,
color: `#${(Math.floor(Math.random() * 255)).toString(16)}${(Math.floor(Math.random() * 255)).toString(16)}${(Math.floor(Math.random() * 255)).toString(16)}`,
opacity: Math.random(),
rotate: Math.floor(Math.random() * 360),
};
}
上述方法只是一个示例,您可以进一步扩展它,而不是将其全部塞进一个方法中。动画未使用的参数将被忽略,因此可以指定rotate,即使它没有在colorFade 中使用。
以前的答案
您可以定义任意数量的动画状态,然后设置转换,以便当它们从任何状态转到特定状态时,会出现特定的动画。以下是动画状态的示例:
animations: [
trigger('randomAnimation', [
transition('* => yellowDisappear', [
animate(300, keyframes([
style({'background-color': 'yellow'}),
style({opacity: 0})
])),
transition('* => rotateFade', [
animate(300, keyframes([
style({'transform': 'rotate(45deg);'}),
style({opacity: 0.6})
]))
])
]
然后您可以指定要在模板中应用的动画。
<div class="red-square" [@randomAnimation]="'yellowDisappear'"></div>
<div class="red-square" [@randomAnimation]="'rotateFade'"></div>
如果你想让它随机发生,我会设置某种 Observable 来随机改变动画,如果你想让它在某些条件下发生,那么我会在组件中创建一个方法来设置当前状态基于特定条件的动画。
Angular 中的动画有点棘手,但 tutorial 中有很好的信息,而且 Matias Niemelä(Angular 动画模块的主要开发人员之一)也写了一篇很好的 article。如果您的项目要使用动画,我建议您查看这些