1

我正在尝试使用 angular 4.1.2使用 3D CSS 表达式的伪状态更改表达式:enter来动画路由器转换。:leave

阅读angular.io文档,其中描述了void => ** => voidfor:enter:leave伪转换。

在尝试了这篇文章slide in out的转换之后,我最终可以通过设置我的组件 css 文件来让它工作(应该让作者知道)。:host {postion:relative}

这有效:

trigger('routerAnimation', [
    transition(':enter', [
        style({ right: '-400%' }),
        animate('.2s ease-in-out', style({ right: 0 }))
    ]),

    transition(':leave', [
        animate('.2s ease-in-out', style({ right: '-400%' }))
    ])
]);

这没有:

trigger('routerAnimation', [
    transition(':enter', [
        style({ transform: 'translateZ(-400px)' }),
        animate('.2s ease-in-out', style({ transform: 'translateZ(0)' }))
    ]),

    transition(':leave', [
        style({ transform: 'translateZ(0)' }),
        animate('.2s ease-in-out', style({ transform: 'translateZ(-400px)' }))
    ])
]);

我真的很困惑为什么会发生这种情况,我还尝试将我的:host定位设置为relativeabsolute确保我没有犯 CSS 错误。

任何帮助都将是超级超级超级棒:)

4

1 回答 1

1

我想你忘了添加 transform: perspective(XXXpx);
这就是为什么您看不到 translateZ 效果的原因。
我尝试使用这样的动画:

import { animate, AnimationEntryMetadata, state, style, transition, trigger } from '@angular/core';

// Component transition animations
export const slideInDownAnimation: AnimationEntryMetadata =
  trigger('routeAnimation', [
    state('*',
      style({
        opacity: 1,
        transform: 'perspective(500px) translateZ(0px)',
      })
    ),
    transition(':enter', [
      style({
        opacity: 0,
        transform: 'perspective(500px) translateZ(-400px)',
      }),
      animate('10s ease')
    ]),
    transition(':leave', [
      animate('10s ease', style({
        opacity: 0,
        transform: 'perspective(500px) translateZ(-400px)',
      }))
    ])
  ]);

它工作得很好。
检查此以了解有关 translateZ 的更多信息:
https ://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/translate3d

如果您的组件比屏幕大,您将看不到动画,或者您需要滚动页面才能找到它。因此在大多数情况下,您需要将 position:absolute 添加到组件 CSS(用于 :host 选择器)。或者您可以添加这样的装饰属性:

@HostBinding('@routeAnimation') public routeAnimation = true;
@HostBinding('style.display')   display = 'block';
@HostBinding('style.position')  position = 'absolute';

不要忘记添加:

import {HostBinding} from '@angular/core';
于 2017-09-09T02:13:45.110 回答