Commit 28ee5c69 authored by John Resig's avatar John Resig

Added the new .offset() method, directly imported from Dimensions (heavily...

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
parent d2f82aba
......@@ -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/*\
......
......@@ -48,8 +48,9 @@
<fileset dir="${SRC_DIR}" includes="core.js" />
<fileset dir="${SRC_DIR}" includes="selector.js" />
<fileset dir="${SRC_DIR}" includes="event.js" />
<fileset dir="${SRC_DIR}" includes="fx.js" />
<fileset dir="${SRC_DIR}" includes="ajax.js" />
<fileset dir="${SRC_DIR}" includes="fx.js" />
<fileset dir="${SRC_DIR}" includes="offset.js" />
<fileset dir="${PLUGIN_DIR}" includes="${PLUGINS}" />
<fileset dir="${SRC_DIR}" includes="outro.js" />
</concat>
......
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;
}
};
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