【发布时间】:2015-08-02 20:56:10
【问题描述】:
我有通过 CSS3 设置动画的元素列表,如下所示:
.anim-slide-left {
animation: anim-slide-left 0.8s ease forwards;
-webkit-animation: anim-slide-left 0.8s ease forwards;
}
@-webkit-keyframes anim-slide-left {
0% {
transform: translateX(-500px);
-webkit-transform: translateX(-500px);
opacity: 0;
}
100% {
transform: translateX(0);
-webkit-transform: translateX(0);
opacity: 1;
}
}
/* there are more, but very similar */
当页面加载时,js 应该只为具有特殊类“animate”的可见元素设置动画:
$(function() {
var $window = $(window);
var $toAnimate = $('.animate');
animate();
// check if element is on the viewport
function isElementVisible(elementToBeChecked)
{
var TopView = $(window).scrollTop();
var BotView = TopView + $(window).height();
var TopElement = elementToBeChecked.offset().top;
return ((TopElement <= BotView) && (TopElement >= TopView));
}
// add css animation class
function animate()
{
$toAnimate.each(function(i, el)
{
var $el = $toAnimate.eq(i);
if ($el.length && isElementVisible($el))
{
// remove already visible elements
$toAnimate.splice(i, 1);
// setting up animation effect
$el.addClass( $el.data('effect') );
$el.removeClass('animate');
}
});
}
});
现在问题来了。只有每隔一个元素被检查为可见,如下所示:
但应该是这样的:
其余元素仅在页面向下滚动时才会进行动画处理,其中:
$window.scroll( function()
{
animate();
});
如何遍历这个场景中的每个元素?
编辑:
注意到@T.J. Crowder cmets 我用@charlietfl 建议的过滤功能修改了动画功能:
$('.animate').filter( function( idx ) {
if( isElementVisible($(this)) )
{
$(this).addClass( $(this).data('effect') );
$(this).removeClass('animate');
}
});
它工作得很好:) 谢谢你们。
【问题讨论】:
-
好吧,当您从正在循环的集合中删除条目时,可能会发生类似的事情 (
$toAnimate)。 -
还要注意
splice不是官方的jQuery方法。它是无证的,可能随时消失。 (jQuery 对象不是数组;它们只是 类数组。) -
And 据我所知,jQuery 使 no guarantees 关于
each在您正在迭代的集合中添加或删除条目时会做什么(不像 JavaScript 的forEach)。 -
您可能想要
filter()而不是使用each()和splice()。splice()对原始收藏具有破坏性,而filter()则没有 -
@T.J.Crowder 谢谢你的 cmets,你是绝对正确的,所以我相信 @charlietfl 的答案是最好的
filter函数。
标签: javascript jquery html css css-animations