当前位置: 首页 > 面试题库 >

AngularJS CSS动画+完成回调

桓宜
2023-03-14
问题内容

我正在使用AngularJS,并希望在动画制作完成后得到通知。我知道可以使用像这样的javascript定义的动画来完成此操作myApp.animation(...),但是我很好奇我是否可以不用javascript来做到这一点。

问题: 是否可以使用角度 ng-enter ng-leave css-
transitions并指定完成的回调?我猜该animationend事件已被触发,因此应该有一种方法可以执行此操作。

我有这个:

HTML:

<div ng-if="item" class="myDiv"> {{ item.name }} </div>

CSS:

.myDiv.ng-enter {...}
.myDiv.ng-enter.ng-enter-active {...}
.myDiv.ng-leave {...}
.myDiv.ng-leave.ng-leave-active {...}

我想myDone()在动画结束时(即在ng-enter-active删除类之后)调用。


问题答案:

是的,您可以使用该$animate服务,这通常是在自定义指令中完成的。动画的一个简单例子是在单击时以某种方式对元素进行动画处理。例如,说要删除点击元素,并使用.ng-leave指定的动画传递回调

app.directive('leaveOnClick', function($animate) {
  return {
    scope: {
      'leaveOnClick': '&'
    },
    link: function (scope, element) {
      scope.leaveOnClick = scope.leaveOnClick || (function() {});
      element.on('click', function() {
        scope.$apply(function() {
          $animate.leave(element, scope.leaveOnClick);
        });
      });
    }
  };
});

可以这样使用:

<div class="my-div" leaveOnClick="done()">Click to remove</div>

使用CSS淡出元素:

.my-div.ng-leave {
  opacity: 1;
  transition: opacity 1s;
  -webkit-transition: opacity 1s;
}
.my-div.ng-leave.ng-leave-active {
  opacity: 0;
}

您可以在此Plunker上看到以上动画的动作。

但是,据我所知,ngIf没有任何挂钩可以传递回调,因此您必须编写自己的指令。以下是对ngIf修改版本的描述,该版本最初是从ngIf源复制并重命名为animatedIf。可以由以下人员使用:

<div class="my-div" animated-if="shown" animated-if-leave-callback="leaveDone()" animated-if-enter-callback="enterDone()" >Some content</div>

它的工作方式是使用手动观察器对传递给的表达式的更改做出反应animated-if。与原始ngIf的主要区别在于添加了“
scope”参数以在以下位置传递回调:

scope: {
  'animatedIf': '=',
  'animatedIfEnterCallback': '&',
  'animatedIfLeaveCallback': '&'
},

然后在动画之后修改对的调用$animate.enter$animate.leave调用这些回调:

var callback = !oldValue && $scope.animatedIfEnterCallback ? $scope.animatedIfEnterCallback : (function() {});
$animate.enter(clone, $element.parent(), $element, callback);

$animate.leave(block.clone, ($scope.animatedIfLeaveCallback || (function() {})));

回车键有点复杂,要在初始加载指令时不调用回调函数。由于有此scope参数,此伪指令创建一个隔离的作用域,然后在包含内容时使用它。因此,需要进行的另一项更改是从$parent指令的作用域中创建作用域并将其用作子元素:

 childScope = $scope.$new();

必须更改为

 childScope = $scope.$parent.$new();

您可以在此Plunker中看到修改后的ngIf指令的完整源代码。这只是经过极其简短的测试。

可能有一种更简单的方法,也许是不完全重新创建ngIf指令,而是使用包含原始ngIf和某些包装div的模板创建一个指令,例如

template: '<div><div ng-if="localVariable"><div ng-transclude></div></div></div>'


 类似资料:
  • 问题内容: 在css3动画的情况下,有什么方法可以实现回调函数?如果使用Javascript动画,则可能会在CSS3中找到实现它的方法,但找不到任何方法。 我可以看到的一种方法是在动画持续时间之后执行回调,但是并不能确保始终在动画结束后立即调用它。这将取决于浏览器UI队列。我想要一个更强大的方法。有什么线索吗? 问题答案: 就在这里。回调是一个事件,因此您必须添加事件侦听器才能捕获它。这是jQue

  • 我有一个用于交互式过渡的自定义动画师。还有一个,根据过渡进度设置为。效果的动画代码如下: 我通过调用它,当从它到第一个的转换开始时,它在第二个上调用。 然而,我这里有一个问题。在动画结束之前调用完成块。当我第一次运行转换(没有取消它)时,它工作得很好,但在随后的运行过程中,它就不工作了。 我也曾尝试将动画添加到我的动画师中,但也没有成功。 此外,当我取消转换时,在实际动画结束之前调用完成块(在这种

  • 问题内容: 我想等到Android ImageView中的动画完成*后再继续执行程序,这样做的正确方法是什么? (在这种情况下,“完成”是指它恰好一次遍历所有帧,并在最后一帧停止。我不清楚该动画是否会是android:oneshot =“ true”动画,因为我将多次使用它时间,但不会连续而是间歇地运行) 研究/猜测: 答:从本质上讲,我的问题似乎是Java线程问题,因为Android Anima

  • 每当此动画结束时,我都会尝试调用一个方法,但在某些情况下,例如,当用户离开应用程序时,它的完成块永远不会被调用。此外,当VC与UIView动画同时出现时,完成块永远不会被调用。 即使动画以某种方式中断,我应该如何确保调用回调?我是否应该根本不使用UIView动画完成块,而是使用其他内容?请开导我。。!

  • 我在我正在开发的应用程序中发现了一个奇怪的错误。在我进入细节之前,我将陈述我的问题 1-为什么不能调用UIView动画完成块 2-为什么在显示模式视图后会调用UIView动画完成块? 我有一系列UIView动画,它们在视图控制器出现后开始。他们有完成块。绝大多数情况下,动画完成块都会被调用。但每隔一段时间,应用程序就会进入一种状态,完成块不会被调用。 此外,当我从当前视图控制器模态地呈现一个新的视

  • 我有一个动画块来执行一个简单的基于变换的动画,在完成时从它的超级视图中删除有问题的视图。 然后我使用Tech Q详述的代码 但是,此代码不会阻止完成代码的执行。因此,为了防止代码执行,我将完成代码更改为: 当检查finished==TRUE时,动画块暂停时,将阻止执行完成代码。如果在“取消暂停”动画之前超过持续时间,则不会执行完成代码。即在本例中,msgView仍保留在superview中。 是否