Position of Div in relation to the Top of the Viewport Position of Div in relation to the Top of the Viewport javascript javascript

Position of Div in relation to the Top of the Viewport


The existing answers are now outdated. The getBoundingClientRect() method has been around for quite a while now, and does exactly what this question asks for. Plus it is supported across all browsers.

From this MDN page:

The returned value is a TextRectangle object, which contains read-only left, top, right and bottom properties describing the border-box, in pixels, with the top-left relative to the top-left of the viewport.

You use it like so:

var viewportOffset = el.getBoundingClientRect();// these are relative to the viewportvar top = viewportOffset.top;var left = viewportOffset.left;


//First get the correct geometry for the browser

(function(){ Run= window.Run || {}; if(window.pageYOffset!= undefined){  Run.topLeftScroll= function(hoo){   var wo= [window.pageXOffset, window.pageYOffset]   if(hoo && hoo.nodeType== 1){    hoo= mr(hoo);    var T= 0, L= 0;    while(hoo){     L+= hoo.offsetLeft;     T+= hoo.offsetTop;     hoo= hoo.offsetParent;    }    wo= [L, T, wo[0], wo[1]];   }   return wo;  } } else if(document.body.scrollTop!== undefined){  Run.topLeftScroll= function(hoo){   var B= document.body;   var D= document.documentElement;   D= (D.clientHeight)? D: B;   wo= [D.scrollLeft, D.scrollTop];   if(hoo && hoo.nodeType== 1){    hoo= mr(hoo);    var T= 0, L= 0;    while(hoo){     L+= hoo.offsetLeft;     T+= hoo.offsetTop;     hoo= hoo.offsetParent;    }    wo= [L, T, wo[0], wo[1]];   }   return wo;  } }})()

// shortcut function

if(window.Run && Run.topLeftScroll){ Run.getPosition= function(who, wch){  var A= Run.topLeftScroll(who);  if(!wch) return A;  switch(wch.toUpperCase()){   case 'X': return A[0];// element Left in document   case 'Y': return A[1];// element Top in document   case 'L': return A[0]-A[2];// Left minus scroll   case 'T': return A[1]-A[3];// Top minus scroll   case 'SL': return A[2];// scroll Left   case 'ST': return A[3];// scroll Top   default: return 0;  }  // all returns are integers (pixels) }}


Check out what the JS Frameworks have to offer. Mostly, they have worked out all - or at least most - of the browser specific problems and specialties.

In Prototype, there are the scrollOffset() functions. I'm not familiar enough with JQuery to point you to the right manual page but here is a question that seems to go towards the right direction.