diff --git a/src/offset.js b/src/offset.js index 59591caea6..0ce4c1979c 100644 --- a/src/offset.js +++ b/src/offset.js @@ -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 ); diff --git a/test/data/offset/absolute.html b/test/data/offset/absolute.html index 3bbc8417dc..2a7eb73e56 100644 --- a/test/data/offset/absolute.html +++ b/test/data/offset/absolute.html @@ -13,6 +13,7 @@ #absolute-2 { top: 19px; left: 19px; } #marker { position: absolute; border: 2px solid #000; width: 50px; height: 50px; background: #ccc; } p.instructions { position: absolute; bottom: 0; } + #positionTest { position: absolute; }