2009-06-16 7 views
50

Je dois obtenir les coordonnées X, Y (par rapport au haut/à gauche du document) pour un élément DOM. Je ne peux pas localiser les plugins ou la propriété ou la méthode jQuery qui peuvent me les donner. Je peux obtenir le haut et le gauche de l'élément DOM, mais cela peut être soit relatif à son conteneur/parent actuel, soit au document.jQuery x y coordonnées de document de l'objet DOM

Répondre

91

vous pouvez utiliser Dimensions plug-in [... Obsolète inclus dans jQuery 1.3.2+]

offset()
Obtenez le décalage actuel du premier élément adapté, en pixels, par rapport au document.

position de ()
obtient la position en haut et à gauche d'un élément par rapport à son parent décalage.

sachant cela, il est facile ... (en utilisant ma petite svg project comme example page)

var x = $("#wrapper2").offset().left; 
var y = $("#wrapper2").offset().top; 

console.log('x: ' + x + ' y: ' + y); 

sortie:

x: 53 y: 177 

espère que cela aide ce que vous cherchez.

est ici une image de décalage() et la position()

utilisant XRay

alt text

en utilisant la barre d'outils Web Developer

alt text

+0

Voir: http://docs.jquery.com/Plugins/dimensions « Obsolète: A partir de jQuery 1.2.6, le plug-in dimensions a été fusionné dans le noyau. Vous pouvez voir la documentation complète dans la catégorie CSS. " plus, ce n'est que des positions relatives – DMCS

+0

si vous exécutez ce code sur cette page du projet, vous pouvez vérifier que ce n'est pas relatif, mais ce sont des valeurs absolues. – balexandre

+0

On dirait qu'ils ont résolu les problèmes dans une version plus récente de jQuery. Utiliser 1.3.2 semble donner les coordonnées x, y du document comme j'espérais. Et j'ai testé cela dans IE7, FF3 et Safari3 et ils semblent tous se comporter correctement – DMCS

4

Le offset la fonction fera cela pour vous.

Voici l'exemple qu'ils donnent:

var p = $("p:last"); 
var offset = p.offset(); 
p.html("left: " + offset.left + ", top: " + offset.top); 
6

Ma solution est un plug-in avec "solutions de contournement": + D. Mais ça marche!

jQuery.fn.getPos = function(){ 
     var o = this[0]; 
     var left = 0, top = 0, parentNode = null, offsetParent = null; 
     offsetParent = o.offsetParent; 
     var original = o; 
     var el = o; 
     while (el.parentNode != null) { 
      el = el.parentNode; 
      if (el.offsetParent != null) { 
       var considerScroll = true; 
       if (window.opera) { 
        if (el == original.parentNode || el.nodeName == "TR") { 
         considerScroll = false; 
        } 
       } 
       if (considerScroll) { 
        if (el.scrollTop && el.scrollTop > 0) { 
         top -= el.scrollTop; 
        } 
        if (el.scrollLeft && el.scrollLeft > 0) { 
         left -= el.scrollLeft; 
        } 
       } 
      }    
      if (el == offsetParent) { 
       left += o.offsetLeft; 
       if (el.clientLeft && el.nodeName != "TABLE") { 
        left += el.clientLeft; 
       } 
       top += o.offsetTop; 
       if (el.clientTop && el.nodeName != "TABLE") { 
        top += el.clientTop; 
       } 
       o = el; 
       if (o.offsetParent == null) { 
        if (o.offsetLeft) { 
         left += o.offsetLeft; 
        } 
        if (o.offsetTop) { 
         top += o.offsetTop; 
        } 
       } 
       offsetParent = o.offsetParent; 
      } 
     } 
     return { 
      left: left, 
      top: top 
     }; 
    }; 

Utilisation:

var p = $("#wrapper2").getPos(); 
alert("top:"+p.top+"; left:"+p.left); 
+8

qu'il y a des frameworks juste pour que nous n'ayons pas besoin de réécrire du code, n'est-ce pas? Les frameworks – balexandre

+10

sont parfaits jusqu'à ce que vous ayez à écrire un script d'utilisateur. Ou lorsque vous voulez écrire un patch sur jQuery; il y a encore des raisons de savoir javascript. –

Questions connexes