11

情况:

查看 jsFiddle

在 a 里面div我有一个图像,后面是一个font-weight900 的文本。在我本地托管的环境中,我使用的是自定义字体,但对于上面的小提琴,我选择了“非常时尚”的 Comic Sans 来说明我的观点。在发生任何事情之前,我将整个 div 的不透明度设置为 0.7。但是,在将鼠标悬停在 上时div,我希望所有内容的不透明度都达到完全不透明度。

问题:

我注意到,仅在 Webkit 浏览器中(在 Chrome 上比在 Safari 上更明显),在div标签上下悬停时,文本的权重似乎会发生变化。实际上,文本的重量当然没有任何变化。但是,仔细查看后,您会看到文本仅在悬停时以所需的重量出现,而不是在非悬停状态下。

我做过的事情:

  • 我已经在所有最新版本的 Chrome、Firefox 和 Safari 中对此进行了测试。
  • 我目前正在新的 MacBook Pro 上对此进行测试,就我而言,它是一个视网膜屏幕。然而,我旁边的同事在她的 iMac(非视网膜显示屏)上测试了小提琴,却发现问题仍然很明显。
  • 也许我只是疯了,但我觉得这实际上可能是 webkit 浏览器选择渲染具有不同不透明度的元素的方式。再说一次,这可能只是我试图避免承认我做错了什么。

自然地,我认为我可以用 Comic Sans 来减轻情绪。这是帮助解释问题的屏幕截图:

拥抱Comic Sans!

4

2 回答 2

24

这不是不透明度本身的问题(实际上,在@Zoltan 的示例中将其转回 1 对我来说没有任何改变)。

问题在于过渡,webkit 可以使用两种抗锯齿模式:

  1. 子像素(默认设置,但在动画、过渡或变换期间不受支持)或
  2. 灰度

这意味着当使用亚像素抗锯齿渲染元素并对其应用动画时,webkit 会在动画期间临时切换到灰度,然后在完成后返回亚像素。

鉴于 subixel 抗锯齿会导致字体稍重,您会得到不需要的伪影。

要解决此问题,请将其添加到您的 css 中:

html {
    -webkit-font-smoothing: antialiased;
}

这会强制灰度抗锯齿和所有文本,您不会看到切换。

(最终结果:http: //jsfiddle.net/ErVYs/9/

于 2012-08-25T09:57:49.563 回答
13

一个可能的解决方案是使不透明度过渡到1,但是.999- http://jsfiddle.net/ErVYs/2/

div {
    width: 200px;
    text-align: center;
    opacity: 0.7;
    transition: opacity ease-in 0.25s;
    -webkit-transition: opacity ease-in 0.25s;
    -moz-transition: opacity ease-in 0.25s;
    -o-transition: opacity ease-in 0.25s;
}

div:hover {
    opacity: .999;
}
于 2012-07-09T20:57:08.037 回答