Comment puis-je obtenir la position absolue d'un objet sur la page en Javascript? [dupliquer]

cette question a déjà une réponse ici:

je veux obtenir la position absolue x,y d'un objet sur la page en Javascript. Comment puis-je faire cela?

j'ai essayé obj.offsetTop et obj.offsetLeft , mais ceux-ci donnent seulement la position relative à l'élément parent. Je suppose que je pourrais boucler et ajouter l'offset du parent, et l'offset de son parent, et ainsi de suite jusqu'à ce que j'arrive à l'objet sans parent, mais il semble qu'il devrait y avoir une meilleure façon. Googling n'a pas trouvé beaucoup, et même si la recherche de site ne trouve rien.

aussi, je ne peux pas utiliser jQuery.

70
demandé sur bfavaretto 2009-09-26 04:59:25

2 réponses

var cumulativeOffset = function(element) {
    var top = 0, left = 0;
    do {
        top += element.offsetTop  || 0;
        left += element.offsetLeft || 0;
        element = element.offsetParent;
    } while(element);

    return {
        top: top,
        left: left
    };
};

(méthode volée sans vergogne à PrototypeJS; le style de code, les noms de variables et la valeur de retour ont été changés pour protéger les innocents)

104
répondu eyelidlessness 2009-09-26 01:02:30

je suggérerais certainement d'utiliser l'élément .getBoundingClientRect () .

https://developer.mozilla.org/en-US/docs/Web/API/element.getBoundingClientRect

résumé

renvoie un objet de rectangle de texte qui contient un groupe de texte rectangle.

syntaxe

var rectObject = object.getBoundingClientRect();

retourne

la valeur retournée est un TextRectangle objet qui est l'union du rectangles retournés par getClientRects () pour l'élément, c.-à-d. le CSS la frontière boîtes associée à l'élément.

la valeur retournée est un objet TextRectangle , qui contient en lecture seule left , top , right et bottom propriétés décrivant la frontière-zone, pixels, avec le haut à gauche par rapport au haut à gauche du viewport.

voici un tableau de compatibilité de navigateur tiré du site MDN lié:

+---------------+--------+-----------------+-------------------+-------+--------+
|    Feature    | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
+---------------+--------+-----------------+-------------------+-------+--------+
| Basic support | 1.0    | 3.0 (1.9)       | 4.0               | (Yes) | 4.0    |
+---------------+--------+-----------------+-------------------+-------+--------+

il est largement soutenu, et est vraiment facile à utiliser, sans mentionner qu'il est vraiment rapide. Voici un article connexe de John Resig: http://ejohn.org/blog/getboundingclientrect-is-awesome /

Vous pouvez l'utiliser comme ceci:

var logo = document.getElementById('hlogo');
var logoTextRectangle = logo.getBoundingClientRect();

console.log("logo's left pos.:", logoTextRectangle.left);
console.log("logo's right pos.:", logoTextRectangle.right);

voici un très simple exemple : http://jsbin.com/awisom/2 (vous pouvez visualiser et éditer le code en cliquant sur " Edit in JS Bin " dans le coin supérieur droit).

ou en voici un autre en utilisant la console de Chrome: Using element.getBoundingClientRect() in Chrome

Note:

je dois mentionner que les attributs width et height de la valeur de retour de la méthode getBoundingClientRect() sont undefined dans Internet Explorer 8. Il fonctionne dans Chrome 26.X, Firefox 20.X et Opera 12.x cependant. Solution de contournement dans IE8: pour width , vous pouvez soustraire les attributs de droite et de gauche de la valeur de retour , et pour height , vous pouvez soustraire les attributs de haut et de bas ( comme ceci ).

120
répondu Sk8erPeter 2013-05-18 17:03:10