Я пытаюсь определить положение полосы прокрутки браузера с помощью JavaScript, чтобы решить, где на странице находится текущее представление. Я предполагаю, что мне нужно определить, где находится большой палец на дорожке, а затем высоту большого пальца в процентах от общей высоты дорожки. Я слишком усложняю это, или JavaScript предлагает более простое решение, чем это? Любые идеи по коду?
Как получить позицию полосы прокрутки с помощью Javascript?
Ответы (9)
Вы можете использовать element.scrollTop
и _ 2_, чтобы получить прокрученное вертикальное и горизонтальное смещение соответственно. element
может быть document.body
, если вам важна вся страница. Вы можете сравнить его с element.offsetHeight
и _ 6_ (опять же, element
может быть телом), если вам нужны проценты.
element
и document.body
были лишь примерами). Подробнее см. howtocreate.co.uk/tutorials/javascript/browserwindow.
- person Max Shawabkeh; 20.03.2010
window.pageYOffset
, но ничего не могу заставить работать в IE7. Пробовал window.pageYOffset
, document.body.scrollTop
, document.documentElement.scrollTop
, element.scrollTop
- person Paul; 20.03.2010
document.body
- сейчас оно обычно устанавливается на document.documentElement
. См. bugs.chromium.org/p/chromium/issues/detail?id = 157855 для перехода Chrome.
- person fzzfzzfzz; 03.05.2018
Я сделал это для <div>
в Chrome.
element .scrollTop - пиксели, скрытые вверху из-за прокрутки. Без прокрутки его значение равно 0.
element .scrollHeight - это пиксели всего div.
element .clientHeight - это пиксели, которые вы видите в своем браузере.
var a = element.scrollTop;
будет позиция.
var b = element.scrollHeight - element.clientHeight;
будет максимальным значением для scrollTop.
var c = a / b;
будет процент прокрутки [от 0 до 1].
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]
это вот так :)
window.addEventListener("scroll", (event) => {
let scroll = this.scrollY;
console.log(scroll)
});
this
в этом контексте упоминается window
. scrollY
является собственностью window
- person Stefan; 08.02.2021
Ответ за 2018 год:
Лучший способ сделать это - использовать Intersection Observer API а>.
API-интерфейс Intersection Observer обеспечивает способ асинхронного наблюдения за изменениями пересечения целевого элемента с элементом-предком или с окном просмотра документа верхнего уровня.
Исторически сложилось так, что обнаружение видимости элемента или относительной видимости двух элементов по отношению друг к другу было сложной задачей, решения которой были ненадежными и склонными к замедлению работы браузера и сайтов, к которым пользователь обращается. К сожалению, по мере развития сети потребность в такой информации возросла. Информация о перекрестках необходима по многим причинам, например:
- Ленивая загрузка изображений или другого контента при прокрутке страницы.
- Реализация веб-сайтов с «бесконечной прокруткой», где все больше и больше контента загружается и отображается по мере прокрутки, чтобы пользователю не приходилось перелистывать страницы.
- Отчетность о видимости рекламы для расчета доходов от рекламы.
- Решение, выполнять ли задачи или процессы анимации, в зависимости от того, увидит ли пользователь результат.
Реализация обнаружения пересечений в прошлом включала в себя обработчики событий и циклы, вызывающие такие методы, как 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, но вам следует использовать polyfill для обратной совместимости.
если вы заботитесь обо всей странице. вы можете использовать это:
document.body.getBoundingClientRect().top
Если вы используете jQuery, для вас есть идеальная функция: .scrollTop ()
документ здесь -> http://api.jquery.com/scrollTop/
Примечание: вы можете использовать эту функцию для получения ИЛИ установки позиции.
см. также: http://api.jquery.com/?s=scroll
Вот другой способ получить позицию прокрутки
const getScrollPosition = (el = window) => ({
x: el.pageXOffset !== undefined ? el.pageXOffset : el.scrollLeft,
y: el.pageYOffset !== undefined ? el.pageYOffset : el.scrollTop
});
Я думаю, что следующая функция может помочь получить значения координат прокрутки:
const getScrollCoordinate = (el = window) => ({
x: el.pageXOffset || el.scrollLeft,
y: el.pageYOffset || el.scrollTop,
});
Я получил эту идею из этого ответа с небольшим изменением.