Javascript 设置元素队列的动画将跳到最后一个元素
规则:Javascript 设置元素队列的动画将跳到最后一个元素,javascript,html,animation,Javascript,Html,Animation,规则: <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="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>
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);
- 每次单击都将添加一个
元素 - 每个进度条将设置为完全动画
- 直到上一步完成,动画才会开始
<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>
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);
如果快速单击,它将仅为最后一个进度条设置动画。动画应该一个接一个地进行,直到完成
问题:
<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>
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);
快速单击时,为什么动画会出现问题
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>
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);
添加进度
JS:
<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>
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);
const container=document.querySelector('.progress container');
const inputSeconds=document.querySelector('.inputSeconds');
const addBtn=document.querySelector('.addprogress');
设动画=假;
函数animateProgress(持续时间,el){
const intervalId=setInterval(()=>{
如果(标高值>=标高最大值){
动画=假;
窗口。clearInterval(intervalId);
console.log('finished');
checkQueue();
返回;
}
el.value+=el.max/持续时间;
}, 1000);
}
函数getSeconds(){
返回parseInt(inputSeconds.value,10);
}
让progressCount=0;
函数createProgress(){
常量模板=``;
container.innerHTML+=模板;
const el=document.querySelector(`[data progress=“${progressCount}]”`);
progressCount++;
返回el;
}
让队列=[];
函数addProgress(){
const el=createProgress()
排队推送(el);
checkQueue();
}
函数checkQueue(){
if(queue.length&&!动画){
动画=真;
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]);
以及:
你期望它会是什么样子?一个接一个地设置动画,无论它是否被快速单击?是的,一个接一个,即使在单击快速时也是如此。YNB:选择器中缺少一个结束方括号。@trincot很好,但不是破坏它的原因:(@MatthewHarwood不确定您是否意识到。但在排队后,您会注意到progressBar的增加基于当前值,而不是输入时的值。如果该行为不是有意的,请参阅我答案的补充。