【问题标题】:How to stop animation after sometime?一段时间后如何停止动画?
【发布时间】:2014-08-20 04:23:07
【问题描述】:

我正在尝试下雪动画。我想在例如之后停止它5秒。我目前在setTimeOut 之间添加animate,不知何故没有效果。我在这里错过了什么?

当前代码:

function fallingSnow() {

   var snowflake;
   snowflake = $('<div class="snowflakes"></div>');

   $('#snowZone').prepend(snowflake);
   snowX = Math.floor(Math.random() * $('#site').width() / 4);
   snowSpd = Math.floor(Math.random() + 50000);

   snowflake.css({
       'left': snowX + 'px'
   });

   setTimeout(function(){
      snowflake.stop().animate({
          top: "700px",
          opacity: "5",
      }, snowSpd, function () {
          $(this).remove();
          fallingSnow();
      })
  },5000);
}

timer = Math.floor(Math.random() + 1000);

window.setInterval(function () {
    fallingSnow();
}, timer);

更新:在使用@Kyojimaru 的回答之后。

snowflake.animate({
        top: "700px",
        opacity: "5",
    }, 5000, function () {
        $(this).remove();           

      if(!end) {
        fallingSnow();
        window.setTimeout(function () {
        clearInterval(interval);
        end = true;
        }, 5000);
      }
    }                          
   );

【问题讨论】:

  • 你能做一个小提琴吗?

标签: javascript jquery jquery-animate settimeout


【解决方案1】:

这是因为您的setInterval 从未停止调用fallingSnow,请尝试将您的代码更改为这个

var firstCall = false;
var interval, timeout;
function fallingSnow() {

   var snowflake;
   snowflake = $('<div class="snowflakes"></div>');

   $('#snowZone').prepend(snowflake);
   snowX = Math.floor(Math.random() * $('#site').width() / 4);
   snowSpd = Math.floor(Math.random() + 50000);

   snowflake.css({
       'left': snowX + 'px'
   });

   if(!firstCall) {
       timeout = setTimeout(function(){
           clearInterval(interval);
       },5000);
       firstCall = true;
   }
}

timer = Math.floor(Math.random() + 1000);

interval = setInterval(function () {
    fallingSnow();
}, timer);

基本上,您需要的是仅在第一次使用 setTimeout 调用函数时使用 clearInterval 清除已为 function fallingSnow() 设置的间隔

这是关于它的另一个例子:JSFIDDLE

这就是你现在可能发生的事情:JSFIDDLE

编辑

基于您的小提琴here(需要将jQuerysnowflakes css width and height 添加到0px 之外的任何内容)

你的问题是你在脚本中声明为

var firstTime = false;

但要检查它

if (!firstCall)

所以您需要将var firstTime = false; 更改为var firstCall = false;

另一个问题来自这里的代码

snowflake.animate({
    top: "700px",
    opacity: "5",
}, snowSpd, function () {
    $(this).remove();
    fallingSnow();
});

在动画完成后再次调用fallingSnow();函数,因此雪永远不会停止下落,所以你需要检查setTimeout是否已经清除了间隔,你需要将你的代码更改为这个

snowflake.animate({
    top: "700px",
    opacity: "5",
}, snowSpd, function () {
    $(this).remove();
    if(!end) {
        fallingSnow();
    }
});

if (!firstCall) {
    timeout = setTimeout(function () {
        clearInterval(interval);
        end = true;
    }, 5000);
    firstCall = true;
}

并以firstCall开头添加var end = false;

这是有效的:JSFIDDLE

【讨论】:

  • @bonCodigo 我找到了问题所在,雪没有显示,因为您将宽度和高度声明为 0px,并且您检查了 firstCall,但您在第一行将其声明为 firstTime,并且完成动画后,您再次调用fallingSnow 函数,如果您希望它在 5 秒后停止所有雪落,这是工作的jsfiddle.net/5pm1yLtv/6(您需要再次更改雪速,我将其设置为 500 仅用于测试)
  • 您的编辑效果 +1。我试图理解为什么我们需要两个 if 声明才能接受答案。在我看来,我应该可以将setTimeOut 添加到这一行if(!end) { fallingSnow(); }。根据我原来的帖子,这个概念snowflake.stop(). 不正确吗?为什么我无法清除 animate 中的interval
  • @bonCodigo 是的,您可以将它放在if(!end) 中以使其更短,但是 setTimeout 将被调用的次数与雪花总数一样多,而不是在初始时只调用一次。对于您使用snowflake.stop() 的原始帖子,它可以工作,但对于当前雪花的animate,但随后您重新应用animate,所以它又开始了。还有最后一个,animate里面的interval不能清除,因为基本不是interval,就像callback on finish animating
  • 您在 循环 setTimeOutunnecessarily 方面是绝对正确的。感谢您解释我的代码中的漏洞以及我们代码背后的推理。很好,您的最终代码在优化方面仍然是最合适的。 Arigato Gosaimazu =) 干杯!
猜你喜欢
  • 2022-08-19
  • 1970-01-01
  • 1970-01-01
  • 2020-11-16
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 2018-03-17
  • 1970-01-01
相关资源
最近更新 更多