2

我正在尝试整理如何使用初始状态制作 Angular 动画。我正在尝试开发一个向上/向下滑动动画,到目前为止:

trigger(
    'slideHeight',
    [
        state('closed', style({
            display: 'none',
            height: 0
        })),
        state('open', style({
            // display: 'block',
            height: '*'
        })),
        transition('* <=> *', [
            style({
                display: 'block'
            }),
            animate('.5s ease')
        ])
    ]
)

在 jQuery 版本中,有问题的元素在display: none上面,我注意到 jQuery 幻灯片打开了,然后我看到display: block了最后一个元素。

当我display: 'block'如上所述注释掉时,它按预期工作,但是,当页面加载时,它从元素从全高变为无(我猜这很有意义?),这对用户来说很奇怪。

我试图弄清楚如何设置它,所以在关闭时,首先它会转到display: block,运行高度动画,并保持块。在另一个方向,我想阻止它直到它完成,添加一个display: none.

我试过添加一个不显示的类,但是由于动画在之前/之后没有添加一个类,它并没有按预期工作。我怀疑这应该是 Angular 动画 JS 和 CSS 类的组合,但我不太清楚这种模式。关于如何解决这个问题的任何建议都会很棒。

4

2 回答 2

4

不确定这是否正是您想要的,但您可以使用它*来描述“默认”状态。我看到您已经在使用高度进行此操作,但您也可以定义一个状态*

我希望能够显示和隐藏箭头。所以它有两个逻辑状态'in'和'out'。这很容易在两者之间切换。但是如果初始状态应该是“in”,那么我希望它淡入,但是动画不会有“起点”,out => in甚至* => in除非你定义一个*状态。

 animations: [
    trigger('showArrow',
    [            
        state('*', style({opacity: 0})),
        state('in', style({opacity: 1})),
        state('out', style({opacity: 0})),

        transition('* => in', [
           animate(15000)    
        ]),

        transition('* => out', [
            animate(200)
        ])
    ])
  ],

所以我的图标是这样定义的(注意这是一个自定义的svg):

<mat-icon [@showArrow]="(showArrow$ | async) ? 'in' : 'out'"
          svgIcon="right-arrow"></mat-icon>

即使初始状态被硬编码为true(因此没有这样的状态变化),它仍然会淡入,因为我已经定义了一个*起始状态(不透明度为 0)。

    this.showArrow$ = new BehaviorSubject(true);
于 2018-09-08T04:07:18.313 回答
2

我认为您需要两次过渡才能获得想要的东西。

trigger(
    'slideHeight',
    [
        state('closed', style({
            display: 'none',
            height: 0
        })),
        state('open', style({
            height: '*'
        })),
        transition('closed => open', [style({ display: none }), animate('.5s ease')]),
        transition('open => closed', [style({ display: 'block' }), animate('.5s ease')])
    ]
)
于 2017-07-18T20:27:38.020 回答