2008-11-13 19 views
83

Puede alguien mostrará cómo obtener la posición top & left de un elemento de spandiv o cuando no se especifica?Obtener la posición de una etiqueta div/span

es decir:

<span id='11a' style='top:55px;' onmouseover="GetPos(this);">stuff</span> 
<span id='12a' onmouseover="GetPos(this);">stuff</span> 

En lo anterior, si lo hago:

document.getElementById('11a').style.top 

El valor de 55px se devuelve. Sin embargo, si intento eso para span '12a', no se devuelve nada.

que tienen un montón de div/s span en una página que no puedo especificar las propiedades top/left para, pero tengo que mostrar una div directamente debajo de ese elemento.

Respuesta

83

Esta función le dirá la posición x, y del elemento relativo a la página. Básicamente, debes recorrer todos los elementos del elemento y agregar sus desplazamientos.

function getPos(el) { 
    // yay readability 
    for (var lx=0, ly=0; 
     el != null; 
     lx += el.offsetLeft, ly += el.offsetTop, el = el.offsetParent); 
    return {x: lx,y: ly}; 
} 

Sin embargo, si sólo quería la posición x, y del elemento respecto a su contenedor, entonces todo lo que necesita es:

var x = el.offsetLeft, y = el.offsetTop; 

para poner un elemento directamente debajo de éste, usted' También necesito saber su altura. Esto se almacena en la propiedad offsetHeight/offsetWidth.

var yPositionOfNewElement = el.offsetTop + el.offsetHeight + someMargin; 
+4

Lamentablemente, este método falla en Chrome cuando el elemento está dentro de una tabla con borde. También fallará en el modo de estándares IE6 debido a los márgenes de BODY. – GetFree

+0

Solo una advertencia para los usuarios de este código. Esto es relativo a la página y no a la ventana. Devuelve el mismo valor si el usuario se desplaza usando las barras de desplazamiento. Ten cuidado. –

+0

gracias @IsaacBolinger acaba de notarlo. ¿Puede alguien decirme cómo lo hago para cambiar los valores cuando la ventana cambia de tamaño o el usuario se desplaza? –

153

Usted puede llamar al método getBoundingClientRect() en una referencia al elemento. A continuación, se puede examinar el top, left, right y/o propiedades bottom ...

var offsets = document.getElementById('11a').getBoundingClientRect(); 
var top = offsets.top; 
var left = offsets.left; 

Si se utiliza jQuery, puede utilizar el código más breve ...

var offsets = $('#11a').offset(); 
var top = offsets.top; 
var left = offsets.left; 
+11

+1 para esta respuesta, 'getBoundingClientRect()' debe usarse, ¡y esta debería ser la respuesta aceptada! Pero no necesita un _ "navegador moderno" _ para que esto funcione, consulte la lista de compatibilidad que mostré aquí: http://stackoverflow.com/questions/1480133/how-can-i-get-an-objects- absolute-position-on-the-page-in-javascript/16626843 # 16626843. Funciona bien en IE 4.0+ (!), Chrome 1.0+, FF 3.0+, Safari 4.0+ y Opera. – Sk8erPeter

+0

@ Sk8erPeter Gracias, editaré. – alex

+22

Tenga en cuenta que 'getBoundingClientRect()' devuelve valores relativos a la ventana gráfica, no al documento. Para eso, querría algo como 'top = el.getBoundingClientRect(). Top + window.pageYOffset - el.ownerDocument.documentElement.clientTop'. –

10

Como Alex se observó puede usar jQuery offset() para obtener la posición relativa al flujo de documentos. Use position() para sus coordenadas x, y en relación con el padre.

EDIT: Conmutado document.ready por window.load porque load espera por todos los elementos para que pueda obtener su tamaño en lugar de simplemente preparar el DOM. En mi experiencia, load resulta en un menor número de elementos incorrectamente posicionados con Javascript.

$(window).load(function(){ 
    // Log the position with jQuery 
    var position = $('#myDivInQuestion').position(); 
    console.log('X: ' + position.left + ", Y: " + position.top); 
}); 
7

Para quien necesita solo la posición superior o izquierda, pequeñas modificaciones al código legible de @ Nickf hacen el truco.

function getTopPos(el) { 
    for (var topPos = 0; 
     el != null; 
     topPos += el.offsetTop, el = el.offsetParent); 
    return topPos; 
} 

y

function getLeftPos(el) { 
    for (var leftPos = 0; 
     el != null; 
     leftPos += el.offsetLeft, el = el.offsetParent); 
    return leftPos; 
} 
7

Mientras que la respuesta de @nickf funciona. Si no le interesan los navegadores más antiguos, puede usar esta versión pura de Javascript. Funciona en IE9 + y otros

var rect = el.getBoundingClientRect(); 

var position = { 
    top: rect.top + window.pageYOffset, 
    left: rect.left + window.pageXOffset 
}; 
Cuestiones relacionadas