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.