【问题标题】:Jquery text animation delay function not workingJquery文本动画延迟功能不起作用
【发布时间】:2012-06-22 13:18:40
【问题描述】:

我有以下 jquery 文本飞入动画。在我进一步解释之前,这是我的代码:

<script type="text/javascript">

$(document).ready(function(){

    $('.flying1 .flying-text').css({opacity:0});
    $('.flying1 .active-text').animate({opacity:1, marginLeft: "0px"}, 1200); //animate first text
    var int = setInterval(changeText, 3500);    // call changeText function every 5 seconds

function changeText(){  
    var $activeText = $(".flying1 .active-text");     //get current text    
    var $nextText = $activeText.next();  //get next text

    if ($activeText.is('.end')) {
        $activeText.stop().delay(5000);
        $('.flying1').html('<div class="flying-text active-text">Text4<div>
                                <div class="flying-text">Text5</div>
                                <div class="flying-text end2">Text6</div>');
        $('.flying1 .flying-text').css({opacity:0});
        $('.flying1 .active-text').animate({opacity:1, marginLeft: "0px"}, 1200); //animate first text
    };

    if ($activeText.is('.end2')) {
        $activeText.stop().delay(5000);
        $('.flying1').html('<div class="flying-text active-text">Text1<div>
                                <div class="flying-text">Text2</div>
                                <div class="flying-text end">Text3</div>');
        $('.flying1 .flying-text').css({opacity:0});
        $('.flying1 .active-text').animate({opacity:1, marginLeft: "0px"}, 1200); //animate first text
    };

    $nextText.css({opacity: 0}).addClass('active-text').animate({opacity:1, marginLeft: "0px"}, 1200, function(){

        $activeText.removeClass('active-text');                                           
    });
}
});
</script>

HTML

<div class="flying-text active-text">Text1<div>
<div class="flying-text">Text2</div>
<div class="flying-text end">Text3</div>

现在你可以看到,Text1-3 首先动画/飞入,然后当到达 Text3 时,它们在动画中被 Text4-6 替换,当再次到达 Text6 时,它再次循环回到 Text1-3。 ..现在基本上我想做的是在到达文本末尾时暂停/延迟动画更长的时间,即在 Text3(class="flying-text end") 和 Text6(class="flying-text end2 “。所以我希望 Text3 和 Text6 的动画时间比其他所有的都长。我该怎么做?我使用的代码:

$activeText.stop().delay(5000);

没有用...

谢谢

【问题讨论】:

  • 您的引号嵌套不正确。你能在jsfiddle.net 上创建一个例子吗?
  • Text3 是否应该保留在屏幕上直到下一个周期开始?
  • 仅供参考,jQuery 将有一个新的动画引擎:blog.jquery.com/2012/06/22/…
  • @Alnitak,是的,是的。TExt3 应该比文本 1 和 2 停留更长的时间,然后淡出并引入 Text4-6
  • @DexterSchneider 旧评论 - 我已经回答了问题并获得了赏金;-)

标签: javascript jquery


【解决方案1】:

我认为你自己把事情搞得太复杂了。

您只需要使用普通的setTimeout 来触发下一个动画,但在动画“完成”功能中执行此操作,以确保您不会将动画计时器与普通计时器混合。

出于同样的原因,您还应该避免使用 setInterval - 它会与任何动画计时器不同步,尤其是当 jQuery 作者恢复使用 requestAnimationFrame 时。

这是我的解决方案:

var text = [
    ['Text1', 'Text2', 'Text3'],
    ['Text4', 'Text5', 'Text6']
    ];

var n = 0,
    page = 0;
var $f = $('.flying-text');

function changeText() {
    $f.eq(n).text(text[page][n]).css({
        opacity: 0,
        marginLeft: '-50px'
    }).animate({
        opacity: 1,
        marginLeft: "0px"
    }, 1200, function() {
        if (++n === 3) {
            page = 1 - page;
            n = 0;
            setTimeout(function() {
                $f.empty();
                changeText();
            }, 6000);
        } else {
            setTimeout(changeText, 2000);
        }
    });
};

changeText();​

http://jsfiddle.net/alnitak/GE2gN/ 的工作演示

请注意,这将文本内容与动画逻辑完全分开。

【讨论】:

  • 这对我来说很好,希望德克斯特会同意。我花了很长时间摆弄超时和间隔,但无法比上面更进一步。
  • 太棒了。这正是我所需要的。非常感谢您的帮助和努力。问题是,我尝试在我的网页上实现它,但它不起作用。我按原样使用它,所有内容都按原样复制,但没有出现任何文字。我还使用了一些其他预加载器脚本和一些其他 jquery 函数,所以我不知道它们是否冲突。有什么建议吗?
  • @DexterSchneider 这很棘手 - 你的页面在任何地方都是公开的吗?
  • 是的,但是我已经将有问题的主 div 上的代码改回原来的样子(在上面建议的更改之前)......你可以在这里看到它......我经常改变它的东西,但基本功能和布局仍然存在:v4m.mobi/index.php/en/…
  • @DexterSchneider 很好,我们知道我的代码在独立时可以工作。当您将它放在自己的页面中时,它是否会产生任何控制台错误?另外,不要忘记这个版本要求飞行 div 存在,但它们不需要任何内容​​ - 脚本会即时添加。
【解决方案2】:

这里有一个类似的问题:

delay JQuery effects

在第二个答案的 cmets 中,它指出延迟不适用于停止。

希望这个页面对你有用。

编辑 好的,我找到了解决方案。试试这个,让我知道它是否合适。

用这个替换你的延迟线:

  $(this).animate('pause').delay(5000).animate('resume');

【讨论】:

  • 嗨。我在不同的元素和不同的实现上尝试了该功能,但主要功能/动画仍然覆盖它。有什么提示吗?真的很感激。我真的试过了
  • 你能在 jsfiddle.net 上做一个工作示例吗?那我可以好好看看。
  • 嗨。这是一个工作示例。 jsfiddle.net/pB8zp/8 我基本上想要做的是在淡出之前暂停最后一个文本元素(即文本 3 和文本 6)。谢谢!
  • 我已经成功了。请参阅我上面的编辑。另请参阅jsfiddle.net/pB8zp/16
  • 谢谢,但从外观上看它不起作用。它似乎只在第一次显示 Text3 时应用它,然后它会忽略它。我将延迟更改为 8000 并且它根本不会延迟那么长时间......对此有什么建议吗?感谢您的帮助,不胜感激
【解决方案3】:

对您的动画进行排队,并使用.delay() on,这是一个常见的队列对象 (demo):

var text = [
        [ 'Text1', 'Text2', 'Text3' ],
        [ 'Text4', 'Text5', 'Text6' ]
    ],
    reset = {
        opacity: 0,
        marginLeft: -50
    },
    flyout = {
        opacity: 1,
        marginLeft: 0
    },
    flyoutDuration = 1200,
    changeTextDelay = 5000,
    q = $({}), // can also be a common element, e.g. $('.flying1')
    pos = 0;

function changeText() {
    $('.flying1 .flying-text').each(function(i) {
        var div = $(this);

        // setup text
        div.css(reset).text(text[pos][i]);

        // queue
        q.queue(function(next) {
            div.animate(flyout, flyoutDuration, next);
        });
    });

    q.delay(changeTextDelay).queue(function(next) {
        pos = (pos + 1) % text.length;
        changeText();
        next();
    });
}

changeText();

【讨论】:

  • 这实际上会在每个单独的文本滑出之间提供延迟吗?好像没有
  • @Alnitak 您的问题只要求在“Text3”和“Text6”之后延迟。这是每次滑出后都有延迟的版本:jsfiddle.net/jefferyto/pB8zp/73
  • 实际上这不是我的问题,但最初的问题希望在每第三个项目之后额外延迟 - 每个 1.2 秒动画开始之间有 3.5 秒。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
  • 1970-01-01
  • 1970-01-01
  • 2019-01-05
  • 1970-01-01
  • 2011-05-02
相关资源
最近更新 更多