@Anonymous12344321

Как визуализировать работу цикла в элементе html?

Есть простой скрипт для вычисления процента выполнения цикла:
window.onload = function () {

    let line = document.querySelector('#line');

    function animateLine() {
        let n = 10000;

        let step = 100 / n;
        let output_step = 0;


        for (i = 0; i < n; i++) {
            output_step += step;
            line.style.width = output_step + "%";
            console.log(output_step);
        }
    }
    animateLine();
}


Суть идеи была в том, чтобы визуализировать процент работы цикла как линию в html(т.е в html есть блок, который увеличивает свою длину по мере выполнения цикла).
<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width">
    <title>Coffee</title>
    <link rel="stylesheet" type="text/css" href="style.css">
    <script src="showMenu.js"></script>
</head>

<body>


    <div id="line"></div>

    <script src="script.js"></script>

    <style>
        #line {
            width: 10%;
            height: 20px;
            background: red;
        }

        

    </style>

</body>

</html>


Процент вычисляется верно, но проблема в том, что в процессе выполнения цикла я не могу изменять стили(страница в момент выполнения цикла как-бы зависает). Т.е линия изменяет свою ширину только после выполнения цикла и ширина сразу становится равна 100%. Есть ли инструменты, при помощи которых можно исправить эту проблему?
  • Вопрос задан
  • 92 просмотра
Пригласить эксперта
Ответы на вопрос 3
Судя по коду, процент выполнения у тебя ни от чего не зависит, просто длинна линии постепенно должна увеличиться от 0 до 100 процентов.
Тут в принципе вычисления не нужны, делаешь анимацию или animation или transition за определенное время, увеличивая например width
Даже если ты перепишешь свой цикл, так, чтобы он правильно передавал output_step в асинхронный requestAnimationFrame , цикл у тебя все равно останется синхронным, сначала пройдет весь цикл, и только после этого из очереди будут выполнятся твои requestAnimationFrame и меняться длинна. По сути это не будет анимацией выполнения цикла.

Если ты делаешь анимацию пачки асинхронных событий, например загрузки файлов, то, как сказали выше, лучше использовать requestAnimationFrame внутри асинхронного события (загрузка каждого файла из пачки)
Ответ написан
Комментировать
zkrvndm
@zkrvndm
Архитектор решений
Так ты хотя бы задержку какую-то задай в цикле:
window.onload = function () {

    let line = document.querySelector('#line');

    async function animateLine() {
        let n = 10000;

        let step = 100 / n;
        let output_step = 0;


        for (i = 0; i < n; i++) {
            output_step += step;
            line.style.width = output_step + "%";
            console.log(output_step);
            await new Promise(function(s) { setTimeout(s, 100); }); // Пауза в 100 мс.
        }
    }
    animateLine();
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы