Як отримати позицію прокрутки за допомогою Javascript?


190

Я намагаюся визначити положення панелі прокрутки браузера за допомогою JavaScript, щоб визначити, де на сторінці поточний вигляд. Я здогадуюсь, що я повинен виявити, де знаходиться великий палець на доріжці, а потім висота великого пальця у відсотках від загальної висоти доріжки. Я занадто ускладнюю це, чи JavaScript пропонує більш просте рішення, ніж це? Будь-які ідеї кодові?

Відповіді:


209

Ви можете використовувати element.scrollTopі element.scrollLeftдля отримання вертикального та горизонтального зміщення відповідно прокрученого. elementможе бути, document.bodyякщо ви дбаєте про всю сторінку. Ви можете порівняти його з ( element.offsetHeightі element.offsetWidthзнову elementможе бути тілом), якщо вам потрібні відсотки.


2
Який браузер ви використовуєте? Отримання тіла робиться по-різному в різних браузерах ( elementі це document.bodyбули лише приклади). Докладніше див. У howtocreate.co.uk/tutorials/javascript/browserwindow .
Макс Шавабке

8
Я отримав це, щоб дати мені правильне значення для Firefox 3.6 window.pageYOffset, але я не можу нічого працювати над IE7. Пробував window.pageYOffset, document.body.scrollTop, document.documentElement.scrollTop,element.scrollTop
Paul

1
scrollTop працював для мене лише тоді, коли я додав дужки ... $ (". scrollBody"). scrollTop ()
maia

9
Якщо ви маєте справу з Елементом "вікно", ви можете використовувати window.scrollY замість window.scrollTop
Janis Jansen

6
Я думаю, що позиція прокрутки не встановлена document.bodyв більшості сучасних браузерів - зазвичай вона встановлена document.documentElementзараз. Див. Bugs.chromium.org/p/chromium/isissue/detail?id=157855 щодо переходу Chrome.
fzzfzzfzz

134

Я зробив це для <div>Chrome.

елемент .scrollTop - це пікселі, приховані вгорі завдяки прокрутці. Без прокрутки його значення дорівнює 0.

елемент .scrollHeight - це пікселі всього діла .

елемент .clientHeight - це пікселі, які ви бачите у своєму браузері.

var a = element.scrollTop;

буде позиція.

var b = element.scrollHeight - element.clientHeight;

буде максимальним значенням для scrollTop .

var c = a / b;

становитиме відсоток прокрутки [від 0 до 1] .


3
Це майже правильно. для var b вам слід відняти window.innerHeight not element.clientHeight.
Kahless

51
document.getScroll = function() {
    if (window.pageYOffset != undefined) {
        return [pageXOffset, pageYOffset];
    } else {
        var sx, sy, d = document,
            r = d.documentElement,
            b = d.body;
        sx = r.scrollLeft || b.scrollLeft || 0;
        sy = r.scrollTop || b.scrollTop || 0;
        return [sx, sy];
    }
}

