#javascript #html #css
#javascript #HTML #css
Вопрос:
При загрузке документа мне нужно, чтобы три индикатора выполнения выполнялись последовательно один за другим, используя ванильный JS, HTML и CSS. Поэтому, когда первый завершает загрузку до завершения (это максимальное значение), следующий запускается. Я не ищу сложное CSS-решение. Мне любопытно узнать, как это сделать только с помощью vanilla JS без подхода setTimeout.
Я создал это на jsfiddle https://jsfiddle.net/blitzr/vf78hu0g/3 /
<div>
<label>Bar 1</label>
<progress class="progressBars" value="0" max = "90"></progress>
<br>
<label>Bar 2</label>
<progress class="progressBars" value="0" max = "35"></progress>
<br>
<label>Bar 3</label>
<progress class="progressBars" value="0" max = "35"></progress>
<br>
</div>
Я показываю, как я бы подошел к одному индикатору выполнения.
var index = 0;
var id;
let bars = document.getElementsByClassName(`progressBars`);
this.id = setInterval(() => {
increaseProgress(bars[this.index])
}, 10 );
function increaseProgress(bar) {
if (bar.value < bar.max) bar.value ;
else {
clearInterval(this.id);
}
}
Со следующим css
progress {
width: 500px;
}
progress::-webkit-progress-bar{
background-color: gray;
}
progress::-webkit-progress-value{
background-color: green;
}
Ответ №1:
Вы можете написать функцию, которая запускает интервальный таймер для определенного бара в вашей bars
HTMLCollection. Функция может принимать индекс, представляющий, с какого бара начинать выполнение, и затем будет использоваться setInterval()
для обновления значения этого конкретного индикатора выполнения. Когда строка заполнится, вы можете очистить свой интервал, а затем снова вызвать свою функцию с индексом следующего столбца в вашей коллекции, который будет равен at index 1
. Перед запуском вашей функции вы также можете проверить, что bar
это определено как в конечном итоге будет передан индекс, которого нет в вашей HTMLCollection bars
:
const bars = document.getElementsByClassName('progressBars');
function startProgress(bars, index = 0) {
const bar = bars[index];
if (!bar) return;
const id = setInterval(() => {
if (bar.value < bar.max) bar.value ;
else {
clearInterval(id);
startProgress(bars, index 1);
}
}, 10);
}
startProgress(bars);
<label>Bar 1</label>
<progress class="progressBars" value="0" max="90"></progress>
<br />
<label>Bar 2</label>
<progress class="progressBars" value="0" max="35"></progress>
<br />
<label>Bar 3</label>
<progress class="progressBars" value="0" max="35"></progress>