Як отримати та встановити поточну позицію прокрутки веб-сторінки?


121

Як я можу отримати та встановити поточну позицію прокрутки веб-сторінки?

У мене довга форма, яку потрібно оновити на основі дій / вводу користувача. Коли це трапляється, сторінка скидається до самого верху, що дратує користувачів, оскільки їм доведеться прокручувати назад до тієї точки, в якій вони були.

Якщо я міг би зафіксувати поточну позицію прокрутки (прихованим входом) до того, як сторінка перезавантажиться, я могла б встановити її назад після її завантаження.


Чи не керована AJAX форма не є кращим способом запобігти цим ефектам (і, звичайно, забезпечити резервний випадок, якщо XHR недоступний)? При повторному завантаженні сторінки з’явиться сторінка, щоб перестрибнути на вершину та назад знову, примха, яка може дратувати.
— Марсель Корпель

Відповіді:


118

Ви шукаєте document.documentElement.scrollTopнерухомість.


дякую, я знайшов це: articles.sitepoint.com/article/javascript-from-scratch/6 і змінив значення getScrollingPosition()для зберігання значень у прихованих змінних. Потім у html оновленої сторінки, яку я використовую <body onLoad="window.scrollTo(x,y), де x і y - це значення зі значень прихованих значень!
— xyz

46
Я знаходжу, щонайменше, на Chrome на Ubuntu, який document.documentElement.scrollTopзавжди повертає 0. document.body.scrollTopАле, здається, працює. Один Firefox на Ubuntu, з іншого боку, справжній зворотній бік - ви отримуєте 0 з bodyі правильну суму з documentElement. Будь-яка ідея, що дає?
— tobek

12
Ця відповідь не є точною, оскільки scrollTopвластивість працює не у всіх браузерах. Перевірте window.pageXOffsetі window.pageYOffsetна кращі результати.
— gyo

135

На даний момент прийнята відповідь невірна - document.documentElement.scrollTopзавжди повертає 0 у Chrome. Це тому, що WebKit використовує bodyдля відстеження прокрутки, тоді як Firefox та IE використовують html.

Щоб отримати поточну позицію, потрібно:

document.documentElement.scrollTop || document.body.scrollTop

Ви можете встановити поточну позицію до 1000 пікселів вниз на сторінці так:

document.documentElement.scrollTop = document.body.scrollTop = 1000;

Або, використовуючи jQuery (анімуйте його, поки ви на ньому!):

$("html, body").animate({ scrollTop: "1000px" });

5
відповідь gyo, припускаючи window.pageYOffset, що ви чистіші, якщо ви використовуєте window.scrollBy()або window.scrollTo()методи.
— igorsantos07

32

Існують деякі невідповідності в тому, як браузери виставляють поточні координати прокрутки вікна. Google Chrome на Mac і iOS, здається, завжди повертається 0під час використання document.documentElement.scrollTopабо jQuery $(window).scrollTop().

Однак він працює послідовно з:

// horizontal scrolling amount
window.pageXOffset

// vertical scrolling amount
window.pageYOffset

Я теж це помітив, це помилка на Mac та iOS?
— Олександр Кім

@AlexanderKim Я думаю, що це може бути пов’язано з тим, як інтерпретуються певні правила CSS (наприклад, переповнення), і як повідомлялося, він працює, якщо перевіряє scrollTop як на тілі, так і на html-елементах. Однак, щоб уникнути тестування та налагодження, я завжди покладаюся на безпечну та послідовну сторінкуXOffset / pageYOffset.
— gyo

1
велике спасибі за правильну відповідь
— Michael Paccione

5

Я пішов із рішенням локального сховища HTML5 ... Усі мої посилання називають функцію, яка встановлює це перед зміною window.location:

localStorage.topper = document.body.scrollTop;

і кожна сторінка має це в onLoad тіла:

  if(localStorage.topper > 0){ 
    window.scrollTo(0,localStorage.topper);
  }

3
Було б більш елегантно використовувати setItem () та getItem () localStorage, а замість цього резервне копіювання позиції прокрутки при кожному натисканні посилання зберігати її один раз, залишаючи сторінку: window.addEventListener ("перед завантаженням", функцією () {localStorage. setItem ("scrolly", document.documentElement.scrollTop || document.body.scrollTop);});
— StanE
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.