From 556eaf4a193287c306d163635cbb5f5c95a22a84 Mon Sep 17 00:00:00 2001 From: Liam James Date: Fri, 19 Apr 2024 23:47:52 +1000 Subject: [PATCH] Offset: Increase search depth when finding the 'real' offset parent Changes: * Increase search depth when finding for the real offset parent * Ignore offset for statically positioned offset parent * Add tests for the position of an element in a table Closes gh-4861 --- src/offset.js | 7 ++++--- test/unit/offset.js | 5 ++++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/offset.js b/src/offset.js index ca27ca5c7..65dab2bd2 100644 --- a/src/offset.js +++ b/src/offset.js @@ -121,12 +121,13 @@ jQuery.fn.extend( { doc = elem.ownerDocument; offsetParent = elem.offsetParent || doc.documentElement; while ( offsetParent && - ( offsetParent === doc.body || offsetParent === doc.documentElement ) && + offsetParent !== doc.documentElement && jQuery.css( offsetParent, "position" ) === "static" ) { - offsetParent = offsetParent.parentNode; + offsetParent = offsetParent.offsetParent || doc.documentElement; } - if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) { + if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 && + jQuery.css( offsetParent, "position" ) !== "static" ) { // Incorporate borders into its offset, since they are outside its content origin parentOffset = jQuery( offsetParent ).offset(); diff --git a/test/unit/offset.js b/test/unit/offset.js index 73ec8928f..50eee3dd5 100644 --- a/test/unit/offset.js +++ b/test/unit/offset.js @@ -436,13 +436,16 @@ testIframe( "fixed", "offset/fixed.html", function( assert, $, window ) { } ); testIframe( "table", "offset/table.html", function( assert, $ ) { - assert.expect( 4 ); + assert.expect( 6 ); assert.equal( $( "#table-1" ).offset().top, 6, "jQuery('#table-1').offset().top" ); assert.equal( $( "#table-1" ).offset().left, 6, "jQuery('#table-1').offset().left" ); assert.equal( $( "#th-1" ).offset().top, 10, "jQuery('#th-1').offset().top" ); assert.equal( $( "#th-1" ).offset().left, 10, "jQuery('#th-1').offset().left" ); + + assert.equal( $( "#th-1" ).position().top, 10, "jQuery('#th-1').position().top" ); + assert.equal( $( "#th-1" ).position().left, 10, "jQuery('#th-1').position().left" ); } ); testIframe( "scroll", "offset/scroll.html", function( assert, $, win ) {