CSS转换效果在Chrome中使图像模糊/移动图像1px?

172

我有一些CSS,当鼠标悬停时,CSS过渡效果将移动一个div。

问题在于,正如你在示例中所看到的那样,translate过渡效果会产生可怕的副作用,使得div中的图像向下/向右移动1px(可能还会微微缩小),以至于它看起来不协调、模糊不清...

从试错的过程来看,这个故障似乎在整个悬停效果应用期间都存在,并且只在translate过渡效果移动div时才会出现(当去除box shadow和opacity时,也不会对错误产生影响)。

该问题似乎仅在页面具有滚动条时发生。因此,只有一个div实例的示例是正常的,但一旦添加了更多相同的div并且页面因此需要滚动条,问题就再次出现...


1
我在OSX上使用Chrome 27,一切正常。我相信当内容被放入图层时,在动画期间它会被转换为位图,在旧版本/旧显卡上这看起来并不好。尝试使用更新的版本,看看是否已经解决了这个问题。 - Rich Bradshaw
Chrome 25 OS X上一切正常。顺便说一下:我建议使用不同的方法来实现背景渐变纹理,而不是一个300KB的图像! - Paolo
2
当动画由GPU处理时,问题就出现了,似乎位图的圆角有点偏差。在Canary中重现,但如果关闭GPU加速,则正常工作。 - vals
你可以在每一帧尝试这个解决方案... https://dev59.com/X14c5IYBdhLWcg3w7t7E#42256897 - Miguel
我发现这个问题只会在浏览器缩放时出现。你可以使用CTR+0 / CMD+0重置。 - Nathan Redblur
显示剩余2条评论
14个回答

2

尝试使用 filter: blur(0);

这对我有用


对我来说也有效,Chrome 63、64和Vivaldi 1.13。 - GTCrais

1
我遇到了类似的问题,文字模糊,但只影响接下来的 div。不知何故,在我进行变换的那个 div 后面的下一个 div 会变得模糊。我尝试了这个帖子中推荐的所有方法,但都没有效果。对我来说,重新排列我的 div 解决了问题。我将使下一个 div 模糊的 div 移动到了父 div 的末尾。如果有人知道原因,请告诉我。
#before
<header class="container">
      <div class="transformed div">
          <span class="transform wrapper">
            <span class="transformed"></span>
            <span class="transformed"></span>
          </span>
       </div>
       <div class="affected div">
       </div>
     </header>

#after
<header class="container">
   <div class="affected div">
   </div>
  <div class="transformed div">
      <span class="transform wrapper">
        <span class="transformed"></span>
        <span class="transformed"></span>
      </span>
   </div>

 </header>

0
filter: blur(0)
transition: filter .3s ease-out
transition-timing-function: steps(3, end) // add this string with steps equal duration

在设置过渡持续时间的值为.3s,与过渡时间步骤.3s相等的情况下,我得到了帮助。


0

对我而言,在使用关键帧动画中,只有在 Chrome 浏览器(Windows 和 Mac)中通过“transform”进行动画处理时才会出现模糊。对我而言,“-webkit-optimize-contrast”设置只能部分地帮助解决这个问题。为了获得最佳效果,我还必须使用一个“神奇值”来对 scaleX 进行调整(稍微大于 1 而不是等于 1)。

以下是可行的代码:

img {
  image-rendering: -webkit-optimize-contrast;
}

@keyframes scale-in-left {
  0% {
    transform: scaleX(0);
    opacity: 0;
  }
  100% {
    transform: scaleX(1.000001);
    opacity: 1;
  }
}

这是未能正常工作的代码(导致Chrome中图像模糊):
@keyframes scale-in-left {
  0% {
    transform: scaleX(0);
    opacity: 0;
  }
  100% {
    transform: scaleX(1);
    opacity: 1;
  }
}

最终,“可用”的代码消除了大部分模糊,但并非全部。Safari和Firefox在没有任何特殊设置的情况下仍然更清晰。
还要注意,只需调整浏览器窗口大小即可消除不必要的模糊,这可能表明某些原因导致Chrome无法执行最后的渲染过程(?)。

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