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("
").appendTo("#qunit-fixture"),
- elem = table.find("tr:eq(0) td:eq(0)");
+test( "table dimensions", 2, function() {
+ var table = jQuery("").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() {