diff options
author | Colin Snover <github.com@zetafleet.com> | 2010-10-05 14:53:35 -0500 |
---|---|---|
committer | Colin Snover <github.com@zetafleet.com> | 2010-10-05 14:53:35 -0500 |
commit | 5057ff9f43017f673894584358ca95c8753b65d4 (patch) | |
tree | a3daccb49c564c8b332bd9e02dabb91e270f42be /src | |
parent | 329b750af6649b3755920144bf1d52bfc3a42a0e (diff) | |
download | jquery-5057ff9f43017f673894584358ca95c8753b65d4.tar.gz jquery-5057ff9f43017f673894584358ca95c8753b65d4.zip |
IE6 will shrink-wrap elements with layout instead of allowing content to flow outside of the border-box. Add a test for this and do not remove the overflow property after an animation in IE6.
Diffstat (limited to 'src')
-rw-r--r-- | src/effects.js | 33 | ||||
-rw-r--r-- | src/support.js | 57 |
2 files changed, 56 insertions, 34 deletions
diff --git a/src/effects.js b/src/effects.js index 5d574a8ff..4b9c7ccf9 100644 --- a/src/effects.js +++ b/src/effects.js @@ -36,17 +36,23 @@ jQuery.fn.extend({ return this.animate( genFx("show", 3), speed, easing, callback); } else { for ( var i = 0, j = this.length; i < j; i++ ) { + // Reset the inline display of this element to learn if it is + // being hidden by cascaded rules or not + if ( !jQuery.data(this[i], "olddisplay") && this[i].style.display === "none" ) { + this[i].style.display = ""; + } + // Set elements which have been overridden with display: none // in a stylesheet to whatever the default browser style is // for such an element - if ( jQuery.css( this[i], "display" ) === "none" && this[i].style.display !== "none" ) { + if ( jQuery.css( this[i], "display" ) === "none" && this[i].style.display === "" ) { jQuery.data(this[i], "olddisplay", defaultDisplay(this[i].nodeName)); } } - // Set the display of the elements in a second loop + // Set the display of most of the elements in a second loop // to avoid the constant reflow - for ( i = 0, j = this.length; i < j; i++ ) { + for ( i = 0; i < j; i++ ) { this[i].style.display = jQuery.data(this[i], "olddisplay") || ""; } @@ -59,17 +65,17 @@ jQuery.fn.extend({ return this.animate( genFx("hide", 3), speed, easing, callback); } else { - for ( var i = 0, l = this.length; i < l; i++ ) { + for ( var i = 0, j = this.length; i < j; i++ ) { var old = jQuery.data(this[i], "olddisplay"); - if ( !old && old !== "none" ) { + if ( !old ) { jQuery.data( this[i], "olddisplay", jQuery.css( this[i], "display" ) ); } } // Set the display of the elements in a second loop // to avoid the constant reflow - for ( var j = 0, k = this.length; j < k; j++ ) { - this[j].style.display = "none"; + for ( i = 0; i < j; i++ ) { + this[i].style.display = "none"; } return this; @@ -115,7 +121,8 @@ jQuery.fn.extend({ // test suite var opt = jQuery.extend({}, optall), p, - hidden = this.nodeType === 1 && jQuery(this).is(":hidden"), + isElement = this.nodeType === 1, + hidden = isElement && jQuery(this).is(":hidden"), self = this; for ( p in prop ) { @@ -131,7 +138,7 @@ jQuery.fn.extend({ return opt.complete.call(this); } - if ( ( p === "height" || p === "width" ) ) { + if ( isElement && ( p === "height" || p === "width" ) ) { // Make sure that nothing sneaks out // Record all 3 overflow attributes because IE does not // change the overflow attribute when overflowX and @@ -141,8 +148,8 @@ jQuery.fn.extend({ // Set display property to inline-block for height/width // animations on inline elements that are having width/height // animated - if ( jQuery.curCSS( this, "display" ) === "inline" && - jQuery.curCSS( this, "float" ) === "none" ) { + if ( jQuery.css( this, "display" ) === "inline" && + jQuery.css( this, "float" ) === "none" ) { if ( !jQuery.support.inlineBlockNeedsLayout ) { this.style.display = "inline-block"; } else { @@ -168,7 +175,7 @@ jQuery.fn.extend({ } } - if ( opt.overflow != null ) { + if ( opt.overflow != null || (jQuery.support.shrinkWrapBlocks && isElement) ) { this.style.overflow = "hidden"; } @@ -401,7 +408,7 @@ jQuery.fx.prototype = { if ( done ) { // Reset the overflow - if ( this.options.overflow != null ) { + if ( this.options.overflow != null && (!jQuery.support.shrinkWrapBlocks || !jQuery.css( this.elem, "hasLayout" )) ) { this.elem.style.overflow = this.options.overflow[0]; this.elem.style.overflowX = this.options.overflow[1]; this.elem.style.overflowY = this.options.overflow[2]; diff --git a/src/support.js b/src/support.js index 878db1f0b..85deb1b98 100644 --- a/src/support.js +++ b/src/support.js @@ -67,6 +67,7 @@ noCloneEvent: true, boxModel: null, inlineBlockNeedsLayout: false, + shrinkWrapBlocks: false, reliableHiddenOffsets: true }; @@ -120,17 +121,25 @@ document.body.appendChild( div ); jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2; - // Check if natively block-level elements act like inline-block - // elements when setting their display to 'inline' - // (IE < 8 does this) if ( 'zoom' in div.style ) { + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + // (IE < 8 does this) div.style.display = 'inline'; - - // Layout is necessary to trigger this “feature” div.style.zoom = 1; jQuery.support.inlineBlockNeedsLayout = div.offsetWidth === 2; + + // Check if elements with layout shrink-wrap their children + // (IE 6 does this) + div.style.display = ''; + div.innerHTML = '<div style="width:4px;"></div>'; + jQuery.support.shrinkWrapBlocks = div.offsetWidth !== 2; } + div.innerHTML = '<table><tr><td style="padding:0;display:none"></td><td>t</td></tr></table>'; + var tds = div.getElementsByTagName('td'); + // Check if table cells still have offsetWidth/Height when they are set // to display:none and there are still other visible table cells in a // table row; if so, offsetWidth/Height are not reliable for use when @@ -138,30 +147,36 @@ // display:none (it is still safe to use offsets if a parent element is // hidden; don safety goggles and see bug #4512 for more information). // (only IE 8 fails this test) - div.innerHTML = '<table><tr><td style="display:none"></td><td>t</td></tr></table>'; - jQuery.support.reliableHiddenOffsets = div.getElementsByTagName('td')[0].offsetHeight === 0; + jQuery.support.reliableHiddenOffsets = tds[0].offsetHeight === 0; + + tds[0].style.display = ''; + tds[1].style.display = 'none'; + + // Check if empty table cells still have offsetWidth/Height + // (IE < 8 fail this test) + jQuery.support.reliableHiddenOffsets = jQuery.support.reliableHiddenOffsets && tds[0].offsetHeight === 0; div.innerHTML = ''; document.body.removeChild( div ).style.display = 'none'; - div = null; + div = tds = null; }); // Technique from Juriy Zaytsev // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/ - var eventSupported = function( eventName ) { - var el = document.createElement("div"); - eventName = "on" + eventName; - - var isSupported = (eventName in el); - if ( !isSupported ) { - el.setAttribute(eventName, "return;"); - isSupported = typeof el[eventName] === "function"; - } - el = null; - - return isSupported; + var eventSupported = function( eventName ) { + var el = document.createElement("div"); + eventName = "on" + eventName; + + var isSupported = (eventName in el); + if ( !isSupported ) { + el.setAttribute(eventName, "return;"); + isSupported = typeof el[eventName] === "function"; + } + el = null; + + return isSupported; }; - + jQuery.support.submitBubbles = eventSupported("submit"); jQuery.support.changeBubbles = eventSupported("change"); |