Fixed an issue with setting offset of absolutely positioned element that has no posit...
[jquery.git] / src / offset.js
index 59591ca..0ce4c19 100644 (file)
@@ -150,15 +150,27 @@ jQuery.offset = {
        },
        
        setOffset: function( elem, options, i ) {
+               var position = jQuery.curCSS( elem, "position" );
+
                // set position first, in-case top/left are set even on static elem
-               if ( /static/.test( jQuery.curCSS( elem, "position" ) ) ) {
+               if ( position === "static" ) {
                        elem.style.position = "relative";
                }
-               var curElem   = jQuery( elem ),
-                       curOffset = curElem.offset(),
-                       curTop    = parseInt( jQuery.curCSS( elem, "top",  true ), 10 ) || 0,
-                       curLeft   = parseInt( jQuery.curCSS( elem, "left", true ), 10 ) || 0,
-                       props     = {};
+
+               var curElem    = jQuery( elem ),
+                       curOffset  = curElem.offset(),
+                       curCSSTop  = jQuery.curCSS( elem, "top", true ),
+                       curCSSLeft = jQuery.curCSS( elem, "left", true ),
+                       calculatePosition = (position === "absolute" && jQuery.inArray('auto', [curCSSTop, curCSSLeft]) > -1),
+                       props = {}, curPosition = {}, curTop, curLeft;
+
+               // need to be able to calculate position if either top or left is auto and position is absolute
+               if ( calculatePosition ) {
+                       curPosition = curElem.position();
+               }
+
+               curTop  = calculatePosition ? curPosition.top  : parseInt( curCSSTop,  10 ) || 0;
+               curLeft = calculatePosition ? curPosition.left : parseInt( curCSSLeft, 10 ) || 0;
 
                if ( jQuery.isFunction( options ) ) {
                        options = options.call( elem, i, curOffset );