首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >javascript:使用transitionend和setTimeout来协调一个循环?

javascript:使用transitionend和setTimeout来协调一个循环?
EN

Stack Overflow用户
提问于 2020-12-20 03:06:14
回答 2查看 105关注 0票数 0

我怎样才能更好地计时这个循环?我试图遍历DOM中的所有div,并将它们转换到5s以上,然后删除它们。我认为我没有正确地使用transitionend事件。我只想一次转换一个元素,删除它,然后继续循环。

代码语言:javascript
复制
let els = document.querySelectorAll('div');


els.forEach((x,i) => {
    setTimeout(() => {
       x.style.transform = 'translate(400%, 400%)';
       x.style.transition = 'all 5s ease-in';
       x.addEventListener('transitionend', () => {
         console.log("transition has ended");
         x.remove()
       });
    }, i * 400); 
})
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-20 03:08:29

由于转换持续5秒,所以将i乘以5000,而不是400:

代码语言:javascript
复制
let els = document.querySelectorAll('div');


els.forEach((x,i) => {
    setTimeout(() => {
       x.style.transform = 'translate(400%, 400%)';
       x.style.transition = 'all 5s ease-in';
       x.addEventListener('transitionend', () => {
         console.log("transition has ended");
         x.remove()
       });
    }, i * 5000); 
})
代码语言:javascript
复制
<div>foo</div>
<div>foo</div>
<div>foo</div>

一种更普遍的办法是,如果事先不知道过渡时间,就应等待承诺:

代码语言:javascript
复制
let els = document.querySelectorAll('div');

setTimeout(() => {
  (async () => {
    for (const x of els) {
      await new Promise((resolve) => {
         x.style.transition = 'all 5s ease-in';
         x.style.transform = 'translate(400%, 400%)';
         x.addEventListener('transitionend', () => {
           console.log("transition has ended");
           x.remove()
           resolve();
         });
      });
    }
  })();
});
代码语言:javascript
复制
<div>foo</div>
<div>foo</div>
<div>foo</div>

票数 2
EN

Stack Overflow用户

发布于 2020-12-21 00:42:25

我不认为setTimeOut的使用有什么意义,这仅仅是为了启动转换吗?

在这种情况下,我更喜欢使用按钮!

代码语言:javascript
复制
let divs   = document.querySelectorAll('div')
  , btTest = document.querySelector('button')

const elmTransEnd = el => new Promise(rsvl =>
  {
  const endTrans=e=>{ el.removeEventListener('transitionend', endTrans);rsvl() }
  el.addEventListener('transitionend', endTrans);
  el.style.transition = 'all 3s ease-in';  
  el.style.transform = 'translateX(80%)';
  });
 
async function* stepGen(elArr) { yield* elArr; }

async function launchTransitions()
  {
  for await (let el of stepGen([...divs]))
    {
    await elmTransEnd(el);
    console.log('el', el.textContent, 'done')
    el.remove()
    }
  }
  
btTest.onclick = _ => 
  {
  btTest.disabled = true
  launchTransitions()
  }
代码语言:javascript
复制
<button>test</button>

<div>foo1</div>
<div>foo2</div>
<div>foo3</div>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65376593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档