Member 13525602 Ответов: 1

Для цикла в javascript, не выполняющего каждую команду по отдельности ( как его остановить? )


В моем html у меня есть Якорная ссылка в виде кнопки:
<button><a href="#content">Go To Content</a></button>

который ссылается на мой #content div. К сожалению, переход к #content div очень внезапен и резок. Поэтому я попытался анимировать его с помощью Java Script с помощью метода window.scrollTo () (и да, я хочу сделать это только с чистым java script, даже не JQuery).

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

Пока что вы найдете мой JS в коде. Код запускается по щелчку мыши в целях тестирования.

Проблема с этим заключается в цикле for в функции smoothScroll. Похоже, что цикл for выполняет команду прокрутки только один раз, а затем игнорирует ее.

Если вам нужен конкретный вопрос: работает ли функция window.scroll только один раз? Ограничена ли его скорость каким-то образом по сравнению со скоростью браузера? Должен ли быть лучший способ сделать то, что я описал выше?

Я разрабатываю этот сайт с помощью google chrome и только чистого Java-скрипта, windows 10.

Я не буду публиковать свой html-код, чтобы вопрос не стал слишком длинным. Если вы хотите, чтобы я это сделал, пожалуйста, прокомментируйте так.

РЕДАКТИРОВАТЬ:
@
Sinisa Hajnal 
в этом есть смысл. Цикл просто складывает прокрутку и выполняет ее в конце. Поэтому, если бы я запустил цикл 8 раз и прокручивал 10 пикселей каждый раз, он не делал бы этого по отдельности, а просто прокручивал бы один раз.

Кто-нибудь знает, как это остановить?

Что я уже пробовал:

function smoothScroll(){
  for (i = 0; i < 80; i+=10 ){
        sleep(10)
        window.scrollTo(0, i)
    }
 }
// here we run our function when the user clicks on the webpage
window.onclick = function(){
    smoothScroll()
}

Sinisa Hajnal

Похоже, что он выполняет его один раз, но на самом деле он работает 8 раз. Просто он делает то же самое (scrollTo (0, 1); scrollTo(0,2) и т. д.). может быть, это слишком быстро или шаг слишком мал. Попробуйте использовать переменную scrollamount в цикле вместо 8

Добавьте console.log ("loop:" +i); после сна просто чтобы увидеть, что он работает правильно.

Member 13525602

похоже, ты прав. когда я добавил console.log, предупреждение появилось 8 раз. Это просто сложение всех свитков и выполнение одного большого свитка в конце. Поэтому, если бы я прокручивал по 10 пикселей в каждом цикле, а цикл прокручивался 8 раз, он просто прокручивался бы 80 в конце.

1 Ответов

Рейтинг:
11

Kornfeld Eliyahu Peter

Это немного сложнее, чем простой цикл (помните, что JS однопоточен по своей природе)...
Как реализовать плавную прокрутку в Vanilla JavaScript — SitePoint[^]


Member 13525602

Это действительно отличное решение. Я не упомянул, что тоже не хочу пользоваться библиотеками, но это дало мне хорошую отправную точку. Спасибо!