JavaScript получить окно X / Y позиции для прокрутки

214

Я надеюсь найти способ получить текущее положение видимого окна (относительно общей ширины / высоты страницы), чтобы использовать его для принудительной прокрутки из одного раздела в другой. Тем не менее, кажется, что есть огромное количество вариантов, когда нужно угадать, какой объект соответствует истинному X / Y для вашего браузера.

Что из этого мне нужно, чтобы убедиться, что IE 6+, FF 2+ и Chrome / Safari работают?

window.innerWidth
window.innerHeight
window.pageXOffset
window.pageYOffset
document.documentElement.clientWidth
document.documentElement.clientHeight
document.documentElement.scrollLeft
document.documentElement.scrollTop
document.body.clientWidth
document.body.clientHeight
document.body.scrollLeft
document.body.scrollTop

И есть ли другие? Как только я узнаю, где находится окно, я могу установить цепочку событий, которая будет медленно вызываться, window.scrollBy(x,y);пока не достигнет желаемой точки.

Xeoncross
источник

Ответы:

282

Метод, который jQuery (v1.10) использует, чтобы найти это:

var doc = document.documentElement;
var left = (window.pageXOffset || doc.scrollLeft) - (doc.clientLeft || 0);
var top = (window.pageYOffset || doc.scrollTop)  - (doc.clientTop || 0);

То есть:

  • Он window.pageXOffsetсначала проверяет и использует его, если он существует.
  • В противном случае он использует document.documentElement.scrollLeft.
  • Затем он вычитает, document.documentElement.clientLeftесли он существует.

Вычитание document.documentElement.clientLeft/ Topтребуется, по-видимому, только для исправления в ситуациях, когда вы применили границу (не заполнение или поле, а фактическую границу) к корневому элементу, и при этом, возможно, только в определенных браузерах.

thomasrutter
источник
Томас - ты совершенно прав. Виноват. Комментарии удалены. Я перечитал ваш комментарий и понял, что ваше решение вовсе не было решением Jquery. Извиняюсь. Модифицированный
Бангкок
Это работает сейчас. Я думаю, что у них была очень временная ошибка в webkit, и они уже исправили это. Я написал плагин, полностью сломанный из-за этой ошибки, и пользователи сообщили мне об этом. Очень страшно, что такие основные вещи могут сломаться
vsync
2
Это код для $ (window) .scrollTop (); ? Вероятно, было бы полезно включить в этот ответ также метод jQuery.
Фил
1
Код, который я разместил, является перефразированием того, что стало jQuery.fn.offset(). scrollTop()/ scrollLeft()делать в основном то же самое, но не вычитать clientTop / clientLeft.
Томасруттер
Какой метод?
Maxrunner
208

Может быть, проще;

var top  = window.pageYOffset || document.documentElement.scrollTop,
    left = window.pageXOffset || document.documentElement.scrollLeft;

Кредиты: so.dom.js # L492

K-Gun
источник
1
Идеально подходит для кросс-браузерной безопасности Лучшее решение.
Саймон Стейнбергер
1
Это сработало лучше, чем код ответа, но ... код ответа не сработал, не чуть-чуть ...
Hydroper
2
Интересно, почему бы просто не использовать, document.documentElement.scrollTopкоторый работает везде.
vsync
33

Используя чистый JavaScript, вы можете использовать Window.scrollX и Window.scrollY

window.addEventListener("scroll", function(event) {
    var top = this.scrollY,
        left =this.scrollX;
}, false);

Ноты

Свойство pageXOffset является псевдонимом для свойства scrollX, а свойство pageYOffset является псевдонимом для свойства scrollY:

window.pageXOffset == window.scrollX; // always true
window.pageYOffset == window.scrollY; // always true

Вот быстрое демо

window.addEventListener("scroll", function(event) {
  
    var top = this.scrollY,
        left = this.scrollX;
  
    var horizontalScroll = document.querySelector(".horizontalScroll"),
        verticalScroll = document.querySelector(".verticalScroll");
    
    horizontalScroll.innerHTML = "Scroll X: " + left + "px";
      verticalScroll.innerHTML = "Scroll Y: " + top + "px";
  
}, false);
*{box-sizing: border-box}
:root{height: 200vh;width: 200vw}
.wrapper{
    position: fixed;
    top:20px;
    left:0px;
    width:320px;
    background: black;
    color: green;
    height: 64px;
}
.wrapper div{
    display: inline;
    width: 50%;
    float: left;
    text-align: center;
    line-height: 64px
}
.horizontalScroll{color: orange}
<div class=wrapper>
    <div class=horizontalScroll>Scroll (x,y) to </div>
    <div class=verticalScroll>see me in action</div>
</div>

Gildas.Tambo
источник
6
На странице, на которую вы ссылаетесь, написано «Для кросс-браузерной совместимости используйте window.pageYOffset вместо window.scrollY».
JeremyWeir
Это не работает для IE. IE требует что-то вродеwindow.pageYOffset
hipkiss
-1
function FastScrollUp()
{
     window.scroll(0,0)
};

function FastScrollDown()
{
     $i = document.documentElement.scrollHeight ; 
     window.scroll(0,$i)
};
 var step = 20;
 var h,t;
 var y = 0;
function SmoothScrollUp()
{
     h = document.documentElement.scrollHeight;
     y += step;
     window.scrollBy(0, -step)
     if(y >= h )
       {clearTimeout(t); y = 0; return;}
     t = setTimeout(function(){SmoothScrollUp()},20);

};


function SmoothScrollDown()
{
     h = document.documentElement.scrollHeight;
     y += step;
     window.scrollBy(0, step)
     if(y >= h )
       {clearTimeout(t); y = 0; return;}
     t = setTimeout(function(){SmoothScrollDown()},20);

}
ali.by
источник