:enter 和 :leave Angular 动画没有平滑过渡

Posted

技术标签:

【中文标题】:enter 和 :leave Angular 动画没有平滑过渡【英文标题】:No smooth transition of :enter and :leave Angular animations 【发布时间】:2020-03-04 12:01:12 【问题描述】:

我想要一个使用 Angular 动画的平滑滑入和滑出动画。我正在使用ngSwitch 来显示/隐藏这些组件。传入的组件会在前一个组件消失之前将其向上推。我尝试添加延迟,但这并不能解决问题。

app.component.html

<div class="container" [ngSwitch]="counter">
  <div @slideInOut *ngSwitchCase="1"></div>
  <div @slideInOut *ngSwitchCase="2"></div>
  <div @slideInOut *ngSwitchCase="3"></div>
  <div @slideInOut *ngSwitchCase="4"></div>
</div>

<button (click)="handleNext()">Next</button>

app.component.scss

.container 
  div 
    width: 100px;
    height: 100px;
    background: pink;
  

app.component.ts

import  Component  from '@angular/core';
import  slideInOut  from './shared/animations';


@Component(
  selector: 'my-app',
  styleUrls: ['./app.component.scss'],
  animations: [ slideInOut ],
  templateUrl: './app.component.html',
)
export class AppComponent 
  readonly name: string = 'Angular';
  counter = 1;

  boxArr = [1, 2, 3, 4]

  handleNext()
    if(this.counter <= this.boxArr.length)
      this.counter += 1
     else 
      this.counter = 1
    
  

动画.ts

import  trigger, state, style, transition, animate, keyframes  from "@angular/animations";


export const slideInOut =  trigger('slideInOut', [
    transition(':enter', [
      style(transform: 'translateX(100%)'),
      animate('200ms ease-in', style(transform: 'translateX(0%)'))
    ]),
    transition(':leave', [
      animate('200ms ease-in', style(transform: 'translateX(-100%)'))
    ])
])

演示:https://stackblitz.com/edit/angular-na1ath

【问题讨论】:

您确定您发布的链接正确吗? 不,那是错误的。已编辑。 【参考方案1】:

问题是:

1) 当您处理display: block 时,无论是否有剩余空间,该元素都会占用整行宽度,因此您的幻灯片分为两行

2) 如果我们通过添加display: inline-block 来解决这个问题,我们必须处理当有两个元素时它们比一个元素占用更多空间的问题。同时,translate 实际上并没有移动你的元素,而只是它的可见部分(“物理”形状在同一位置)

因此它通过幻灯片的绝对定位来解决

https://stackblitz.com/edit/angular-zciezz?file=src/app/app.component.scss

.container 
  position: relative;
  width: 100px;
  height: 100px;

  div 
    position: absolute;
    top: 0;
    left: 0;
    width: 100px;
    height: 100px;
    background: pink;
  

【讨论】:

以上是关于:enter 和 :leave Angular 动画没有平滑过渡的主要内容,如果未能解决你的问题,请参考以下文章

Vue中的JS与Velocity.js的结合

vue切换组件动画 / vue-transition过渡动画

VB.Net Mouse.Enter 和 Mouse.Leave 都在同一个事件中调用?

vue的动画和过渡

vue3 transition 组件使用总结

Button MouseEvent颜色变化