JavaScript pobiera pozycję X / Y okna do przewijania

214

Mam nadzieję, że znajdę sposób na uzyskanie aktualnej pozycji widocznego okna (w stosunku do całkowitej szerokości / wysokości strony), dzięki czemu będę mógł użyć go do wymuszenia przewijania z jednej sekcji do drugiej. Wydaje się jednak, że istnieje ogromna liczba opcji, jeśli chodzi o zgadywanie, który obiekt zawiera prawdziwe X / Y dla przeglądarki.

Które z nich muszę mieć pewność, że IE 6+, FF 2+ i Chrome / Safari działają?

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

Czy są jeszcze jakieś? Kiedy już wiem, gdzie jest okno, mogę ustawić łańcuch zdarzeń, który będzie powoli wywoływał, window.scrollBy(x,y);aż osiągnie pożądany punkt.

Xeoncross
źródło

Odpowiedzi:

282

Metoda znaleziona przez jQuery (v1.10) to:

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

To jest:

  • window.pageXOffsetNajpierw testuje i używa tego, jeśli istnieje.
  • W przeciwnym razie używa document.documentElement.scrollLeft.
  • Następnie odejmuje, document.documentElement.clientLeftjeśli istnieje.

Odejmowanie document.documentElement.clientLeft/ Topwydaje się być konieczne do poprawienia sytuacji, w których zastosowałeś ramkę (nie dopełnienie lub margines, ale rzeczywistą ramkę) do elementu głównego, a przy tym, być może tylko w niektórych przeglądarkach.

thomasrutter
źródło
Thomas - masz całkowitą rację. Mój błąd. Komentarze zostały usunięte. Ponownie przeczytałem twój komentarz i zdałem sobie sprawę, że twoje rozwiązanie wcale nie było rozwiązaniem Jquery. Przeprosiny. Zmodyfikowany.
Bangkokian
To teraz działa. Myślę, że mieli bardzo tymczasowy błąd w zestawie internetowym i już go naprawili. Napisałem wtyczkę całkowicie zepsutą z powodu tego błędu i użytkownicy zgłosili mi to. Bardzo przerażające takie podstawowe rzeczy mogą się zepsuć
vsync
2
Czy to kod $ (okno) .scrollTop (); ? Prawdopodobnie przydałaby się również metoda jQuery w tej odpowiedzi.
Phil
1
Kod, który opublikowałem, jest parafrazą tego, co się stało jQuery.fn.offset(). scrollTop()/ scrollLeft()wykonaj w zasadzie to samo, ale nie odejmuj clientTop / clientLeft.
thomasrutter
Jaka jest metoda
Maxrunner,
208

Może prościej;

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

Kredyty: so.dom.js # L492

K-Gun
źródło
1
Idealnie bezpieczny dla różnych przeglądarek! Najlepsze rozwiązanie
Simon Steinberger,
1
To działało lepiej niż kod odpowiedzi, ale ... kod odpowiedzi nie działa, ani trochę ...
Hydroper
2
Zastanawiam się, dlaczego nie po prostu użyć, document.documentElement.scrollTopktóry działa wszędzie.
vsync
33

Używając czystego javascript, możesz użyć Window.scrollX i Window.scrollY

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

Notatki

Właściwość pageXOffset jest aliasem dla właściwości scrollX, a właściwość pageYOffset jest aliasem dla właściwości scrollY:

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

Oto szybkie demo

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
źródło
6
Strona, do której linkujesz, mówi „Aby zachować zgodność z różnymi przeglądarkami, użyj window.pageYOffset zamiast window.scrollY”.
JeremyWeir,
To nie działa dla IE. IE wymaga czegoś takiegowindow.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
źródło