Obtener la posición de una etiqueta div / span


103

¿Alguien puede mostrarme cómo obtener la posición top& leftde un elemento divo spancuando uno no está especificado?

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

Se 55pxdevuelve el valor de . Sin embargo, si intento eso para span'12a', no se devuelve nada.

Tengo un montón de div/ spans en una página para las que no puedo especificar top/ leftproperties, pero necesito mostrar un divdirectamente debajo de ese elemento.

Respuestas:


100

Esta función le dirá la posición x, y del elemento en relación con la página. Básicamente, debe recorrer todos los padres del elemento y sumar sus compensaciones.

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 solo desea la posición x, y del elemento en relación con su contenedor, entonces todo lo que necesita es:

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

Para colocar un elemento directamente debajo de éste, también necesitará conocer su altura. Esto se almacena en la propiedad offsetHeight / offsetWidth.

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

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

1
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.
Isaac Bolinger

gracias @IsaacBolinger lo acabo de notar. ¿Alguien puede decirme cómo puedo cambiar los valores cuando se cambia el tamaño de la ventana o el usuario se desplaza?
David Fariña

@ DavidFariña Usé el módulo de geometría "dom-geometry" de dojo para eso. No sé cómo hacerlo de forma nativa.
Isaac Bolinger

Downvoted: puede resultar obvio para los usuarios más experimentados, pero no ha especificado qué se debe pasar exactamente para el (es decir, proporcione un uso de muestra).
Matt

183

Puede llamar al método getBoundingClientRect()en una referencia al elemento. A continuación, puede examinar las top, left, righty / o bottompropiedades ...

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

Si usa jQuery, puede usar el código más sucinto ...

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

11
+1 para esta respuesta, getBoundingClientRect()debe usarse, ¡y esta debe ser la respuesta aceptada! Pero no necesita un "navegador moderno" para que esto funcione, consulte la lista de compatibilidad que mostré aquí: stackoverflow.com/questions/1480133/… . Funciona bien en IE 4.0+ (!), Chrome 1.0+, FF 3.0+, Safari 4.0+ y Opera.
Sk8erPeter

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

1
También tenga en cuenta que getBoundingClientRecttiene transformen cuenta.
ExpExc

Esto no es exacto si el primer niño que no está absolutamente posicionado tiene margen superior o margen izquierdo. Actualmente no existe una solución precisa en esta página, por lo que si alguien lo sabe, publique una respuesta.
Curtis

16

Mientras que la respuesta de @ nickf funciona. Si no le interesan los navegadores más antiguos, puede utilizar 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
};

12

Como señaló Alex, puede usar jQuery offset () para obtener la posición relativa al flujo del documento. Utilice position () para sus coordenadas x, y relativas al padre.

EDITAR: Cambiado document.readypor window.loadporque loadespera todos los elementos para que obtenga su tamaño en lugar de simplemente preparar el DOM. En mi experiencia, loadresulta en menos elementos posicionados incorrectamente en Javascript.

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

9

Para cualquiera que necesite solo la posición superior o izquierda, ligeras modificaciones en el código legible de @ Nickf es suficiente.

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;
}

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.