From 28ee5c692245e18bdedcc91372949ec8b784ee36 Mon Sep 17 00:00:00 2001 From: John Resig Date: Sat, 8 Sep 2007 14:44:29 +0000 Subject: [PATCH] Added the new .offset() method, directly imported from Dimensions (heavily worked over by both Brandon and John). Original source: http://brandonaaron.net/jquery/issues/dimensions/new_offset/jquery.offset.js --- Makefile | 3 +- build.xml | 3 +- src/offset.js | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 92 insertions(+), 2 deletions(-) create mode 100644 src/offset.js diff --git a/Makefile b/Makefile index e9a977c..ba25291 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,8 @@ BASE_FILES = ${SRC_DIR}/core.js\ ${SRC_DIR}/selector.js\ ${SRC_DIR}/event.js\ ${SRC_DIR}/ajax.js\ - ${SRC_DIR}/fx.js + ${SRC_DIR}/fx.js\ + ${SRC_DIR}/offset.js PLUGINS = ${PLUG_DIR}/button/*\ ${PLUG_DIR}/center/*\ diff --git a/build.xml b/build.xml index f977269..89d4fea 100644 --- a/build.xml +++ b/build.xml @@ -48,8 +48,9 @@ - + + diff --git a/src/offset.js b/src/offset.js new file mode 100644 index 0000000..6289ad2 --- /dev/null +++ b/src/offset.js @@ -0,0 +1,88 @@ +jQuery.fn.offset = function() { + var left = 0, top = 0, elem = this[0], results; + + if ( elem ) with ( jQuery.browser ) { + var absolute = jQuery.css(elem, "position") == "absolute", + parent = elem.parentNode, + offsetParent = elem.offsetParent, + doc = elem.ownerDocument, + safari2 = safari && !absolute && parseInt(version) < 522; + + // Use getBoundingClientRect if available + if ( elem.getBoundingClientRect ) { + box = elem.getBoundingClientRect(); + + // Add the document scroll offsets + add( + box.left + Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft), + box.top + Math.max(doc.documentElement.scrollTop, doc.body.scrollTop) + ); + + // IE adds the HTML element's border, by default it is medium which is 2px + // IE 6 and IE 7 quirks mode the border width is overwritable by the following css html { border: 0; } + // IE 7 standards mode, the border is always 2px + if ( msie ) { + var border = jQuery("html").css("borderWidth"); + border = (border == "medium" || jQuery.boxModel && parseInt(version) >= 7) && 2 || border; + add( -border, -border ); + } + + // Otherwise loop through the offsetParents and parentNodes + } else { + + // Initial element offsets + add( elem.offsetLeft, elem.offsetTop ); + + // Get parent offsets + while ( offsetParent ) { + // Add offsetParent offsets + add( offsetParent.offsetLeft, offsetParent.offsetTop ); + + // Mozilla and Safari > 2 does not include the border on offset parents + // However Mozilla adds the border for table cells + if ( mozilla && /^t[d|h]$/i.test(parent.tagName) || !safari2 ) + border( offsetParent ); + + // Safari <= 2 doubles body offsets with an absolutely positioned element or parent + if ( safari2 && !absolute && jQuery.css(offsetParent, "position") == "absolute" ) + absolute = true; + + // Get next offsetParent + offsetParent = offsetParent.offsetParent; + } + + // Get parent scroll offsets + while ( parent.tagName && /^body|html$/i.test(parent.tagName) ) { + // Work around opera inline/table scrollLeft/Top bug + if ( /^inline|table-row.*$/i.test(jQuery.css(parent, "display")) ) + // Subtract parent scroll offsets + add( -parent.scrollLeft, -parent.scrollTop ); + + // Mozilla does not add the border for a parent that has overflow != visible + if ( mozilla && jQuery.css(parent, "overflow") != "visible" ) + border( parent ); + + // Get next parent + parent = parent.parentNode; + } + + // Safari doubles body offsets with an absolutely positioned element or parent + if ( safari && absolute ) + add( -doc.body.offsetLeft, -doc.body.offsetTop ); + } + + // Return an object with top and left properties + results = { top: top, left: left }; + } + + return results; + + function border(elem) { + add( jQuery.css(elem, "borderLeftWidth"), jQuery.css(elem, "borderTopWidth") ); + } + + function add(l, t) { + left += parseInt(l) || 0; + top += parseInt(t) || 0; + } +}; -- 1.7.10.4