Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular7路由器出口动画扭曲和重新排列所有元素,造成混乱_Angular_Css Animations_Angular7_Angular Router_Angular Animations - Fatal编程技术网

Angular7路由器出口动画扭曲和重新排列所有元素,造成混乱

Angular7路由器出口动画扭曲和重新排列所有元素,造成混乱,angular,css-animations,angular7,angular-router,angular-animations,Angular,Css Animations,Angular7,Angular Router,Angular Animations,我已经尝试了5种路由器出口动画的实现。我只想要一个基本的淡入/淡出动画,当路线改变时,没有什么特别的 下面是我切换路线时的屏幕记录: 这是迄今为止我得到的最好的结果,在其他情况下,我只是让按钮/文本一个接一个地从屏幕上消失。我正在测试Chrome 我已启用sidenav导航,我的代码如下所示: <mat-sidenav-content [@routerTransition]="getPageTransition(routerOutlet)"> <button

我已经尝试了5种路由器出口动画的实现。我只想要一个基本的淡入/淡出动画,当路线改变时,没有什么特别的

下面是我切换路线时的屏幕记录:

这是迄今为止我得到的最好的结果,在其他情况下,我只是让按钮/文本一个接一个地从屏幕上消失。我正在测试Chrome

我已启用sidenav导航,我的代码如下所示:

<mat-sidenav-content [@routerTransition]="getPageTransition(routerOutlet)">
      <button
        @menu-button
        *ngIf="!snav.opened"
        mat-button
        (click)="snav.toggle()"
        class="navigation-toggle"
      >
        <fa-icon icon="bars"></fa-icon>
      </button>

      <button
        @menu-button
        *ngIf="snav.opened"
        mat-button
        (click)="snav.toggle()"
        class="navigation-toggle"
      >
        <fa-icon icon="times"></fa-icon>
      </button>
      <router-outlet #routerOutlet="outlet"></router-outlet>
    </mat-sidenav-content>
在组件中,我检查路由器出口:

 getPageTransition(routerOutlet: RouterOutlet) {
    if (routerOutlet.isActivated) {
      let transitionName = 'section';

      const { path } = routerOutlet.activatedRoute.routeConfig;
      const isSame = this.previousPath === path;
      const isBackward = this.previousPath.startsWith(path);
      const isForward = path.startsWith(this.previousPath);

      if (isSame) {
        transitionName = 'none';
      } else if (isBackward && isForward) {
        transitionName = 'initial';
      } else if (isBackward) {
        transitionName = 'backward';
      } else if (isForward) {
        transitionName = 'forward';
      }

      this.previousPath = path;

      return transitionName;
    }

我发现:enter和:leave事件靠近路由可能会导致角度动画出现一些问题。这个答案不适合您的情况,可能需要修改,因为下面的代码段取决于您的应用程序结构和嵌套路由器。如果这个答案不适合你或者不能解决你的问题,我会修改它

关于Github问题,当父路由更改时,子路由将立即消失,而不播放动画

以下评论解决了我的问题,但我必须根据我的环境进行调整:

let animation = [...]; // the metadata
transition('A => B', group([
  query(':self', animation),
  query('router-outlet ~ *', [style({}), animate(1, style({}))], { optional: true })
]))
这实际上意味着您不仅要为元素设置动画。还可以将动画应用于路由器出口本身。它可以为您的代码实现如下:

query('mat-sidenav-content > router-outlet ~ *', [
  style({
  opacity: .99999
}),
animate(yourAnimationDuration, style({
  opacity: 1
}))
], { optional: true });
我不是专业的Css选择器,你可能需要调整

mat-sidenav-content > router-outlet ~ *

我希望这个答案能帮助你:)

嗨,塞巴斯蒂安,我过去在路由器动画方面也有过不好的经历。一个总是重复的错误与以下内容有关:。有几种解决方案,它可能会对您有所帮助。据我所知,您需要通过将路由器的不透明度从0.9999设置为1来保持组件,以保持整个内容,从而使动画保持活动状态,直到组件可以被扔掉。@JonathanStellwag谢谢您--我不能100%肯定我理解您将路由器的不透明度从0.9999设置为1的意思--您是说在条目I上应该从0.99999开始,而不是从0开始?这难道不能让整个事情都看得见吗?或者从0到0.99999设置动画——看看0.99999到1的想法,它很可能会在瞬间消失,没有实际的褪色,但我想我是误解了。谢谢嗨,塞巴斯蒂安。我会给你写一个可能需要根据你的情况进行调整的答案,和/或你必须尝试并犯一点错误。但是注释部分的代码不好:)
mat-sidenav-content > router-outlet ~ *