Как javascript обновляет элементы в DOM?

#javascript #css #dom

Вопрос:

Я пытаюсь замедлить анимацию изображения, уменьшающегося, чтобы вы действительно могли видеть, как оно уменьшается, вместо того, чтобы просто переходить к меньшему размеру, но вместо этого происходит то, что мой журнал консоли обновляется должным образом-с интервалами между каждым обновлением, но изображение на экране ждет, пока цикл for завершится, а затем переходит к конечному размеру вместо того, чтобы постепенно уменьшаться. Есть ли что-то не так с моим кодом или мне не хватает некоторых закулисных сведений о том, как обновляется страница?

 function sleep(milliseconds) {
    const date = Date.now();
    let currentDate = null;
    do {
      currentDate = Date.now();
    } while (currentDate - date < milliseconds);
}

function makeSmaller(){
    for (let i = 100; i>50; i--){
    rockButtonImage.style.width = i '%';
    console.log(rockButtonImage.style.width);
    sleep(50);
    }
}
 

Ответ №1:

Современные браузеры избегают ненужного отображения страницы и ждут завершения итерации выполнения JavaScript, прежде чем выполнять отображение.

sleep() Функция в предоставленном коде на самом деле не заставляет браузер sleep , а скорее выполняет вычисления с интенсивным использованием процессора, запрещая браузеру что-либо отображать.

Вместо этого вы можете попробовать использовать setTimeout() функцию, например:

 var i = 100;
function makeSmaller(){
    console.log(rockButtonImage.style.width);
    rockButtonImage.style.width = i '%';
    i--;
    if (i > 50) {
        setTimeout(makeSmaller, 50);
    }
}
 

Вы также можете счесть полезным полагаться на CSS-анимацию или CSS-переходы вместо JavaScript для таких визуальных эффектов, поскольку JS далеко не так эффективен, как они есть.

Смотрите также:

Ответ №2:

Вы должны динамически получить элемент DOM getElementById, а затем изменить ширину. Я не уверен, в каком контексте живет переменная RockButton. Все дело в государстве.