Offset setter for fixed position elements in Webkit. Fixes #8316.
authorMichael Murray <mmurray.wa@gmail.com>
Thu, 24 Mar 2011 23:02:38 +0000 (19:02 -0400)
committerjeresig <jeresig@gmail.com>
Thu, 24 Mar 2011 23:02:38 +0000 (19:02 -0400)
src/offset.js
test/unit/offset.js

index 1003c40..18261bb 100644 (file)
@@ -181,10 +181,10 @@ jQuery.offset = {
                        curOffset = curElem.offset(),
                        curCSSTop = jQuery.css( elem, "top" ),
                        curCSSLeft = jQuery.css( elem, "left" ),
-                       calculatePosition = (position === "absolute" && jQuery.inArray('auto', [curCSSTop, curCSSLeft]) > -1),
+                       calculatePosition = ((position === "absolute" || position === "fixed") && 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
+               // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
                if ( calculatePosition ) {
                        curPosition = curElem.position();
                }
index 329d69f..b7f72a0 100644 (file)
@@ -422,6 +422,21 @@ test("offsetParent", function(){
        equals( div[1], jQuery("#nothiddendiv")[0], "The div is the offsetParent." );
 });
 
+testoffset("bug_8316", function( jQuery ){
+  expect(2);
+  
+  var tests = [
+    { id:'#elem', top: 100, left: 100 }
+  ];
+  
+  jQuery.each(tests, function(){
+    var el = jQuery(this.id);
+    el.offset({ top: this.top, left: this.left});
+    equals(Math.round(el.offset().top), this.top);
+    equals(Math.round(el.offset().left), this.left);
+  });
+});
+
 function testoffset(name, fn) {
 
        test(name, function() {
@@ -447,7 +462,7 @@ function testoffset(name, fn) {
        function loadFixture() {
                var src = './data/offset/' + name + '.html?' + parseInt( Math.random()*1000, 10 ),
                        iframe = jQuery('<iframe />').css({
-                               width: 500, height: 500, position: 'absolute', top: -600, left: -600, visiblity: 'hidden'
+                               width: 500, height: 500, position: 'absolute', top: -600, left: -600, visibility: 'hidden'
                        }).appendTo('body')[0];
                iframe.contentWindow.location = src;
                return iframe;