2008-10-01 17 views
36

¿Cómo puedo encontrar las coordenadas XY de un elemento HTML (DIV) desde JavaScript si no se establecieron explícitamente?Buscar X/Y de un elemento HTML con JavaScript

+0

cerrado como duplicado según http://meta.stackexchange.com/questions/147643/should-i-vote-to- close-a-duplicate-question-even-though-its-much-newer-and-ha – user123444555621

Respuesta

8

Eso puede ser complicado según el navegador y la versión. Sugiero usar jQuery y el plugin de posiciones.

+9

La mayor parte del plugin de posiciones ahora es parte del núcleo de jQuery. Así que puedes hacer $ (element) .offset ({relativeTo: "body"}) - y te dará la parte superior e izquierda del objeto relativo al cuerpo. – Sugendran

+0

Excelente, no he descargado jQuery en unos pocos meses, es bueno saber que lo rodaron. – palehorse

+0

+1 para jQuery offset – shan

-1

No estoy seguro para qué lo necesita, y tales cosas son siempre relativas (pantalla, ventana, documento). Pero cuando tenía que darse cuenta de eso, me encontré con este sitio útil: http://www.mattkruse.com/javascript/anchorposition/source.html

Y también me encontré con que la persona plugin de información de herramienta hecha para jQuery tenía todo tipo de visión interesante ax, trucos y posicionamiento (se ven en su ventana clase y el soporte subyacente jQuery lo proporciona). http://bassistance.de/jquery-plugins/jquery-plugin-tooltip/

5

Se puede utilizar una biblioteca como prototipo o jQuery, o puede utilizar this handy function:

Devuelve una matriz.

myPos = findPos(document.getElementById('something')) 
x = myPos[0] 
y = myPos[1] 

function findPos(obj) { 
    var curleft = curtop = 0; 
    if (obj.offsetParent) { 
    curleft = obj.offsetLeft 
    curtop = obj.offsetTop 
    while (obj = obj.offsetParent) { 
     curleft += obj.offsetLeft 
     curtop += obj.offsetTop 
    } 
    } 
    return [curleft,curtop]; 
} 
+0

Deberías atribuirle atribución a quirksmode.org, esa función es muy familiar. – pilsetnieks

31

Así es como lo hago:

// Based on: http://www.quirksmode.org/js/findpos.html 
var getCumulativeOffset = function (obj) { 
    var left, top; 
    left = top = 0; 
    if (obj.offsetParent) { 
     do { 
      left += obj.offsetLeft; 
      top += obj.offsetTop; 
     } while (obj = obj.offsetParent); 
    } 
    return { 
     x : left, 
     y : top 
    }; 
}; 
+0

Creo que prefiero tu idea de devolver un objeto por sobre la opción de Peter-Paul Koch de devolver una matriz en su solución original. – cssimsek

3

Por lo que vale la pena, he aquí una versión recursiva:

function findPos(element) { 
    if (element) { 
    var parentPos = findPos(element.offsetParent); 
    return [ 
     parentPos.X + element.offsetLeft, 
     parentPos.Y + element.offsetTop 
    ]; 
    } else { 
    return [0,0]; 
    } 
} 
+0

parentPos.X debe ser parentPos [0], parentPos.Y debe ser parentPos [1] – Noah

2

Se pueden añadir dos propiedades a la Element.prototype para obtener la parte superior/izquierda de cualquier elemento.

window.Object.defineProperty(Element.prototype, 'documentOffsetTop', { 
    get: function() { return this.offsetTop + (this.offsetParent ? this.offsetParent.documentOffsetTop : 0); } 
}); 

window.Object.defineProperty(Element.prototype, 'documentOffsetLeft', { 
    get: function() { return this.offsetLeft + (this.offsetParent ? this.offsetParent.documentOffsetLeft : 0); } 
}); 

He aquí una demostración comparando los resultados con jQuery de offset().top y .left: http://jsfiddle.net/ThinkingStiff/3G7EZ/

Cuestiones relacionadas