gpt4 book ai didi

javascript - 动画元素队列正在跳到最后一个元素

转载 作者:可可西里 更新时间:2023-11-01 13:19:18 27 4
gpt4 key购买 nike

CodePen

规则:

  • 每次点击都会添加一个 <progress>元素。
  • 每个进度条都将动画显示到满。
  • 动画只有在上一个动画完成后才会开始。

问题:

如果快速点击,它只会激活最后一个 progress酒吧。动画应该一个接一个地发生,直到完成。

问题:

为什么快速点击时动画乱序?

HTML:

<div class="container">
<div class="add-progress-container">
<input class="input-seconds" type="number" min="1" max="10" value="1">
<button class="add-progress">Add progress</button>
</div>
<div class="progress-container"></div>
</div>

JS:

const container = document.querySelector('.progress-container');
const inputSeconds = document.querySelector('.input-seconds');
const addBtn = document.querySelector('.add-progress');
let animating = false;


function animateProgress(duration, el) {
const intervalId = setInterval(() => {
if(el.value >= el.max) {
animating = false;
window.clearInterval(intervalId);
console.log('finished');
checkQueue();
return;
}

el.value += el.max/duration;
}, 1000);
}


function getSeconds() {
return parseInt(inputSeconds.value, 10);
}

let progressCount = 0;

function createProgress() {
const template = `<progress data-progress="${progressCount}" value="0" max="100"></progress>`;
container.innerHTML += template;
const el = document.querySelector(`[data-progress="${progressCount}"]`);
progressCount++;
return el;
}

let queue = [];
function addProgress() {
const el = createProgress()
queue.push(el);
checkQueue();
}

function checkQueue() {
if(queue.length && !animating) {
animating = true;
animateProgress(getSeconds(), queue.shift());
}
}

addBtn.addEventListener('click', addProgress);

最佳答案

innerHTML+= 赋值将重新创建容器元素内的所有先前元素,这意味着您对其他 progress 元素的引用不再指向该赋值创建的实际元素.

你应该像这样添加一个新的进度元素:

function createProgress() {
const el = document.createElement("progress");
el.setAttribute("data-progress", progressCount);
el.setAttribute("value", 0);
el.setAttribute("max", 100);
container.appendChild(el);
return el;
}

正如 Makyuu 在下面评论的那样,单个进度元素的步数仅在它们的动画开始时才计算。这意味着如果您更改输入值,它也将应用于以前创建的元素(当它们尚未开始动画时)。

如果打算使用在创建元素时指示的步骤数,则修改代码中的两行:

queue.push([getSeconds(), el]);

和:

animateProgress(...queue.shift());

关于javascript - 动画元素队列正在跳到最后一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55016226/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com