JavaScript obtient la position X / Y de la fenêtre pour le défilement


214

J'espère trouver un moyen d'obtenir la position actuelle de la fenêtre visible (par rapport à la largeur / hauteur totale de la page) afin de pouvoir l'utiliser pour forcer le défilement d'une section à l'autre. Cependant, il semble y avoir une énorme quantité d'options lorsqu'il s'agit de deviner quel objet contient le vrai X / Y pour votre navigateur.

Lequel de ces éléments ai-je besoin pour m'assurer qu'IE 6+, FF 2+ et Chrome / Safari fonctionnent?

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

Et y en a-t-il d'autres? Une fois que je sais où se trouve la fenêtre, je peux définir une chaîne d'événements qui appellera lentement window.scrollBy(x,y);jusqu'à ce qu'elle atteigne le point souhaité.

Réponses:


282

La méthode utilisée par jQuery (v1.10) pour trouver ceci est:

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

C'est:

  • Il teste d' window.pageXOffsetabord et l'utilise s'il existe.
  • Sinon, il utilise document.documentElement.scrollLeft.
  • Il soustrait ensuite document.documentElement.clientLefts'il existe.

La soustraction de document.documentElement.clientLeft/ Topne semble être nécessaire pour corriger les situations où vous avez appliqué une bordure (pas de remplissage ou de marge, mais une bordure réelle) à l'élément racine, et à cela, éventuellement uniquement dans certains navigateurs.


Thomas - tu as tout à fait raison. Ma faute. Commentaires supprimés. J'ai relu votre commentaire et j'ai réalisé que votre solution n'était pas du tout une solution Jquery. Mes excuses. Modded up.
Bangkokian

Ça fonctionne maintenant. Je pense qu'ils avaient un bug très temporaire dans le webkit et ils l'ont déjà corrigé. J'ai écrit un plugin complètement cassé à cause de ce bug et les utilisateurs m'ont signalé cela. Très effrayant, ces choses de base pourraient casser
vsync

2
Est-ce le code de $ (window) .scrollTop (); ? Il serait probablement utile d'inclure également la méthode jQuery dans cette réponse.
Phil

1
Le code que j'ai affiché est une paraphrase de ce qui est devenu jQuery.fn.offset(). scrollTop()/ scrollLeft()fait essentiellement la même chose, mais ne soustrayez pas clientTop / clientLeft.
thomasrutter

Quelle est la méthode?
Maxrunner

208

Peut-être plus simple;

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

Crédits: so.dom.js # L492


1
Traversez parfaitement le navigateur en toute sécurité! Meilleure solution.
Simon Steinberger

1
Cela a mieux fonctionné que le code de réponse, mais ... le code de réponse n'a pas fonctionné, pas du tout ...
Hydroper

2
Je me demande pourquoi ne pas simplement utiliser document.documentElement.scrollTopce qui fonctionne partout.
vsync

33

En utilisant du javascript pur, vous pouvez utiliser Window.scrollX et Window.scrollY

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

Remarques

La propriété pageXOffset est un alias pour la propriété scrollX et la propriété pageYOffset est un alias pour la propriété scrollY:

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

Voici une démo rapide

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
La page à laquelle vous êtes lié indique "Pour la compatibilité entre les navigateurs, utilisez window.pageYOffset au lieu de window.scrollY".
JeremyWeir

Cela ne fonctionne pas pour IE. IE nécessite quelque chose commewindow.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);

}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.