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);поки не досяг бажаного моменту.

Відповіді:


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видається потрібним лише для виправлення ситуацій, коли ви застосували кордон (не прокладки або поля, а фактична межа) до кореневого елемента, а при цьому, можливо, лише в певних браузерах.


Томас - ти абсолютно правий. Моє ліжко. Коментарі видалено Я перечитав ваш коментар і зрозумів, що ваше рішення зовсім не є рішенням Jquery. Вибачення. Модифікований.
Бангкокіян

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

2
Це код для $ (window) .scrollTop (); ? Можливо, було б корисно включити в цю відповідь і метод jQuery.
Філ

1
Код, який я розмістив, - це перефразовування того, що стало jQuery.fn.offset(). scrollTop()/ в scrollLeft()основному те саме, але не віднімайте clientTop / clientLeft.
thomasrutter

Що таке метод?
Maxrunner

208

Можливо, простіше;

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

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


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>


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);

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