IE 正在丢失 ClearType

Posted

技术标签:

【中文标题】IE 正在丢失 ClearType【英文标题】:IE is losing ClearType 【发布时间】:2010-09-29 11:46:44 【问题描述】:

我正在经历一些非常奇怪的事情!

我有一个用 JS (jQuery) 隐藏的 div。 像这样:

$('#myDiv').hide();

然后当我像这样进行淡入时:

$("#myDiv").fadeIn('slow');

然后文本在 IE 中会丢失 ClearType,但在 FF 中不会。如果我使用切换插入的淡入淡出,那么一切都很好。

IE 是做什么的,有什么解决方案,因为它看起来很可怕。 (我开启了 ClearType,你可能已经理解了)

【问题讨论】:

【参考方案1】:

当对 IE 应用淡入淡出时,它会(至少通过 jquery)应用 dxtransform 类,这将使它失去任何抗锯齿效果,直到其不透明度恢复为 1。

【讨论】:

【参考方案2】:

对该主题的快速搜索显示以下内容:

jQuery fadeIn/fadeOut IE cleartype glitch

问题似乎是CSS“过滤器”属性没有自动删除。 解决这个问题最简单的方法是手动删除它:

$('#myDiv').fadeIn('slow', function() 
   this.style.removeAttribute('filter');
);

正如上面的博文所述,这是一个相当混乱的解决方案。

摘自博文,包括针对此问题的更简洁的解决方案

这意味着我们每次 想要淡化一个元素,我们需要 删除过滤器属性,它 让我们的代码看起来很乱。

一个简单、更优雅的解决方案将 是包装 .fadeIn() 和 .fadeOut() 具有自定义功能 通过插件接口实现功能 jQuery。该代码将是 相同,但不是直接调用 淡入淡出函数,我们称之为 包装。像这样:

$('#node').customFadeOut('slow', function()  
   //no more fiddling with attributes here
);

那么,你是如何让它工作的呢?只是 在您之后包含以下代码 包括 jQuery 库 添加的功能。

(function($) 
    $.fn.customFadeIn = function(speed, callback) 
        $(this).fadeIn(speed, function() 
            if(jQuery.browser.msie)
                $(this).get(0).style.removeAttribute('filter');
            if(callback != undefined)
                callback();
        );
    ;
    $.fn.customFadeOut = function(speed, callback) 
        $(this).fadeOut(speed, function() 
            if(jQuery.browser.msie)
                $(this).get(0).style.removeAttribute('filter');
            if(callback != undefined)
                callback();
        );
    ;
)(jQuery);

【讨论】:

grr 为什么他们不能把它放在标准的淡入淡出中。刚刚确认它不在 1.3.1 中(至少在不需要额外配置的情况下)所以可能不存在 即使有了这个解决方案,在我看来它仍然看起来很糟糕。很明显有一个小故障。最好尽量淡化彩色框,让文字瞬间出现 从 jQuery 1.9 开始,jQuery.browser 标识符已被弃用。太棒了... :-( 关于如何通过“特征检测”而不是“浏览器检测”来实现上述代码的任何建议?【参考方案3】:

我读过 Firefox 2 使用它自己的文本渲染引擎,只要应用不透明度(至少在 Mac 上)。这有时看起来很奇怪。

我已经用这个 CSS 解决了这个问题(它似乎根本不影响性能)

body 
   -moz-opacity: 0.99;

可能也可以在 IE 中使用。哦,但是你需要使用 IE 的专有 filter 属性。

【讨论】:

【参考方案4】:

一种方法是在 div 上设置背景颜色(通常)为白色。

【讨论】:

这对我来说已经有好几次了。我认为您需要在淡入或淡出的元素上设置背景颜色。【参考方案5】:

好的,这是我有史以来最糟糕的解决方案:

<head>
    <script>
        $(function() 
                $(document.body).fadeIn(0);
        );
    </script>
</head>

<body>

    <script>
        $(document.body).hide();
    </script>

    body text
</body>

立即隐藏正文,并在文档完成时将其淡入。然后你基本上禁用了 cleartype。

哦,请不要让任何人这样做。 或者,如果这对你来说真的很有意义,那么好好测试一下。请记住,在加载整个 DOM 之前,您不会看到任何东西。我还看到了一些奇怪的图形故障。

【讨论】:

【参考方案6】:

我设法提出了一个有点“通用”的解决方案。如果不透明度介于 0 和 1 之间,removeAttribute 不起作用,所以我的两分钱解决方案如下:

把这段代码放在 jQuery animate 方法定义 (jquery.x.x.x.js) 的第一行之后

animate: function( prop, speed, easing, callback ) 
var optall = jQuery.speed(speed, easing, callback);

/*
 * IE rendering anti-aliasing text fix.
 */
// fix START
var old_complete_callback = optall.complete;
optall = jQuery.extend( optall, complete: function()
        if (jQuery.browser.msie) 
            var alpha = $(this).css('opacity');
        if(alpha == 1 || alpha == 0) 
            this.style.removeAttribute('filter');
        
        
        if (jQuery.isFunction(old_complete_callback)) 
        old_complete_callback.call(this);
        
    
);
// fix END

    ...

希望这会有所帮助...

【讨论】:

【参考方案7】:

我设法提出了一个有点“通用”的解决方案。如果不透明度介于 0 和 1 之间,removeAttribute 不起作用,所以我的两分钱解决方案如下:

将此代码放在jQuery animate方法定义(jquery.x.x.x.js)的第一行之后

animate: function( prop, speed, easing, callback ) 
var optall = jQuery.speed(speed, easing, callback);

/*
 * IE rendering anti-aliasing text fix.
 */
// fix START
var old_complete_callback = optall.complete;
optall = jQuery.extend( optall, complete: function()
    if (jQuery.browser.msie) 
        var alpha = $(this).css('opacity');
        if(alpha == 1 || alpha == 0) 
            this.style.removeAttribute('filter');
        
    
    if (jQuery.isFunction(old_complete_callback)) 
        old_complete_callback.call(this);
    
);
// fix END

...

希望这会有所帮助...

【讨论】:

以上是关于IE 正在丢失 ClearType的主要内容,如果未能解决你的问题,请参考以下文章

IE8:禁用cleartype?

为啥我在 IE 9 中丢失了有关 Ajax 请求的 cookie 和会话

为啥在 IE 中替换 setInterval div 后我的容器会丢失其内容?

为啥我的cookie老是丢失

IE 11 第一方会话 cookie 在 iframe 中丢失

事件类型属性在IE-8中丢失