如何解决在 jQuery 中使用 slideToggle 时出现的闪烁问题?

Posted

技术标签:

【中文标题】如何解决在 jQuery 中使用 slideToggle 时出现的闪烁问题?【英文标题】:How do you fix the flickering that occurs when you use slideToggle in jQuery? 【发布时间】:2010-09-11 19:16:24 【问题描述】:

我有一个简单的无序列表,我想使用 jQuery slideUp 和 slideDown 效果在点击时显示和隐藏。一切似乎都运行良好,但在 IE6 中,列表会向上滑动,闪烁片刻,然后消失。

有人知道解决这个问题的方法吗?

谢谢!

【问题讨论】:

人们现在应该停止支持 IE6 为什么?一些公司仍然与它联系在一起。例如,拥有数千台工作站的公司,更新每台机器的 Internet Explorer 版本将花费大量成本。不幸的是,它仍然会持续一段时间。 Facebook 和 Apple 已放弃对 IE6 的支持 【参考方案1】:

对额外的评论表示歉意(我不能对 Pavel 的回答进行投票或评论),但添加 DOCTYPE 为我解决了这个问题,并且 slideUp/Down/Toggle 效果现在可以在 IE7 中正常工作。

有关 DOCTYPES 的更多信息,请参阅A List Apart,或者您可以尝试指定相当宽松的 4/Transitional:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

【讨论】:

非常感谢!现在效果很好。好'ole ***。 :-) 令人惊讶的是,DOCTYPE 是如何产生如此巨大的影响的 这种文档类型破坏了我的页面。我的处理器达到 50% 并且 IE 停止运行。我正在使用 IE8。【参考方案2】:

让 IE6 闪烁。当您的基本功能运行良好时,我认为在垂死的浏览器上投入时间是不值得的。如果您出于可访问性原因担心闪烁,只需嗅探 IE6 并将动画替换为通用 show() 和 hide() 即可。对于无关紧要的边缘情况,我建议避免使用复杂的代码。

【讨论】:

+1 我原则上同意。尽管在实践中我会指出这还不是 100% 可行的。许多企业(包括我的雇主)在IE6上需要A级支持。取决于观众,但幸运的是观众正在减少。 关于我的公司,我在同一条船上。超过 3/4 的公司使用 ie6。 如果贵公司 75% 的人仍在使用 IE6,也许是时候重新考虑你的职业生涯或停止提供动画细节了。【参考方案3】:
$(document).ready(function() 
    // Fix background image caching problem
    if (jQuery.browser.msie) 
        try  
            document.execCommand("BackgroundImageCache", false, true); 
         catch(err) 
    
;

Apparently.

【讨论】:

您可以对 if 语句进行 bin 处理,但这可能会稍微影响非 IE6 浏览器的性能,因为它们会尝试执行代码(并失败)。 这是非常有用的信息,不幸的是它不能解决我遇到的问题...我添加了代码,但我的列表仍在闪烁。 我希望我能先找到这个,因为它解决了我在 ie6 中的问题。谢谢 天哪,这太棒了!这种闪烁一直困扰着我多年! 太棒了!非常感谢您的提示!【参考方案4】:

Oli 的修复似乎只适用于闪烁的背景,但这里并非如此。

Ryan McGeary 的建议是中肯的,除非客户/您的老板绝对要求 IE6 不要表现得像胎儿酒精综合症。

我在这里找到了解决方案:Slide effect bugs in IE 6 and 7 since version 1.1.3

在文件顶部添加了一个 doctype 声明(为什么以前没有呢?谁知道呢!)并且闪烁消失了,再也看不到了。

【讨论】:

【参考方案5】:

根据我所听到和尝试过的情况(包括此处的其他建议),在某些情况下,闪烁仍然会很明显,尤其是当您无法选择轻松退出怪癖模式时。 就我而言,我现在不得不保持怪癖模式,其他建议仍然没有为我解决问题。我最终添加了一些解决方法,直到我们终于可以离开怪癖模式:

//Start the slideUp effect lasting 500ms
$('#element').slideUp(500);

//Abort the effect just before it finishes and force hide()
//I had to play with the timeout interval until I found one that
// looked exactly right. 400ms worked for me.
setTimeout(function() 
    $('#element').stop(true, true).hide(); 
, 400);

【讨论】:

【参考方案6】:

此代码不依赖于浏览器(无浏览器检测),效果很好并重现了方法 .slideUp 的行为

$("#element").animate(
     height: 1,          // Avoiding sliding to 0px (flash on IE)
     paddingTop: "hide",
     paddingBottom: "hide"
     )
     // Then hide
     .animate(display:"hide",queue:true);

【讨论】:

这是一个不错的、简单的替代品【参考方案7】:

不知道是否有人会阅读此答案,但对于像我一样无法在页面中添加文档类型(感谢 Sharepoint 2007 默认模板)而不花几天时间在完整模板上的人来说,这是一种解决方法修订。

在无 DOCTYPE 的文档上,当元素高度达到 0 时会发生闪烁。所以我发现的解决方法是将元素设置为 1px 的高度,而不是 0。

像这样:

$(".slider").click(function (e) 
   $(this).animate("height" : "1px");
);

希望它会有所帮助。

注意:不要忘记,为了向下滑动元素,您必须事先以某种方式存储其初始高度(节点属性、rel 属性破解等)。

【讨论】:

【参考方案8】:

我正在使用在一些背景幻灯片上带有标记副本的轮播。幻灯片过渡是淡入淡出。到目前为止一切都很好。

但在幻灯片加载后,副本的某些部分会淡入。然后在幻灯片过渡之前淡出。此副本是一个无序列表的链接 (UL &gt; LI*2 &gt; A),在幻灯片背景上淡入。这也适用于所有浏览器除了 IE。 IE 在 UL 上有一个闪烁的背景。

发生的情况是同时运行了两个淡入:幻灯片上的背景图像和 UL。在幻灯片完成加载后,我使用sergio's 原型设计 setTimeout 函数运行 UL fadeIn()。然后,我在 UL fadeOut() 之后调用了另一个 setTimeout 来进行幻灯片转换。

setTimeout 是你对抗 IE 闪烁的朋友。

【讨论】:

【参考方案9】:

我们今天遇到了同样的问题。不仅在 IE6 中,在 IE8 中也一样!我已经通过提前隐藏 div 来修复它,通过使用超时:

var pane = $('.ColorPane');
var speed = 500;
window.setTimeout(function()  pane.css('display', 'none'); , speed - 100);
pane.slideUp(speed);

希望它对你们中的一些人有所帮助。

【讨论】:

【参考方案10】:

我在http://blog.clintonbeattie.com/how-to-solve-the-jquery-flickering-content-problem/ 上发布了一个快速修复解决方案

简而言之,将溢出:隐藏添加到您正在滑入/滑出的包含元素。希望这会有所帮助!

【讨论】:

以上是关于如何解决在 jQuery 中使用 slideToggle 时出现的闪烁问题?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Jenkins 上运行的 Karma 单元测试中解决此错误:“找不到变量:jQuery”

如何使用 JQuery 指示用户等到数据库更新

ASP.NET MVC 主视图引用的js(jquery)在分部视图中无效,如何解决?

如何使用 AJAX 自动完成触发 JQuery

如何解决jquery与zepto冲突问题

如何解决JQuery ajaxSubmit提交中文乱码