diff --git a/src/css.js b/src/css.js index 5144ee9ca..9e72073eb 100644 --- a/src/css.js +++ b/src/css.js @@ -2,6 +2,9 @@ var curCSS, iframe, iframeDoc, ralpha = /alpha\([^)]*\)/i, ropacity = /opacity=([^)]*)/, rposition = /^(top|right|bottom|left)$/, + // swappable if display is none or starts with table except "table", "table-cell", or "table-caption" + // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, rmargin = /^margin/, rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ), rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ), @@ -493,12 +496,14 @@ jQuery.each([ "height", "width" ], function( i, name ) { jQuery.cssHooks[ name ] = { get: function( elem, computed, extra ) { if ( computed ) { - if ( elem.offsetWidth !== 0 || curCSS( elem, "display" ) !== "none" ) { - return getWidthOrHeight( elem, name, extra ); - } else { + // certain elements can have dimension info if we invisibly show them + // however, it must have a current display style that would benefit from this + if ( elem.offsetWidth === 0 && rdisplayswap.test( curCSS( elem, "display" ) ) ) { return jQuery.swap( elem, cssShow, function() { return getWidthOrHeight( elem, name, extra ); }); + } else { + return getWidthOrHeight( elem, name, extra ); } } }, diff --git a/test/unit/dimensions.js b/test/unit/dimensions.js index b3c15f283..2e5c6557d 100644 --- a/test/unit/dimensions.js +++ b/test/unit/dimensions.js @@ -292,14 +292,15 @@ test("getting dimensions shouldnt modify runtimeStyle see #9233", function() { $div.remove(); }); -test( "getting dimensions of zero width/height table elements shouldn't alter dimensions", function() { - expect( 1 ); - - var table = jQuery("
a
a
").appendTo("#qunit-fixture"), - elem = table.find("tr:eq(0) td:eq(0)"); +test( "table dimensions", 2, function() { + var table = jQuery("
a
a
").appendTo("#qunit-fixture"), + tdElem = table.find("tr:eq(0) td:eq(0)"), + colElem = table.find("col:eq(1)").width( 300 ); table.find("td").css({ "margin": 0, "padding": 0 }); - equal( elem.width(), elem.width(), "width() doesn't alter dimension values" ); + + equal( tdElem.width(), tdElem.width(), "width() doesn't alter dimension values of empty cells, see #11293" ); + equal( colElem.width(), 300, "col elements have width(), see #12243" ); }); test("box-sizing:border-box child of a hidden elem (or unconnected node) has accurate inner/outer/Width()/Height() see #10413", function() {