JS、jQuery:如何制作链式 jQuery 动画而不是等到上一个动画完成?

发布于 2024-10-20 14:10:57 字数 1671 浏览 1 评论 0原文

您可能知道,如果您使用“complete”参数将 jQuery 动画链接在一起,则每个动画仅在前一个动画完成后才会连续发生。

我有一个链,如下所示:

$('#foobar').load(url, function(){
    $(this).fadeIn(time, function(){
        $(this).scrollTop(position, time, function() {
            $(this).css({'color':'#58e'})
        });
    });
});

该链将执行如下操作:首先加载内容,然后淡入,然后滚动到顶部,最后更改 css 颜色。

我想要的是这样的:首先加载内容,然后淡入并同时滚动到顶部,最后在 fadeInscrollTop 都完成后更改颜色。

假设 scrollTop 动画的时间是 fadeIn 动画的两倍。我将在我的代码中添加什么简单的代码,以便 fadeIn 中的 scrollTop 回调不会等待 fadeIn 动画完成。像平常一样,css() 动画将等待 scrollTop 动画完成。

因此,唯一的更改(无论是什么)将影响调用 scrollTopfadeIn 内的回调。我猜这可能与操纵队列有关?

感谢您的帮助!

编辑:这是安德鲁暗示的解决方案:

首先,我的原始代码按顺序加载每个自定义函数:

show_loader(0, function() {
    close_box($target_close, '/', '#' + $target_close.attr('id') + ' .post_wrap', function() {
        open_box($target_open, event.value, '.wide-col', function() {
            hide_loader(function() {
                scroll_to_content($target_open);
            });
            $target_close = $target_open;
        });
    });
});

现在我希望 close_box 和 open_box 异步执行(同时),所以我将其更改为:

show_loader(0, function() {
    close_box($target_close, '/', '#' + $target_close.attr('id') + ' .post_wrap');
    open_box($target_open, event.value, '.wide-col', function() {
        hide_loader(function() {
            scroll_to_content($target_open);
        });
        $target_close = $target_open;
    });
});

现在 close_box 和 open_box动画“同时”发生。

As you may know, if you chain jQuery animations together using the "complete" parameter, each animation happens in succession only after the previous is complete.

I have a chain, like this:

$('#foobar').load(url, function(){
    $(this).fadeIn(time, function(){
        $(this).scrollTop(position, time, function() {
            $(this).css({'color':'#58e'})
        });
    });
});

This chain will execute something like this: first load content, then fade in, then scroll to the top, then finally change the css color.

What I want is this: first load the content, then fade in and scroll to the top at the same time, then finally change the color after fadeIn and scrollTop are both done.

Let's say the scrollTop animation takes twice as long than the fadeIn animation. What simple piece of code would I add to my code so that the scrollTop callback in fadeIn DOESN'T wait for the fadeIn animation to complete. The css() animation will wait for the scrollTop animation to complete, like normal.

So the only change (whatever it might be) would affect the callback within fadeIn where scrollTop is called. I'm guessing it might have to do with manipulating the queue?

Thanks for the help!

EDIT: Here's the solution as hinted by Andrew:

First, my original code which loads each custom function in order:

show_loader(0, function() {
    close_box($target_close, '/', '#' + $target_close.attr('id') + ' .post_wrap', function() {
        open_box($target_open, event.value, '.wide-col', function() {
            hide_loader(function() {
                scroll_to_content($target_open);
            });
            $target_close = $target_open;
        });
    });
});

Now I want close_box and open_box to execute asynchronously (at the same time), so I changed it to this:

show_loader(0, function() {
    close_box($target_close, '/', '#' + $target_close.attr('id') + ' .post_wrap');
    open_box($target_open, event.value, '.wide-col', function() {
        hide_loader(function() {
            scroll_to_content($target_open);
        });
        $target_close = $target_open;
    });
});

Now close_box and open_box animations happen at the "same time".

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

驱逐舰岛风号 2024-10-27 14:10:57

将回调外部的 scrollTop 动画代码移至 fadeIn 函数:

$('#foobar').load(url, function() {
    $(this).fadeIn(time);            
    $(this).scrollTop(position, time, function() {
        $(this).css({'color':'#58e'});
    });
});

Move the code that animates scrollTop outside of the callback to the fadeIn function:

$('#foobar').load(url, function() {
    $(this).fadeIn(time);            
    $(this).scrollTop(position, time, function() {
        $(this).css({'color':'#58e'});
    });
});
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文