2008-10-17 17 views

Respuesta

32

Puede hacerlo en ambos: obtenga la posición relativa al documento, luego reste la posición de desplazamiento.

var e = document.getElementById('xxx'); 
var offset = {x:0,y:0}; 
while (e) 
{ 
    offset.x += e.offsetLeft; 
    offset.y += e.offsetTop; 
    e = e.offsetParent; 
} 

if (document.documentElement && (document.documentElement.scrollTop || document.documentElement.scrollLeft)) 
{ 
    offset.x -= document.documentElement.scrollLeft; 
    offset.y -= document.documentElement.scrollTop; 
} 
else if (document.body && (document.body.scrollTop || document.body.scrollLeft)) 
{ 
    offset.x -= document.body.scrollLeft; 
    offset.y -= document.body.scrollTop; 
} 
else if (window.pageXOffset || window.pageYOffset) 
{ 
    offset.x -= window.pageXOffset; 
    offset.y -= window.pageYOffset; 
} 

alert(offset.x + '\n' + offset.y); 
+1

Por favor reemplace 'position' con' offset' y 'bodt' con' body'. – suzanshakya

+3

hats-off ... quien sea que haya escrito esto. – Varun

+0

perfecto - ¡gracias! – Iamsamstimpson

0

Usted podría restar offsetTop del div de la document.body.scrollTop

Esto parece funcionar en IE7 y FF3, pero en una página muy simple. No he verificado con DIV anidados.

+0

No, la única offsetTop muestra la posición dentro de la div padre. Esto funciona para el div de nivel superior y falla con otros. Observe cómo la primera respuesta se acerca a través de los padres acumulando compensaciones. – mmaclaurin

0

Usando Prototipo sería:

$('divname').viewportOffset.top 
$('divname').viewportOffset.left 
3

En IE y Firefox 3, se puede utilizar para este getBoundingClientRect; sin marco necesario.

Pero, sí, debería usar un marco si necesita admitir otros navegadores también.

6

[Pegar de la respuesta que dio here]

El getBoundingClientRect() método nativo ha sido de alrededor durante bastante tiempo, y hace exactamente lo que la pregunta se refiere. Además de que es compatible con todos los navegadores (como Internet Explorer 5, que parece!)

De this página MDN:

El valor devuelto es un objeto TextRectangle, que contiene sólo lectura a la izquierda, arriba, derecha e inferior propiedades que describen el cuadro de borde, en píxeles, con la esquina superior izquierda relativa a la esquina superior izquierda de la ventana gráfica.

que lo utilice de esta manera:

var viewportOffset = el.getBoundingClientRect(); 
// these are relative to the viewport, i.e. the window 
var top = viewportOffset.top; 
var left = viewportOffset.left; 
Cuestiones relacionadas