IE7 和 IE8 中的 CSS 渐变导致文本出现别名

Posted

技术标签:

【中文标题】IE7 和 IE8 中的 CSS 渐变导致文本出现别名【英文标题】:CSS gradients in IE7 & IE8 is causing text to become aliased 【发布时间】:2011-01-31 00:40:00 【问题描述】:

我正在尝试在包含一些文本的 div 中使用 CSS 渐变。使用 Gecko 和 Webkit,文本显示良好。在 IE7 和 IE8 中,文本显示为别名(锯齿状)。

我看到这个博客说:“我们决定在使用任何 DXTransform 的元素上禁用 ClearType”。

IE 博客: http://blogs.msdn.com/ie/archive/2006/08/31/730887.aspx

那是在 2006 年; 3.5 年后,我认为这个错误会被修复,但事实并非如此。有没有办法在 IE8 中做到这一点,而无需在 div 中填充重复的背景图像?

这是我的意思的一个例子。

<style>
    div
        height:     50px; 
         background: -moz-linear-gradient(top, #fff, #ddd);
         background: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#ddd));
         filter:     progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffffff, endColorstr=#ffdddddd);
    
</style>

<div>Hello World</div>
<p>Normal text</p>

在 IE 中,div 中的文本有别名(锯齿状),而段落中的文本则没有。

任何不涉及图像的解决方案将不胜感激。

【问题讨论】:

我不知道有任何解决方案,正如您所发现的那样,多年来它一直是 IE 的一个已知问题。 【参考方案1】:

这可能算不上优雅(或有效)的解决方案,但是在 IE 中使用 Cufón 怎么样?

【讨论】:

【参考方案2】:

是的,IEx 有问题。

尝试使用纯色背景:

/*replace #ccc with the color you want*/
background: url(images/gradient-image.png) top repeat-x #ccc 

现在,不需要使用表达式“...填充重复的背景图像”,因为使用背景图像并重复它没有任何问题,我们应该庆幸我们不能只能这样做,但我们可以在 X 和 Y 中重复它。

当然,你想让你的重复背景图像尽可能高效,所以让它变小/变薄(取决于你的设计)并使用它,请放心,你没有做错任何事情或违反任何标准或最佳实践。

【讨论】:

呃,你的 CSS 示例有点乱——但你的情绪很好。 一团糟?就在一条线上,效率更高。我不再单独写了,那个方法占用了太多空间,上下滚动很累。 我所说的混乱是指“完全无效的 CSS 语法,在任何浏览器中都不起作用”。【参考方案3】:

对于这个问题没有好的解决方案。

更糟糕的是:progid:DXImageTransform.Microsoft.gradient 有很多错误,因此鼠标事件(悬停、点击等)会通过它向右传递——点击这样的元素会触发 单独 em> 单击恰好位于其后面位置的任何元素。当心!

无论如何,您最好开始考虑您认为可以接受哪些后备/解决方法/NastyHacks。

以下是我脑海中的一些想法 - 按照我的个人喜好排列:

    只需在 IE 中退回到一个普通的 background-color 并继续你的生活。 (确保将 background 规则放在 first 上,以便 FF 和 Webkit 安全地覆盖/忽略它。)

    在 IE 中使用 background-image。 (再次将 CSS 规则放在 first

    继续使用渐变 hack,简单地“接受”并接受 IE 的锯齿状文本。

    使用 javascript(或 IE 专有的 CSS expression() 语法)注入一个空元素,对其应用渐变并将其置于文本后面。

    div 
      background: -moz-linear-gradient(top, #fff, #ddd);
      background: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#ddd));
      behaviour: expression( jQuery(this).wrapInner('<div class="ie-wrap"/>').prepend('<div class="ie-gradient"/>'); this.runtimeStyle.behaviour='none'); /* disable repeat runs */
      position: relative;
    
    div div.ie-wrap 
      position: relative;
    
    div div.ie-gradient 
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: expression( this.runtimeStyle.height=this.parentNode.clientHeight+"px" );
      filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#ffffffff, endColorstr=#ffdddddd);
    
    

    (警告:上面的代码是未经测试的一堆废话。可能无法正常工作。)

    继续使用渐变 hack 并使用 Cufon 将锯齿状文本替换为 VML 渲染文本。 (假设您的网站使用的字体允许嵌入字体。)

【讨论】:

【参考方案4】:

您可以尝试使用 IE css 3 html 组件,例如 PIE (http://css3pie.com,),它在渲染渐变方面做得相当不错。 (虽然这本质上是使用 javascript)

【讨论】:

这实际上是 CSSpie 的失败 :( 这就是把我带到这里的原因。【参考方案5】:

我有一种情况,我希望文本区域的背景是某些颜色,水平渐变为白色,并在 CSS 中由十六进制定义。我想避免制作彩色背景图像,以防我公司的非开发人员想要添加仅包含十六进制的新颜色。

我找到的解决方案是将白色渐变的 24 位 PNG 设置为透明设置为我正在制作的区域的宽度。

然后我使用这个仅限 IE 的 hack 来让 CSS 呈现我选择的背景颜色,该颜色逐渐变为白色:

background /*\**/: #CCCED4 url('/white_to_transparent.png') repeat-y top left\9;

(hack 可以改进,但它对我有用,包括 IE9)

【讨论】:

【参考方案6】:

用 DIV 包装内容,然后将其添加到 DIV 的 css 样式中...

position: relative;

http://cookbooks.adobe.com/post_IE8_clearType_fix_when_using_filters-16676.html

【讨论】:

【参考方案7】:

我找到了另一种廉价(有点不透明)的解决方案。当包装文本节点并将每个元素设置为相对位置时,文本再次变为反锯齿。不要问为什么...

假设:

<html>
<head>
  <title>IE8 filter problem causing jagged fonts</title>
  <style>
    html, body, div, span, b, i, ul, li, h1, h2, h3 ... to be continued 
      position: relative;
    
    .gradient 
      filter:
        progid:DXImageTransform.Microsoft.gradient(startColorStr='#ffffff', EndColorStr='#e6e6e6');
    
  </style>
</head>
<body>
  <div class="gradient">
    <div>I am wrapped, therefore not jagged</div>
  </div>
</body>
</html>

希望对任何人都有帮助。在这种情况下,没有必要使用背景图片或衍生产品。

jsfiddle 中的工作示例:http://jsfiddle.net/SLZpE/2/

【讨论】:

以上是关于IE7 和 IE8 中的 CSS 渐变导致文本出现别名的主要内容,如果未能解决你的问题,请参考以下文章

CSS IE6,IE7,IE8的阴影和渐变填充

IE6IE7IE8的阴影和渐变填充

在 IE9 中使用 CSS3 PIE 的线性渐变不起作用,IE8 可以

IE7/IE8 中的 jQuery FadeIn 文本:动画期间的文本别名

如果存在背景颜色,IE8 渐变过滤器将不起作用

如何使用有效的 CSS 定位 IE7 和 IE8?