2011-04-08 12 views
63

¿Cuál es la forma más fácil de determinar la posición de un elemento en relación con la ventana del documento/cuerpo/navegador? En este momento estoy usando'.offsetLeft/offsetTop ', pero este método solo te da la posición relativa al elemento padre, por lo que debes determinar cuántos padres al elemento del cuerpo, para saber la posición relativa al cuerpo/navegador posición de ventana/documento. Este método también es engorroso.encontrar la posición del elemento relativa al documento

Respuesta

48

Puede atravesar el offsetParent hasta el nivel superior del DOM.

function getOffsetLeft(elem) 
{ 
    var offsetLeft = 0; 
    do { 
     if (!isNaN(elem.offsetLeft)) 
     { 
      offsetLeft += elem.offsetLeft; 
     } 
    } while(elem = elem.offsetParent); 
    return offsetLeft; 
} 
+20

No, no, cuando cualquier elemento primario (especialmente el elemento html !!!) tiene márgenes, rellenos o bordes. –

+0

con respecto a los márgenes ... podría ayudar establecer el tamaño de la caja en el recuadro de la frontera ... o algo similar ... nada que no se pueda arreglar ... –

29

Se puede utilizar para recuperar la posición element.getBoundingClientRect() elemento con respecto al acceso visual.

Utilice scrollY (document.documentElement.scrollTop compatible con varios navegadores) para calcular la compensación de la ventana gráfica.

La suma de los dos dará la posición del elemento con relación al documento:

subjectRect.top + document.documentElement.scrollTop 
+8

En relación con la ventana gráfica no es la lo mismo que en relación con el documento.Si la página se desplaza hacia abajo un poco, la parte superior relativa a la ventana gráfica será un número menor que la parte superior relativa al documento. – MrVimes

+5

comienza en relación con la ventana gráfica y agrega scrollY para obtenerla en relación con el documento. –

1

se sugiere emplear

element.getBoundingClientRect() 

como se propone here en lugar de cálculo de desplazamiento manual de a través de offsetLeft, offsetTop y offsetParent. como se propone here En algunas circunstancias * el recorrido manual produce resultados no válidos. Ver este Plunker: http://plnkr.co/pC8Kgj

* Cuando el elemento está dentro de un elemento primario desplazable con posicionamiento estático (= predeterminado).

+0

Puede hacer que el cálculo de compensación también funcione incorporando scrollLeft y scrollTop en él. –

+0

Pero encontré 'offsetLeft' y' offsetTop' no tienen en cuenta las transformaciones CSS3, que 'getBoundingClientRect()' hace. Entonces ese es un caso, los resultados pueden ser inválidos. Si lo necesita, puede obtener el offset de un elemento relativo a parent (como 'offsetLeft') usando' (element.getBoundingClientRect(). Left - parent.getBoundingClientRect(). Left) '. –

119

Puede obtener parte superior izquierda y sin atravesar DOM como esto:

function getCoords(elem) { // crossbrowser version 
    var box = elem.getBoundingClientRect(); 

    var body = document.body; 
    var docEl = document.documentElement; 

    var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop; 
    var scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft; 

    var clientTop = docEl.clientTop || body.clientTop || 0; 
    var clientLeft = docEl.clientLeft || body.clientLeft || 0; 

    var top = box.top + scrollTop - clientTop; 
    var left = box.left + scrollLeft - clientLeft; 

    return { top: Math.round(top), left: Math.round(left) }; 
} 
+2

Esta respuesta no tiene en cuenta las compensaciones de los padres. Solo es relativo a la ventana gráfica – Nickey

+1

@Nickey que no es verdadero: la posición de la ventana gráfica, más las comprobaciones de desplazamiento de desplazamiento, arrojan las coordenadas relativas a todo el documento. – natchiketa

+1

Puede tener errores en los dispositivos móviles http://stackoverflow.com/a/32623832/962634 Necesita investigación – basil

5

Si está utilizando la NGP, document-offset es interesante y parece aprovechar los enfoques de las otras respuestas aquí. El uso es bastante simple:

var offset = require('document-offset') 
var target = document.getElementById('target') 
console.log(offset(target)) 
// => {top: 69, left: 108} 
0

Si no les importa usar jQuery, a continuación, puede utilizar la función offset(). Consulte documentation si desea obtener más información sobre esta función.

0

Probado en IE 11, Chrome 62, Firefox 56, Edge 38:

var box = domElement.getBoundingClientRect(); 
var offsetTop = Math.floor(box.top && box.top || box.y && box.y || 0); 

Utilice la izquierda/x para offsetLeft.

Cuestiones relacionadas