角度2 - 动画过渡不起作用

时间:2017-02-10 09:42:42

标签: html angular typescript angular2-animation

我需要在两种颜色OnClick之间进行转换。现在,这是我的代码:

打字稿

animations: [
    trigger('menubarState', [
        state('false', style({backgroundColor:'#43a047'})),
        state('true', style({backgroundColor:'#333'})),
        transition('false => true', animate('1s')),
        transition('true => false', animate('1s'))
    ])
]

...

export class MenubarComponent {
  menuActive: boolean = false;
  onMenuClick () {
    if (this.menuActive == false) {
      this.menuActive = true;
    } else {
      this.menuActive = false;
    }
  }
}

HTML

<li [@menubarState]="menuActive" (click)="onMenuClick()">
      <a><span class="material-icons icon">apps</span></a>
</li>

这确实会改变background-color。然而,这种变化是即时的,而不是过渡。

我正在使用Chrome,最新版本。

5 个答案:

答案 0 :(得分:9)

这让我觉得时间最长,修正了它将我的状态变量从布尔类型改为字符串类型。所以 - 不是跟踪truefalse,而是跟踪'true''false'。 Per Angular的文档:

  

动画状态是您在应用程序代码中定义的字符串值。

将MenubarComponent类更改为:

export class MenubarComponent {
  menuActive: string = 'false';
  onMenuClick () {
    if (this.menuActive === 'false') {
      this.menuActive = 'true';
    } else {
      this.menuActive = 'false';
    }
  }
}

我觉得这很愚蠢。布尔运算显然是二元国家的好选择。

更多信息:https://angular.io/guide/animations#states-and-transitions

答案 1 :(得分:3)

扩展Aaron Krauss提供的答案。它存在直接解释真/假值的问题;但是,如果您不想引用字符串上下文,则可以使用数字1(true)和0(false)替换上面的true和false。这证明可以解决我的问题,并且不需要任何恼人的字符串解释。

trigger('menubarState', [
    state('0', style({backgroundColor:'#43a047'})),
    state('1', style({backgroundColor:'#333'})),
    transition('0 => 1', animate('1s')),
    transition('1 => 0', animate('1s'))
])

答案 2 :(得分:1)

在Aaron Krauss的回答中进一步扩大: 我不想把我的布尔变成字符串,所以我定义了一个getter:

public menuActive: boolean = false;

get menuState() {
  return this.menuActive ? 'active' : 'inactive'
}

然后在你的动画定义中(我合并了转换,因为它们是相同的):

animations: [
  trigger('menubarState', [
    state('inactive', style({backgroundColor:'#43a047'})),
    state('active', style({backgroundColor:'#333'})),
    transition('inactive <=> active', animate('1s'))
  ])
]

完成后,模板:

<li [@menubarState]="menuState" (click)="onMenuClick()">
  <a><span class="material-icons icon">apps</span></a>
</li>

答案 3 :(得分:0)

我在路由/点击角度2时使用了动画。它也适用于onClick。 将此代码用于所有类型的路由,您可以使用单独的动画进行单独的路由更改或onclick。

import { animate, AnimationEntryMetadata, state, style, transition, trigger } from '@angular/core';
export const slideInDownAnimation: AnimationEntryMetadata =
  trigger('routeAnimation', [
    state('*',
      style({
        opacity: 1,
        backgroundColor:'#43a047',
        transform: 'translateX(0)'
      })
    ),
    transition(':enter', [
      style({
        opacity: 0,
        backgroundColor:'#333',
        transform: 'translateX(-100%)'
      }),
      animate('0.2s ease-in')
    ]),
    transition(':leave', [
      animate('0.5s ease-out', style({
        opacity: 0,
        backgroundColor:'red',
        transform: 'translateY(100%)'
      }))
    ])
  ]);

您也可以根据自己的选择修改上述代码。

答案 4 :(得分:-4)

你不能使用CSS吗?

EX:

<!DOCTYPE html>
<html>
<head>

    <style>
    div {
       background-color: #FF0;
       height: 200px;
       width: 100px;
      animation: fontbulger 2s infinite;
    }

    @keyframes fontbulger {
     0% {
       background-color: blue;
     }
     50% {
       background-color: red;
     }
     100% {
       background-color: blue;
    }
    }
    </style>
    <title>test</title>
</head>
<body>
    <div></div>
</body>
</html>