使用 history.back() 时的不同动画

Different animation when history.back() ist used

我根据 AngularJS 创建了一个网站。每个页面都有自己的模板和控制器,并通过 ng-view 包含在主布局中。

但我对不同页面之间的动画有疑问。如果向前导航,我希望它们从右侧飞入(并向左消失),反之亦然(从左侧飞入,向右消失)当用户点击浏览器的后退按钮或 history.back()在JS代码中触发。

我该怎么做?

我已经设法通过将它们分配给 classes ng-enterng-leave 来定义动画,但是当按下后退按钮时它们不会改变,即最后一页从右边进入,不是从左边进入。

我还尝试将向后动画定义为默认动画,并在我想向前导航时动态更改 ng-view 元素的 class 以使用正确的动画,但是重置这个临时 class 我(想我)不得不使用一个计时器,它在 X 毫秒后(当动画完成时)简单地重置它。不幸的是,当用户按回 quickly/during 前进动画时,这会导致错误。

我设法找到了解决方案。你可以see it online, or read the code

基本思路是这样的:

  • 后退动画为默认动画
  • 每当我们想要为前进设置动画时,这是通过一个更改容器类名的特殊函数来完成的,因此使用了前进动画
  • 从 DOM
  • 中删除旧页面后,此更改将被撤消

最后一步很重要:不要使用计时器或类似的东西。当在前进动画期间按下浏览器后退按钮时,计时器不会注意到,并且类名的更改不会撤消。
但是当按下按钮时,旧页面不会完成它的动画,它会立即从 DOM 中删除,这会触发更改类名的代码。


代码中最重要的部分:

使用此功能使用前进动画更改当前页面:

function animateForwards(callback) {
    $('#container').addClass("animation-forwards");
    $('#container').removeClass("animation-backwards");
    callback();
}

animateForwards(function () { $location.path("/newPage"); });

从 DOM:

中删除旧页面后,此函数会撤消类名的更改
$("#container").bind(
  "DOMNodeRemoved",
  function(objEvent) {
    // Append event to log display.
    if ($(objEvent.target).hasClass('page')) {
      $('#container').removeClass("animation-forwards");
      $('#container').addClass("animation-backwards");
    }
  }
);