javascript - 在 $routeChangeStart 上添加 css 类不会触发动画(除非在 setTimeout 中)

标签 javascript angularjs settimeout css-animations ngroute

我是 Angular 的新手,所以如果我做错了这些步骤中的任何一个,请纠正我。

我试图让我网站左侧和右侧的夹子在初始页面加载时动画化。这是在生产中:https://www.robotsidekick.com

如您所见,它目前可以正常工作(耶)。但是我对我使用的 hack 不满意。以下是相关代码:

在我的 Controller 中,我正在监听 $routeChangeStart,如果这是第一次通过,我会调用:

setTimeout(function() {
    angular.element(document.querySelector('.robotarmleft')).addClass('animate-in');
    angular.element(document.querySelector('.robotarmright')).addClass('animate-in');
}, 0);

捕获两个夹子,添加具有以下 CSS 属性的 animate-in 类:

.robotarm {
    margin-left: -2048px;
    margin-right: -2048px;
}

.animate-in {
    -webkit-transition: all 2s ease;
    -moz-transition: all 2s ease;
    -o-transition: all 2s ease;
    transition: all 2s ease;

    margin-left: -1300px;
    margin-right: -1300px;
}

所以 ARM (希望如此)不在屏幕上,但它们在屏幕上有动画效果。

但是,如果我不在 setTimeout 中将类添加到机器人 ARM ,则根本不会触发动画。

为什么 addClass 必须在 setTimeout 中才能工作?即使对于 Angular,我是否应该在其他一些 onPageLoadTheFirstTime 类型中启动动画?主要是寻找正确的方法来做这类事情,而不是好吧,其他黑客也很有效

感谢您的帮助!

最佳答案

首先想到的是,与 setTimeout() 相比,您应该使用 $timeout 来保持 Angular 摘要循环。

超时可能是必要的,因为它在 DOM 呈现之前执行,这意味着您的 angular.element(..) 调用返回 []。您必须监听在 DOM 呈现后 调用的事件。类似于 ui-router's $viewContentLoaded event .

此外,使用$timeout 将代码延迟一个摘要周期是许多问题的一种非常常见的解决方法,example .

关于javascript - 在 $routeChangeStart 上添加 css 类不会触发动画(除非在 setTimeout 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30111961/

相关文章:

javascript - 如何使用shell在gulp中读取?

javascript - 查找字符串中的数组值

javascript - 错误 : undefined is not an object (evaluating '$scope.inputcode.password' )

javascript - 将数组作为参数传递给 SetTimeout 回调

javascript - 在 Xul 或 javascript 中,有没有办法隐藏鼠标光标?

javascript - .NET Core 如何使用 AJAX 提交带有文件的表单?

javascript - 使用 ng-bind-html 在 HTML 集中进行 Angular 绑定(bind)

javascript - Angular 和 YouTube iframe 问题

javascript - 在迭代到循环的下一次迭代之前完成 FOR 循环内的所有函数

javascript - Javascript事件触发顺序错误?