@big_hasan

Почему не срабатывает задержка setTimeout в цикле?

Нужно по клику плавно перемотать страницу на верх. В цикле происходит задержка на 100 мс и текущая позиция position уменьшается на 10 пикселей с каждой итерацией. При попытке запустить страница переходит на верх мгновенно.
var position=window.pageYOffset;
while(position>0)
		{
		setTimeout(function (){window.scrollTo(0,position)}, 100);
		position=position-10;
		}

Однако, если добавить, например, alert(position); в тело цикла, то видно, что с каждой итерацией страница действительно сдвигается и значение position действительно уменьшается на 10 пикселей. В чем может быть проблема?

UPD: Если поставить большое время задержки (без alert) страница прокручивается не мгновенно, а через секунду-две.
  • Вопрос задан
  • 484 просмотра
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev
Седой и строгий
А вы alert вставьте в анонимную функцию, которую передаёте в вызов setTimeout. Сразу станет всё понятно. Лучше сделать так:

function smoothScroll() {
    if(window.pageYOffset > 0) {
        window.scrollTo(0, window.pageYOffset - 10);
        setTimeout(smoothScroll, 100);
    }
}

setTimeout(smoothScroll, 100);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы