【问题标题】:elements overlap when animating ngIf动画 ngIf 时元素重叠
【发布时间】:2018-11-06 09:15:19
【问题描述】:

当使用*ngIf 切换时,我正在尝试为div 设置动画。

我认为我遇到的问题是动画中一个众所周知的延迟/定时问题,但我找不到合法的解决方案。

1) 当现有元素开始他的离开动画时,他还在 DOM 中。

2) 进入元素在这段时间内开始他的动画。

3) 问题是当第一个元素完成动画并从 DOM 中删除时,第二个元素已经可见,因此会产生 UI 故障

以下代码不是我的,但它证明了我的问题。

有人能指出正确的方向吗?

angular.module('app', ['ngAnimate']).
controller('ctrl', function(){});
.fade-element-in.ng-enter {
  transition: 0.8s linear all;
  opacity: 0;
}

.fade-element-in-init .fade-element-in.ng-enter {
  opacity: 1;
}

.fade-element-in.ng-enter.ng-enter-active {
  opacity: 1;
}

.fade-element-in.ng-leave {
  transition: 0.3s linear all;
  opacity: 1;
}
.fade-element-in.ng-leave.ng-leave-active {
  opacity: 0;
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.0/angular.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.0/angular-animate.min.js"></script>

<div ng-app="app" ng-controller="ctrl">
  <a href="" ng-click="showMe = !showMe">Click me</a>
  <div class="fade-element-in" ng-if="showMe">
    SomeContent
  </div>
  <div class="fade-element-in" ng-if="!showMe">
    SomeOtherContent
  </div>
</div>

【问题讨论】:

    标签: javascript css angular angular5 css-animations


    【解决方案1】:

    如果您要一次拥有一个项目,您可以将其设置为 position: absolute 以免相互影响定位

    我们可以进一步添加ng-class来添加动画

    angular.module('app', ['ngAnimate']).
    controller('ctrl', function() {});
    .fade-element-in.ng-enter {
      transition: 0.8s linear all;
      opacity: 0;
    }
    
    .fade-element-in-init .fade-element-in.ng-enter {
      opacity: 1;
    }
    
    .fade-element-in.ng-enter.ng-enter-active {
      opacity: 1;
    }
    
    .fade-element-in.ng-leave {
      transition: 0.5s linear all;
      opacity: 1;
    }
    
    .fade-element-in.ng-leave.ng-leave-active {
      opacity: 0;
    }
    
    .container {
      position: absolute;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.0/angular.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.0/angular-animate.min.js"></script>
    
    <div ng-app="app" ng-controller="ctrl">
      <a href="" ng-click="showMe = !showMe">Click me</a>
      <div class="container">
        <div ng-class="{'fade-element-in': showMe}" ng-if="showMe">
          SomeContent
        </div>
      </div>
      <div class="container">
        <div ng-class="{'fade-element-in': !showMe}" ng-if="!showMe">
          SomeOtherContent
        </div>
      </div>
    </div>

    【讨论】:

    • 谢谢!这似乎解决了大部分问题......但这真的是处理这个问题的最理想方法吗?我觉得我缺少一个更优雅的解决方案
    • 很高兴为您提供帮助,如果您只是使用 ng-class 添加类,它只会淡入项目我觉得这是一种更好的处理方式
    • @OmriBtian 有什么比一行 CSS 和一个 ng-class 更优雅的呢?
    猜你喜欢
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 2023-03-26
    • 2023-02-10
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 2017-04-27
    相关资源
    最近更新 更多