From: Paul Bakaus <paul.bakaus@googlemail.com>
Date: Thu, 5 Oct 2006 07:40:31 +0000 (+0000)
Subject: added Brandon's offset function
X-Git-Url: http://git.asbjorn.it/?a=commitdiff_plain;h=d9ebe848d01d90bbc7397e6f115d47bd44ebfbf8;p=jquery.git

added Brandon's offset function
---

diff --git a/src/dimensions/dimensions.js b/src/dimensions/dimensions.js
index 6e6e6d6..ce87862 100644
--- a/src/dimensions/dimensions.js
+++ b/src/dimensions/dimensions.js
@@ -171,4 +171,142 @@ $.fn.scrollTop = function() {
 			document.body.scrollTop;
 
 	return this.get(0).scrollTop;
+};
+
+/* Copyright (c) 2006 Brandon Aaron (http://brandonaaron.net)
+ * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) 
+ * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
+ */
+
+/**
+ * This returns an object with top, left, width, height, borderLeft,
+ * borderTop, marginLeft, marginTop, scrollLeft, scrollTop, 
+ * pageXOffset, pageYOffset.
+ *
+ * The top and left values include the scroll offsets but the
+ * scrollLeft and scrollTop properties of the returned object
+ * are the combined scroll offets of the parent elements 
+ * (not including the window scroll offsets). This is not the
+ * same as the element's scrollTop and scrollLeft.
+ * 
+ * For accurate readings make sure to use pixel values.
+ *
+ * @name offset	
+ * @type Object
+ * @cat Dimensions
+ * @author Brandon Aaron (brandon.aaron@gmail.com || http://brandonaaron.net)
+ */
+/**
+ * This returns an object with top, left, width, height, borderLeft,
+ * borderTop, marginLeft, marginTop, scrollLeft, scrollTop, 
+ * pageXOffset, pageYOffset.
+ *
+ * The top and left values include the scroll offsets but the
+ * scrollLeft and scrollTop properties of the returned object
+ * are the combined scroll offets of the parent elements 
+ * (not including the window scroll offsets). This is not the
+ * same as the element's scrollTop and scrollLeft.
+ * 
+ * For accurate readings make sure to use pixel values.
+ *
+ * @name offset	
+ * @type Object
+ * @param String refElement This is an expression. The offset returned will be relative to the first matched element.
+ * @cat Dimensions
+ * @author Brandon Aaron (brandon.aaron@gmail.com || http://brandonaaron.net)
+ */
+/**
+ * This returns an object with top, left, width, height, borderLeft,
+ * borderTop, marginLeft, marginTop, scrollLeft, scrollTop, 
+ * pageXOffset, pageYOffset.
+ *
+ * The top and left values include the scroll offsets but the
+ * scrollLeft and scrollTop properties of the returned object
+ * are the combined scroll offets of the parent elements 
+ * (not including the window scroll offsets). This is not the
+ * same as the element's scrollTop and scrollLeft.
+ * 
+ * For accurate readings make sure to use pixel values.
+ *
+ * @name offset	
+ * @type Object
+ * @param jQuery refElement The offset returned will be relative to the first matched element.
+ * @cat Dimensions
+ * @author Brandon Aaron (brandon.aaron@gmail.com || http://brandonaaron.net)
+ */
+/**
+ * This returns an object with top, left, width, height, borderLeft,
+ * borderTop, marginLeft, marginTop, scrollLeft, scrollTop, 
+ * pageXOffset, pageYOffset.
+ *
+ * The top and left values include the scroll offsets but the
+ * scrollLeft and scrollTop properties of the returned object
+ * are the combined scroll offets of the parent elements 
+ * (not including the window scroll offsets). This is not the
+ * same as the element's scrollTop and scrollLeft.
+ * 
+ * For accurate readings make sure to use pixel values.
+ *
+ * @name offset	
+ * @type Object
+ * @param HTMLElement refElement The offset returned will be relative to this element.
+ * @cat Dimensions
+ * @author Brandon Aaron (brandon.aaron@gmail.com || http://brandonaaron.net)
+ */
+$.fn.offset = function(refElem) {
+	if (!this[0]) throw '$.fn.offset requires an element.';
+	
+	refElem = (refElem) ? $(refElem)[0] : null;
+	var x = 0, y = 0, elm = this[0], parent = this[0], pos = null, borders = [0,0], isElm = true, sl = 0, st = 0;
+	do {
+		if (parent.tagName == 'BODY' || parent.tagName == 'HTML') {
+			// Safari and IE don't add margin for static and relative
+			if (($.browser.safari || $.browser.msie) && pos != 'absolute') {
+				x += parseInt($.css(parent, 'marginLeft')) || 0;
+				y += parseInt($.css(parent, 'marginTop'))  || 0;
+			}
+			break;
+		}
+		
+		pos    = $.css(parent, 'position');
+		border = [parseInt($.css(parent, 'borderLeftWidth')) || 0,
+							parseInt($.css(parent, 'borderTopWidth'))  || 0];
+		sl = parent.scrollLeft;
+		st = parent.scrollTop;
+		
+		x += (parent.offsetLeft || 0) + border[0] - sl;
+		y += (parent.offsetTop  || 0) + border[1] - st;
+		
+		// Safari and Opera include the border already for parents with position = absolute|relative
+		if (($.browser.safari || $.browser.opera) && !isElm && (pos == 'absolute' || pos == 'relative')) {
+			x -= border[0];
+			y -= border[1];
+		}
+		
+		parent = parent.offsetParent;
+		isElm  = false;
+	} while(parent);
+	
+	if (refElem) {
+		var offset = $(refElem).offset();
+		x  = x  - offset.left;
+		y  = y  - offset.top;
+		sl = sl - offset.scrollLeft;
+		st = st - offset.scrollTop;
+	}
+	
+	return {
+		top:  y,
+		left: x,
+		width:  elm.offsetWidth,
+		height: elm.offsetHeight,
+		borderTop:  parseInt($.css(elm, 'borderTopWidth'))  || 0,
+		borderLeft: parseInt($.css(elm, 'borderLeftWidth')) || 0,
+		marginTop:  parseInt($.css(elm, 'marginTopWidth'))  || 0,
+		marginLeft: parseInt($.css(elm, 'marginLeftWidth')) || 0,
+		scrollTop:  st,
+		scrollLeft: sl,
+		pageYOffset: window.pageYOffset || document.documentElement.scrollTop  || document.body.scrollTop  || 0,
+		pageXOffset: window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0
+	};
 };
\ No newline at end of file