如何在每次迭代之间具有间隔的循环中对DOM元素进行动画处理?

我有一个函数foo,我想添加一个sleep / wait函数来制作一种DOM元素动画。我已经做过一些研究,并且知道暂停javascript函数是不可能的,因为它会冻结浏览器-如果我输入错了,请纠正我。我该如何克服?

function foo() {     
 while (someCondition) {
  var $someDiv = $('.someDiv:nth-child(' + guess + ')');
  $someDiv.css({'background-color': 'red'});
  wait 1000ms
  $someDiv.css({'background-color': 'blue'});
  wait 1000ms
  if (someCondition2) { 
   doSomething; }
  else {
   for loop }
 }
}

$someDiv每次while循环迭代都引用不同的DOM元素,因为变量会guess发生变化

我尝试过的

  • 我使用了下面的函数,它起作用了,但问题是我无法for在异步函数foo中使用循环

    function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
    }
    
  • 我尝试过,setTimeout但无法获得任何有效的结果。

    如果我包装setTimeout这段代码:('$someDiv').css({'background-color': 'red'});那么在指定的时间量之后,所有的$someDiv'sCSS样式都会一起更改(请记住,$someDiv每次while循环迭代都指向不同的DOM元素)。

    如果我setTimeout使用语句包装一段代码ifelse那么我会出错-无限循环

仅出于可视化问题的目的简化了foo函数。我正在使用的原始功能可以在Codepen上找到findNumber功能)

我想制作一个二进制搜索算法动画。类似

如何获得理想的结果?

通常:如何在每次迭代之间具有间隔的循环中对DOM元素进行动画处理?

寂寞的一天

解决此问题最好,最简洁的方法是使用Java功能的将来版本(ES2017)中async/await功能这使您摆脱回调地狱。您可以创建一个简单的sleep函数,如下所示:

function sleep(time) {
  return new Promise(resolve => setTimeout(()=>resolve(), time));
}

您可以将其用于常规Promise处理:

sleep(1000).then(()=>console.log('A second later'));

但是,使用该async功能,您可以使用await关键字使代码在继续执行之前等待承诺被解决。

async function doSomething() {
  await sleep(1000);
  console.log('A second later');
}

这意味着您也可以使用普通循环,包括breakandcontinue语句:

async function doSomething() {
  let i = 0;
  while (true) {
    await sleep(1000);
    console.log(i);
    if (++i === 5) break;
  }
}

这意味着您的代码可以大大简化:

async function foo() {
  var n = 5;
  while (n > 0) {
    n--;
    var wait = 0;
    //$('#someDiv').css({'background-color': 'red'});
    console.log('doSomething-1');
    //wait 1000ms
    await sleep(1000);
    //$('#someDiv').css({'background-color': 'blue'});
    console.log('doSomething-2');

    //wait 1000ms
    await sleep(1000);
    if (true) {
      console.log('doSomething-3');
      break;
    } else {
      console.log('loop')
    }
  }
}

jsFiddle

唯一的问题是,此功能远未获得普遍支持。因此,您需要使用Babel这样的软件来进行翻译

还要注意,在后台,您的foo函数现在立即返回并给出一个PromisePromise可以通过函数的返回值来解决。因此,如果您想在完成时执行更多代码,foo则必须这样做foo().then(/*callback*/)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在foreach循环中的每次迭代后进行延迟?

具有间隔动画的图像

如何在带有错误处理的 for 循环中进行迭代

如何在JS中以两个不同的间隔对组件进行动画处理

如何在for循环中的具有精确索引的元素上重复迭代?

使用Maltpoltlib对具有轮廓的pcolormesh进行动画处理

如何在Vue.js2中对表单元素进行动画处理

如何在React中的状态变化上对span元素进行动画处理?

Material-UI:如何在悬停元素上对卡片zDepth进行动画处理(反应)

如何在XAML中多次对元素的宽度进行动画处理?

如何在两个数组的元素之间进行动画转换

如何以循环方式对图像进行动画处理?

如何遍历路径元素并依次对其进行动画处理?

在tkinter中运行连续的动画集,之间有间隔

如何在每次迭代之间添加动画延迟

颤振,如何在没有按钮触发的情况下自动进行动画处理

如何在Qt中对QPixmap进行动画处理?

如何在SwiftUI中对路径进行动画处理

如何在更改URL的同时对项目进行动画处理?

如何在Wpf中对按钮FontSize进行动画处理?

使用带有ChangeImageTransform的共享元素过渡对两个活动之间的ImageView进行动画处理

使用jQuery在无限循环中对单词宽度进行动画处理

使用纯JavaScript在循环中对多个div进行动画处理

jQuery对所有元素进行动画处理,而不是仅对下一个进行动画处理

使用霓虹灯元素对光dom元素进行动画处理

如何在每次循环迭代中更新DOM?

如何在 for 循环中对变量进行永久更改,以便该变量不会在每次迭代中重置?

如何使用带有间隔的FFMPEG创建动画GIF?

使用 CSS 动画对 div 进行动画处理,两者之间略有延迟