2009-01-04 54 views
14

我遇到了一些非常奇怪的事情!IE正在丢失ClearType

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

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

然后当我做一个淡入这样的:

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

则文本丢失的ClearType在IE浏览器而不是在FF。如果我使用的是切换到淡入淡出的状态,那么一切都很好。

IE是什么,并有任何解决方案,因为它看起来很可怕。 (我对你也许在这一点上理解的ClearType)

回答

24

关于这个问题的快速搜索显示如下:

jQuery fadeIn/fadeOut IE cleartype glitch

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

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

如上博客文章解释说,这是一个相当混乱的解决方案。从博客文章

摘录,包括清洁的解决方案这个问题:

这意味着,每一次我们 要褪色的元素,我们需要 去除过滤器属性, 使我们的代码看起来凌乱。

一个简单的,更优雅的解决方案将是 经由 的jQuery的插件接口的自定义功能 以包裹.fadeIn()和 .fadeOut()函数。该代码将与 完全相同,但不是直接调用 淡入淡出的函数,我们将其称为 包装器。像这样:

$('#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); 
+1

grr为什么他们不能把这个标准淡入。只是确认它不在1.3.1(至少不需要额外配置),所以可能不存在 – 2009-01-26 11:42:59

+2

即使使用此解决方案,在我看来它仍然看起来非常糟糕。其显而易见的是有一个小故障。尽可能尝试淡出彩色框并让文本瞬间显示 – 2009-01-26 12:07:08

2

当褪色适用于IE浏览器,它是(至少通过jQuery)的dxtransform类,这将使其失去任何抗锯齿效果,直到将它它的不透明度又回到了一个。

0

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

我这个CSS打击这(和它似乎并没有在所有影响性能)

body { 
    -moz-opacity: 0.99; 
} 

在IE这可能工作过。哦,但你需要使用IE的专有filter属性。

5

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

-1

确定这里是我有史以来最糟糕的解决方案:

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

<body> 

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

    body text 
</body> 

立即藏起了身体,并在当文件完成消除它。然后,你基本上禁用cleartype。

哦和请不要任何人做这个。或者如果它真的似乎对你有意义,那么测试它。只记得在整个DOM被加载之前你什么也看不到。我也看到了一些奇怪的图形故障。

1

我设法拉了一个'通用'的解决方案。 的removeAttribute如果不透明度为0和1之间,所以我的两分钱溶液如下不起作用:

将这个代码只是jQuery的动画方法定义的第一行之后(jquery.xxxjs)

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 

    ... 

希望这会有所帮助...

1

我设法拉了一个'通用'的解决方案。如果不透明度为0和1之间,所以我的两分钱溶液的removeAttribute如下不起作用:

将这个代码只是jQuery的动画方法定义的第一行之后(jquery.xxxjs)

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 

... 

希望这将有助于...