повертає масив з двома цілими числами [[scrollLeft, scrollTop]


4
Показати, як використовувати цю функцію на прикладі, було б чудово.
користувач18490

1
Я думаю, ви можете використовувати цей lastcroll = getScroll (); window.scrollTo (lastcroll [0], lastcroll [1]);
Дінеш Раджан

Чудово працює, але я змінив повернення до об'єкта клавішами x і y, оскільки це має для мене трохи більше сенсу.
xd6_

Відредаговано після коментаря @ user18490
Давіде Канніцо

ReferenceError: Не вдається знайти змінну: element
Jonny


11

Відповідь на 2018 рік :

Найкращий спосіб зробити подібні дії - це використовувати API Intersection Observer .

API спостереження перехрестя забезпечує спосіб асинхронного спостереження за змінами перетину цільового елемента з елементом предка або з вікном перегляду документа верхнього рівня.

Історично виявляти видимість елемента або відносну видимість двох елементів по відношенню один до одного було складним завданням, рішення якого було ненадійним і схильним до того, щоб браузер і веб-сайти, до яких користувач отримує доступ, стали млявими. На жаль, у міру дозрівання мережі Інтернет потреба в такому вигляді інформації зросла. Інформація про перетин потрібна з багатьох причин, наприклад:

  • Ліниво завантажується зображення або інший вміст на сторінці, прокручується.
  • Впровадження веб-сайтів "нескінченної прокрутки", де все більше вмісту завантажується та надається під час прокрутки, щоб користувачеві не довелося гортати сторінки.
  • Звітність про видимість реклами з метою підрахунку доходів від реклами.
  • Вирішення, виконувати завдання чи анімаційні процеси, залежно від того, побачить результат чи ні користувач.

Реалізація виявлення перетину в минулому включала оброблювачів подій та циклів виклику циклів, таких як Element.getBoundingClientRect () для створення необхідної інформації для кожного зачепленого елемента. Оскільки весь цей код працює на головному потоці, навіть один з них може спричинити проблеми з продуктивністю. Коли сайт завантажується цими тестами, все може стати некрасивим.

Дивіться наступний приклад коду:

var options = {
  root: document.querySelector('#scrollArea'),
  rootMargin: '0px',
  threshold: 1.0
}

var observer = new IntersectionObserver(callback, options);

var target = document.querySelector('#listItem');
observer.observe(target);

Більшість сучасних веб-переглядачів підтримують IntersectionObserver , однак для зворотної сумісності слід використовувати полі- заливку .



3

Якщо ви використовуєте jQuery, для вас є ідеальна функція: .scrollTop ()

doc тут -> http://api.jquery.com/scrollTop/

Примітка: Ви можете використовувати цю функцію для отримання АБО, щоб встановити позицію.

див. також: http://api.jquery.com/?s=scroll


25
Навіщо відповідати на питання про JS з бібліотекою для JS, коли це цілком можливо і навіть зручно робити в сирому JS? Ви просто просите його додати додатковий час завантаження, а також використовувати деякий обсяг пам’яті для чогось зовсім непотрібного. Крім того, з тих пір, коли javascript почав означати JQuery?
DaemonOfTheWest

4
якщо ви запитаєте індивідуально, мені ніколи не сподобався jQuery, і я не відповів на це запитання, але в Vanilla JS вже є відповіді, які дають інші колеги, то яка проблема, якщо хтось додав смачну спецію в цю нитку. (Він уже згадував, що якщо ви використовуєте jQuery)
Ravinder Payal

@ R01010010 це тому, що зараз дні JQuery марні та контрпродуктивні, усі функції JQuery легко реалізуються з VanilaJS, також ви залежите від того, що всередині JQuery, з новими можливостями, доступними у VanillsaJS, ви як програміст, не оновлюєтесь, як приклад , зараз днями у VanillaJS з'явився новий API під назвою fetch, який замінив старий XHR, якщо ви тільки що були у світі JQuery ніколи не побачите переваг при отриманні і продовжуйте користуватися jQuery.ajax (). Моя особиста думка - це люди, які продовжують використовуючи JQuery, це тому, що вони перестали вчитися. Також VanillaJS швидше vanilla-js.com
Джон Бальвін Аріас

@JohnBalvinArias говорять про підбір, що там на ie11 або навіть Edge?
Бен

Виправте мене, якщо я помиляюся, але виправлення не працює належним чином на "сучасний", тобто, і досі широко використовується. Якби я використовував jquery, я навряд чи закликав би рухатися далі
Бен

3

Ось інший спосіб отримати позицію прокрутки

const getScrollPosition = (el = window) => ({
  x: el.pageXOffset !== undefined ? el.pageXOffset : el.scrollLeft,
  y: el.pageYOffset !== undefined ? el.pageYOffset : el.scrollTop
});

0

Я думаю, що наступна функція може допомогти мати значення координат прокрутки:

const getScrollCoordinate = (el = window) => ({
  x: el.pageXOffset || el.scrollLeft,
  y: el.pageYOffset || el.scrollTop,
});

Я отримав цю ідею з цієї відповіді з невеликою зміною.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.