jQuery slideUp flickers in Internet Explorer quirks mode
I had this expand/collapse div on which I was using slideToggle to make it look good. However, in quirks mode (HTML Transitional 4.01 DocType) and on IE7 the div would briefly pop up after collapsing, showing an annoying flicker. It seems that Internet Explorer has a problem rendering stuff with height 0px.
The solution I found: replace target.slideUp(speed,callBack) with
Update 1 Sep 2009: I have added the cssHeight variable to restore the actual css height settings, not just the height.
Update 21 May 2011: commenter Mads shared a more elegant solution in the form of this script:
The solution I found: replace target.slideUp(speed,callBack) with
var h = target.height();I have also created a jQuery ticket to suggest they use the same method in the library itself.
var cssHeight=target.css('height');
target.animate(
{ height: '1px' }, speed, function() {
target.hide();
target.height(h);
target.css('height',cssHeight);
callBack();
}
);
Update 1 Sep 2009: I have added the cssHeight variable to restore the actual css height settings, not just the height.
Update 21 May 2011: commenter Mads shared a more elegant solution in the form of this script:
(function(){used anywhere after the jQuery include. Thanks, man!
// Define overriding method.
jQuery.fx.prototype.hide = function(){
// Remember where we started, so that we can go back to it later
this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
this.options.hide = true;
// Begin the animation
this.custom(this.cur(), 1);
}
})();
Thank you!
ReplyDeleteThe IE bug is still not resolved in jQuery 1.3.2. All the "IE peek-a-boo" hacks didn't work for me. This has, and it is by far a much more elegant solution.
Hi,
ReplyDeleteI am running jQuery JavaScript Library v1.3.2 but cannot find the line you reference to fix the IE flicker bug:
target.slideUp(speed,callBack)
Am I looking at the correct file? I'd love to fix this bug.
Thanks so much.
slideUp is the method you use in your code and that results in problems on Internet Explorer. What I am suggesting is using the piece of code in the post instead of slideUp when IE is used.
ReplyDeleteI have looked into the jQuery animation engine to see if I can fix slideUp directly, but it was too complicated for my alloted time.
Many thanks for your solution, it took me on the right path. But sadly your code isn't working well on my side. If i want to reshow the hidden element (slideDown()) it behaves even worse compared to the flickering on hiding / slideUp.
ReplyDeleteSo - what did the trick:
I just changed in the original jQuery script the function for minimizing the element to the height 1 instead of 0.
Here is the code:
// Simple 'hide' function
hide: function(){
// Remember where we started, so that we can go back to it later
this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
this.options.hide = true;
// Begin the animation
this.custom(this.cur(), 1);
},
I just change 0 to 1...
Let me know if it works for you.
Thanks for you're post !!
ReplyDeleteIt really helps me :)
Changing 0 to 1 in this.custom(this.cur(), 1); worked for me!
ReplyDeleteThanks SO much. This was bugging the crap out of me!!!
John Resig just changed that ticket status to "wontfix" due to the fact that setting the page to Strict Mode fixes the issue.
ReplyDeleteWell, wouldn't it be nice if changing the doctype for all the pages in a large project would fix anything, rather than a single line of code in jQuery?
ReplyDeleteFor me, that was not an option (although I have tried to convince the stakeholders) so I am working with my own patched jQuery.
Yeah, I tried changing the doctype, too. It fixed the issue but it also hosed the rest of the site's layout.
ReplyDeleteOur site is an ancient piece of crap, probably with the wrong doctype anyway, but until we re-build it, this was a great fix.
Thanks buddy. It really saved my day.
ReplyDeleteThanks buddy for saving my 2 days effort
ReplyDeletemy effort was about to scrapped just because of this annoying flickering
I used your slideUp and made similar slideDown here is slideDown function :D
var h = target.height();
var cssHeight = target.css('height');
target.height('1px');
target.css('height', '1px');
target.show();
target.animate({ height: h }, 500, function() {
target.height(h);
target.css('height', cssHeight);
}
);
Thanks, This issue should be resolved with the latest version of jQuery. Please feel free to check out the following resource for a beginner rundown of the jquery slideup and slidedown functionality: http://www.tonylea.com/2010/jquery-slideup-and-slidedown/
ReplyDeleteThe issue still exists in jQuery v 1.5.3 and v1.6.1.
ReplyDeleteIf you don't want to use a custom version of jQuery, you could always override the core method like this:
ReplyDelete(function(){
// Define overriding method.
jQuery.fx.prototype.hide = function(){
// Remember where we started, so that we can go back to it later
this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
this.options.hide = true;
// Begin the animation
this.custom(this.cur(), 1);
}
})();
Just paste the above script, anywhere after your jQuery include, and you'll be fine.
This is not a perfect solution, as you have to make sure the hide method dosn't change, upon update of jQuery source. However the method hasn't changed in 2 years or more, so chances are that it won't anytime soon.
Thabks...this works for me too!! :)
ReplyDeleteThanks! Good job!
ReplyDelete