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

Posted

技术标签:

【中文标题】使用 jQuery 为文本的不透明度设置动画时更正 IE Cleartype/Filter 问题【英文标题】:Correcting IE Cleartype/Filter Problem when Animating Opacity of Text with jQuery 【发布时间】:2011-06-01 15:05:16 【问题描述】:

大家好,我遇到了一个 IE 问题,这似乎是一个众所周知/常见的错误。我有一个在 jQuery 中构建的图像幻灯片,它在其他浏览器中可以完美运行。但是,在 IE 中,一旦幻灯片放映一次,我就遇到了文本被消除锯齿的问题。也就是说,如果幻灯片中有三张图片,那么当这三张图片中的每一张第一次出现时,文本就会正确呈现。但是,一旦幻灯片放映循环播放文本,就会消除锯齿。

我已经阅读了这方面的内容,并浏览了无数关于如何最好地纠正它的博客。我遇到的最常见的解决方法是在不透明度达到 100% 时删除过滤器属性,如下所示:

$('#sample').animate( opacity:1.0, 500,
function() 
    $(this).css('filter','');

);

这似乎应该有效。但由于我仍然不是 jQuery 大师,我很难找到应该在我的代码中实现它的位置。我尝试过的任何地方,要么停止幻灯片放映,要么将其炸毁,并导致所有图像同时在页面上下显示。

以下是我正在使用的代码,非常感谢你们能给我的任何帮助,为我指明正确的方向。谢谢!

   if(options.fade === true) 

 $("ul",obj).children().css(
 'width' : $("ul",obj).children().width(),
 'position' : 'absolute',
 'left' : 0

 );

 for(var i = $("ul",obj).children().length -1, y = 0; i >= 0; i--, y++) 
 $("ul",obj).children().eq(y).css('zIndex', i + 99999);

 


 fade();
 

 function fade() 

 setInterval(function() 
  $("ul",obj).children(':first').animate( 'opacity' : 0, options.speed, function()       
  $("ul",obj)
    .children(':first')
    .css('opacity', 1)
    .css('zIndex', $("ul",obj).children(':last').css('zIndex') - 1)
    .appendTo("#db-slider-ul");   

     );


 , options.pause);
     

);

【问题讨论】:

【参考方案1】:

将此添加到新的 js 文件中,例如 jquery.fadefix.js:

jQuery.fn.fadeIn = function(speed, callback)  
    return this.animate(opacity: 'show', speed, function()  
        if (jQuery.browser.msie)  
            this.style.removeAttribute('filter');  
        if (jQuery.isFunction(callback)) 
            callback();  
    ); 
; 

jQuery.fn.fadeOut = function(speed, callback)  
    return this.animate(opacity: 'hide', speed, function()  
        if (jQuery.browser.msie)  
            this.style.removeAttribute('filter');  
        if (jQuery.isFunction(callback)) 
            callback();  
    ); 
; 

jQuery.fn.fadeTo = function(speed,to,callback)  
    return this.animate(opacity: to, speed, function()  
        if (to == 1 && jQuery.browser.msie)  
            this.style.removeAttribute('filter');  
        if (jQuery.isFunction(callback)) 
            callback();  
    ); 
;

并在页面中的主 jquery 脚本之后包含此文件。

<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery.fadefix.js"></script>

Fade 现在可以在 IE 中按预期工作。

【讨论】:

【参考方案2】:

更容易做到这一点:

$("#sample").fadeIn(1000,function()this.style.removeAttribute("filter"););

$("#sample").fadeOut(1000,function()this.style.removeAttribute("filter"););

$("#sample").show(1000,function()this.style.removeAttribute("filter"););

$("#sample").hide(1000,function()this.style.removeAttribute("filter"););

【讨论】:

【参考方案3】:

遇到了同样的问题。我绞尽脑汁想弄清楚为什么这个解决方案对其他人有效,但对我无效。

我找到的解决方案是将“过滤器”添加到 animate() 函数中。所以,以你原来的函数为起点:

$('#sample').animate('opacity':1.0,'filter':'',500);

这对我来说非常有效。希望这可以帮助像我一样一直在谷歌搜索的其他人。

【讨论】:

以上是关于使用 jQuery 为文本的不透明度设置动画时更正 IE Cleartype/Filter 问题的主要内容,如果未能解决你的问题,请参考以下文章

Jquery在缩略图上设置不透明度动画,除了选中的那个

jQuery 中的不透明度更改动画不起作用

jquery animate:一一改变元素的不透明度

如何为 DropShadowEffect 的不透明度设置动画?

如何为 div 背景的不透明度设置动画?

如何在 jQuery 中使用 css font-weight 属性为文本设置动画?正常到粗体