Commit c77938ef authored by Solly Ross's avatar Solly Ross

Fix for scroll offset in Util.getPosition()

Previously, Util.getPosition didn't deal with scrolling
particularly well.  This fixes that by calculating the
scroll offset when dealing with getting mouse positions.

Credit to @erikgull and @emmar for the initial version of
the fix.  Credit to Brian Huismanfor the initial code.

Closes #295
Relevant to #258
parent 082027dc
...@@ -302,18 +302,72 @@ Util.load_scripts = function(files) { ...@@ -302,18 +302,72 @@ Util.load_scripts = function(files) {
} }
} }
// Get DOM element position on page // Get DOM element position on page
Util.getPosition = function (obj) { // This solution is based based on http://www.greywyvern.com/?post=331
var x = 0, y = 0; // Thanks to Brian Huisman AKA GreyWyvern!
if (obj.offsetParent) { Util.getPosition = (function() {
do { function getStyle(obj, styleProp) {
x += obj.offsetLeft; if (obj.currentStyle) {
y += obj.offsetTop; var y = obj.currentStyle[styleProp];
obj = obj.offsetParent; } else if (window.getComputedStyle)
} while (obj); var y = window.getComputedStyle(obj, null)[styleProp];
return y;
};
function scrollDist() {
var myScrollTop = 0, myScrollLeft = 0;
var html = document.getElementsByTagName('html')[0];
// get the scrollTop part
if (html.scrollTop && document.documentElement.scrollTop) {
myScrollTop = html.scrollTop;
} else if (html.scrollTop || document.documentElement.scrollTop) {
myScrollTop = html.scrollTop + document.documentElement.scrollTop;
} else if (document.body.scrollTop) {
myScrollTop = document.body.scrollTop;
} else {
myScrollTop = 0;
} }
return {'x': x, 'y': y};
}; // get the scrollLeft part
if (html.scrollLeft && document.documentElement.scrollLeft) {
myScrollLeft = html.scrollLeft;
} else if (html.scrollLeft || document.documentElement.scrollLeft) {
myScrollLeft = html.scrollLeft + document.documentElement.scrollLeft;
} else if (document.body.scrollLeft) {
myScrollLeft = document.body.scrollLeft;
} else {
myScrollLeft = 0;
}
return [myScrollLeft, myScrollTop];
};
return function (obj) {
var curleft = 0, curtop = 0, scr = obj, fixed = false;
while ((scr = scr.parentNode) && scr != document.body) {
curleft -= scr.scrollLeft || 0;
curtop -= scr.scrollTop || 0;
if (getStyle(scr, "position") == "fixed") {
fixed = true;
}
}
if (fixed && !window.opera) {
var scrDist = scrollDist();
curleft += scrDist[0];
curtop += scrDist[1];
}
do {
curleft += obj.offsetLeft;
curtop += obj.offsetTop;
} while (obj = obj.offsetParent);
return {'x': curleft, 'y': curtop};
};
})();
// Get mouse event position in DOM element // Get mouse event position in DOM element
Util.getEventPosition = function (e, obj, scale) { Util.getEventPosition = function (e, obj, scale) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment