为什么在Retina屏幕上,使用Webkit/Chrome时,模糊(0)不能去除所有文本模糊效果?

6

我最近发现WebKit浏览器(至少在OSX下)存在一种奇怪的行为,解决起来比我想象的要花费更长的时间!

本质上:在元素上设置 filter: blur(0) (或供应商特定的 -webkit-filter)应该意味着不对元素应用任何形式的模糊。

然而,当分配blur(0)或指定单位的零(即:blur(0px))时,WebKit仍会使元素模糊。

我已经组合了一个快速的演示,以证明这一点: http://jsfiddle.net/f9rBE/

这显示了三个包含文本的相同 div(没有自定义字体):

<div class="no-blur">
    <p><strong>This has absolutely nothing assigned</strong></p>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam facilisis orci in quam venenatis, in tempus ipsum sagittis. Suspendisse potenti. Donec ullamcorper lacus vel odio accumsan, vel aliquam libero tempor. Praesent nec libero venenatis, ultrices arcu non, luctus quam. Morbi scelerisque sit amet turpis sit amet tincidunt. Praesent semper erat non purus pretium consequat. Aenean et iaculis turpis. Curabitur diam tellus, consectetur non massa et, commodo venenatis metus.</p>
</div>

其中一个没有任何样式,而另外两个有blur(0)blur(0px)的样式:

.no-blur{}
.zero-px-blur{
    -webkit-filter: blur(0px);
    -moz-filter: blur(0px);
    -o-filter: blur(0px);
    -ms-filter: blur(0px);
    filter: blur(0px);
}

.zero-blur{
    -webkit-filter: blur(0);
    -moz-filter: blur(0);
    -o-filter: blur(0);
    -ms-filter: blur(0);
    filter: blur(0);
}

如果您在Safari或Chrome中查看,底部两个会模糊:
几点值得注意的是:
- 这种意外模糊也会发生在iOS7设备上的Safari(iPhone和iPad)上; - 它也会发生在OSX下的Chrome和Safari上; - 它似乎不会发生在非Retina苹果硬件上的Chrome和Safari中; - 在OSX中的FireFox下不会发生。
当然,filter:blur在Firefox中还没有得到支持,因此很难判断我所看到的行为是故意的/预期行为,还是这是Webkit中的一个错误?
我最终得出结论,使用blur(none)可以达到所需的效果(即删除所有模糊效果),但我困惑于为什么使用零不具有相同的效果,因为在其他滤镜示例(例如:filter:grayscale)中,可以仅使用零而不是none关键字来重置它。
为什么会这样呢?

2
你的例子中没有模糊的地方,在使用OSX和Chrome 31.0版本时。 - koningdavid
@koningdavid 抱歉,我刚刚编辑了问题以获得更清晰的描述:这是在MacBook Pro上使用视网膜屏幕(以及视网膜iPhone / iPad)。但我无法验证它是否仅限于视网膜显示器的问题! - johnkavanagh
1
可能是!这里的屏幕正常。 - koningdavid
在Retina iOS设备上,blur(0)和blur(0px)会应用一些模糊效果,但与非模糊相比,它们看起来是相同的。看起来,模糊滤镜的基准不是“没有模糊”。filter: grayscale 0控制滤镜的alpha通道,但模糊滤镜是“原地”应用的。这是我最好的猜测! - David Hariri
我的Macbook Pro带Retina显示屏也出现了模糊问题。在Safari和最新版的Chrome中都有这个问题。但是在我的Windows桌面上通过Chrome/Safari查看Retina时,没有任何模糊。似乎在OSX的Chrome/Safari下应用了一些模糊效果,即使与OSX中的抗锯齿无关(已测试)。 - Vaclav Kusak
1
我猜它的工作方式有点像当你设置:text-shadow:0 0;时,它会在引擎中触发某些东西。看看这个:http://codepen.io/anon/pen/cykbC。这有点像给块元素添加width:100%,除非你有理由,否则不应该这样做。同样适用于任何CSS规则,将值重置为零和none并不相同。只是我的看法 :) - G-Cyrillus
3个回答

5

我曾经也遇到过这个问题,因为我需要进行一个滤镜转换,所以我需要它变成零而不是none。实际上,这是一个已知的WebKit bug,只影响视网膜屏幕,无论是@2x图像、文本还是其他任何东西。

要使其正常工作,你需要添加-webkit-transform: translateZ(0);

就像魔术一样。但别听我的,你可以在这里检查它:http://jsbin.com/OnebuKU/2/edit


谢谢这个,它对我很有帮助;也许你应该看一下我的答案。 - gabrielmaldi

3
作为jaicab,我也需要进行滤镜转换,但使用translateZ(0)会导致我的一些内容被隐藏。我发现在使用blur(0)时,-webkit-backface-visibility:hidden;可以去除模糊,并且副作用较小(在我的情况下,保持内容可见)。 http://jsbin.com/OjeSAHeg/1/edit

对我有用,谢谢! - Chris Gunawardena
@ChrisGunawardena 很高兴我能帮到你! - gabrielmaldi

1

try this:

#the_element_that_you_applied_translate_to {
  -webkit-filter: blur(0.000001px);
}

考虑到被接受的答案可以在不使用hackish的情况下提供帮助,这真的一点也不有用。 - Johannes Jander
答案对我没用,所以我考虑分享它。由于这是一个浏览器的 bug,它可能会帮助你,也可能不会,但值得一试。 - Iman Mohamadi
1
我投了赞成票。这对我起作用了。谢谢Iman。以下是它如何为我工作的方式。我正在使用translateZ(35px),这使字体模糊。因此,这个模糊滤镜使文字恢复正常。 - wp student

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接