【发布时间】:2019-07-27 17:06:00
【问题描述】:
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);
【问题讨论】:
-
你期待它应该是怎样的?无论是否快速点击,都一一动画化?
-
是的,一个一个,即使是快速点击
-
注意:您的选择器中缺少右方括号。
-
@trincot 很好,但不是什么破坏了它:(
标签: javascript html animation