【问题标题】:Angular2 - leaving animation not applyingAngular2 - 离开动画不适用
【发布时间】:2017-09-10 00:33:42
【问题描述】:

我有一个 Angular2 应用程序,我正在尝试向我的路由添加动画,因此当我更改页面时它会滑动。进入动画效果很好,但是离开动画没有激活,加载新页面后上一页就消失了。有谁知道这个问题的原因? plunker

根据anuglar2 docs,我认为我的转换是正确的。

// transition(':enter', [ ... ]); // void => *
// transition(':leave', [ ... ]); // * => void

动画文件

export function routerTransition() {
    return trigger('routerTransition', [
        transition('void => *', [
            style({ transform: 'translateX(100%)' }),
            animate(1000)
        ]),
        transition('* => void', [
            style({ transform: 'translateX(-100%)' }),
            animate(1000)
        ])
    ])
}

child_1.component.ts

import { Component } from '@angular/core';
import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'
import { Router } from '@angular/router';
import { Observable } from 'rxjs/Rx';
import { routerTransition } from '../../directives/router.animation'; 
@Component({
    selector: 'about',
    template: require('./about.component.html'),
    styles: [require('./about.component.css')],
    animations: [routerTransition()],
    host: { '[@routerTransition]': '' }
})

child_2.component.ts

import { Component } from '@angular/core';
import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'
import { Router } from '@angular/router';
import { Observable } from 'rxjs/Rx';
import { routerTransition } from '../../directives/router.animation'; 
@Component({
    selector: 'home-info',
    template: require('./home.component.html'),
    styles: [require('./home.component.css')],
    animations: [routerTransition()],
    host: { '[@routerTransition]': '' }
})

【问题讨论】:

    标签: javascript angular animation angular2-routing


    【解决方案1】:

    看起来有两个主要问题:

    1. 离开过渡的定义与进入过渡的方式相同,但需要以不同的方式定义,以便将指定的样式用作过渡的“结束”状态而不是“开始”状态。

      // Instead of
      transition('* => void', [
          style({ transform: 'translateX(-100%)' }),
          animate(1000)
      ])
      
      // Use
      transition('* => void', 
           animate(1000, style({transform: 'translateX(-100%)', opacity: 0}))
      )
      
    2. 您需要在主机上拥有display:block(或inline-block),否则它是内联的,并且翻译仅适用于块。

      // Instead of
      host: { '[@routerTransition]': '' }
      
      // Use
      host: {
         '[@routerTransition]': 'true',
         '[style.display]': "'block'",
      },
      

    虽然动画可能不是您想要的,但至少它或多或少是一个工作起点: https://plnkr.co/edit/eFrjtTOtXkWp8IUeAYdo?p=preview

    这是 Angular 的另一个例子:http://plnkr.co/edit/yJHjL5ap9l4MwOimCyyY?p=preview

    【讨论】:

      【解决方案2】:

      我认为您应该将动画代码更改如下:

      export function routerTransition() {
          return trigger('routerTransition', [
              state('void', style({position:'fixed', width:'100%'}) ),
              state('*', style({position:'fixed', width:'100%'}) ),
              transition('void => *', [
                style({transform: 'translateX(-100%)'}),
                animate('0.5s ease-in-out', style({transform: 'translateX(0%)'}))
              ]),
              transition('* => void', [
                style({transform: 'translateX(0%)'}),
                animate('0.5s ease-in-out', style({transform: 'translateX(100%)'}))
              ])
          ])
      }
      

      这是一个例子Plunk

      注意: 在 Angular 4 中,动画已从 @angular/core 中提取出来并放入包中,这样您就可以更轻松地找到文档并更好地利用自动完成功能。 em>

      【讨论】:

      • 这可行,但 100% 的宽度会扭曲我的页面。当我删除宽度时,动画像以前一样工作。有什么解决办法吗?
      • 我也不能再向下滚动页面了。
      • 你能调整页面的宽度吗?
      • 我正在使用引导程序,所以我被网格卡住了。
      猜你喜欢
      • 2017-08-13
      • 2017-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-01
      • 2017-10-28
      • 2019-10-03
      • 2017-07-11
      相关资源
      最近更新 更多