如何修复此脚本中的 IE ClearType + jQuery 不透明度问题?

Posted

技术标签:

【中文标题】如何修复此脚本中的 IE ClearType + jQuery 不透明度问题?【英文标题】:How to fix IE ClearType + jQuery opacity problem in this script? 【发布时间】:2011-02-10 08:22:05 【问题描述】:

我遇到了一个相当普遍的问题(或者似乎是这样,经过一些谷歌搜索之后......),IE 在使用 jQuery 为不透明度设置动画时会弄乱粗体文本和透明 png。

您可以在此处查看示例:http://dev.gentlecode.net/dotme/index-sample.html(显然只出现在 IE 中)

我看到一些博客文章说解决方法是删除过滤器属性,但我不确定如何将它应用到我正在使用的脚本中,因为我从教程中得到它并且仍在学习 jQuery.. .

脚本如下:

$('ul.nav').each(function() 
    var $links = $(this).find('a'),
        panelIds = $links.map(function()  return this.hash; ).get().join(","),
        $panels = $(panelIds),
        $panelWrapper = $panels.filter(':first').parent(),
        delay = 500;

    $panels.hide();

    $links.click(function() 
        var $link = $(this),
            link = (this);

        if ($link.is('.current')) 
            return;
        

        $links.removeClass('current');
        $link.addClass('current');

        $panels.animate( opacity : 0 , delay);
        $panelWrapper.animate(
            height: 0
        , delay, function() 
            var height = $panels.hide().filter(link.hash).show().css('opacity', 1).outerHeight();

            $panelWrapper.animate(
                height: height
            , delay);
        ); 

        return false;
    );

    var showtab = window.location.hash ? '[hash=' + window.location.hash + ']' : ':first';

    $links.filter(showtab).click();

);

如果有人能检查一下并告诉我如何解决不透明度问题,我将不胜感激。过滤器方法是否也能解决我在透明 png 中遇到的问题,比如粗体类型的像素化丑陋边框?

提前感谢所有帮助!

【问题讨论】:

【参考方案1】:

我已经在 (Vista) IE8、IE8 兼容性、Google Chrome 4.1 和 Firefox 3.5.9 上运行了示例页面——如果你愿意,我也可以在 XP 和 Win 7 上运行——但到目前为止,它们似乎都可以在类似的时尚。

问题可能出在 IE6 上(我猜),因为 IE6 和 IE6 中的透明 png 存在已知问题,谷歌:

ie6透明png修复

对于一堆修复,包括(这是谷歌上述搜索中的第二个,搜索中的第一个说这是一个比他更好的解决方案):

http://24ways.org/2007/supersleight-transparent-png-in-ie6

至于您发布的 jquery 示例,如果使用 IE6/png 变通方法仍然失败,则发布您正在使用的 html 与 jquery 一起调试。

【讨论】:

谢谢,但这不是我要找的。在所有版本的 IE 中,动画不透明度存在一个已知问题,使粗体文本几乎无法阅读。 在示例中的字体中,'s'、'a' 和 'v' 在 IE 中确实有一些粗体锯齿 - 这些字母的渲染效果比其他浏览器更差。【参考方案2】:

你可以这样写:

更改此行/语句:

var height = $panels.hide().filter(link.hash).show().css('opacity', 1).outerHeight();

到这里:

var filtered = $panels.hide().filter(link.hash).show().css('opacity', 1);
if ($.browser.msie)
  filtered.each(function()  this.style.removeAttribute('filter'); );
var height = filtered.outerHeight();

通常我不会容忍$.browser 的使用,但在这种情况下,它是一个 IE 错误,而 jQuery 正在应用过滤器,因为它也是 IE。如果您在 IE 中,这将遍历元素并删除过滤集并取消 filter 样式属性。

【讨论】:

不幸的是,它没有成功。粗体文本和透明图像的渲染效果仍然很差 (dl.getdropbox.com/u/3871932/iebold.png) - 是否可能是其他错误而不是 ClearType 问题? @Justine - 对不起!我一定是真的厌倦了回答这个问题:) 你需要设置不透明度然后删除过滤器属性,我更新了显示这个的答案,试试上面更新的代码。 【参考方案3】:

您可以在动画期间解决问题,而不仅仅是在之后,通过将background-color:#fff 样式应用于您的 css 中的容器(如果它是容器,则应用于元素)。

我从The Strange Zen of javascript – IE bold text + opacity problem 那里得到了这个提示。

这很好地解决了我的 IE7 问题。此外,即使不使用背景颜色,您也可以在动画后解决问题而不会弄乱过滤器,只需在项目完全可见后删除 opacity css 属性,ala element.css(opacity: '');

【讨论】:

以上是关于如何修复此脚本中的 IE ClearType + jQuery 不透明度问题?的主要内容,如果未能解决你的问题,请参考以下文章

IE 正在丢失 ClearType

IE8:禁用cleartype?

使用 jQuery 为文本的不透明度设置动画时更正 IE Cleartype/Filter 问题

极其奇怪的行为:当脚本被阻止然后被允许时,IE11 似乎创建了一个不可见的选项卡 - 如何修复它?

使用 Internet Explorer 过滤器和 ClearType

IE中BHO插件被修改...该如何解决