我试图用这个简单的代码旋转div:

<!DOCTYPE html>

<html>
<head>
<style>
.spinner {
  width: 100px;
  height: 100px;
  margin: auto;
  border-radius: 50%;
  border-bottom: 1px solid #f00;
  animation: rotate-bottom 1s linear infinite;
}

@keyframes rotate-bottom {
  from {
    transform: rotateX(30deg) rotateY(-60deg) rotateZ(0deg);
  }
  to {
    transform: rotateX(30deg) rotateY(-60deg) rotateZ(360deg);
  }
}
</style>
</head>
<body>
<div class="spinner"></div>
</body>
</html>


我使用上面的代码创建了一个jsfiddle:http://jsfiddle.net/zg8vdyns/1/

在Chrome和Internet Explorer上一切正常。红色曲线以无休止,平滑且稳定的循环旋转。但是,firefox(39.0)似乎在渲染动画时遇到问题(Windows和Linux构建)。首先,纺丝线要短得多。其次,动画会间歇性地抖动(不稳定)。这看起来像是Firefox的错误。是否有人对此问题有更深入的了解?

顺便说一句,我知道我应该在“动画”和“关键帧”前加上“ -moz-”,但这不是这里的问题。

最佳答案

您的问题是半像素/亚像素渲染。播放并将border-bottom: 1px solid #f00;更改为border-bottom: 3px solid #f00;表示动画可以,但是呈现方式与其他浏览器引擎完全不同...从此处StackOverflow的另一个答案中:Firefox CSS Animation Smoothing (sub-pixel smoothing)


  每个浏览器的渲染引擎显然是不同的。 Firefox不会在CSS动画上实现抗锯齿效果。这并不能从本质上使它变得更好或更糟,它仅取决于您要设置的动画。例如,线性过渡在Chrome中可能看起来不希望有的模糊。
  
  也就是说,您似乎想要实现的是具有抗锯齿/亚像素平滑过渡。我们无法更改引擎的渲染方式,但是我们可以操纵动画以使最终用户看起来更柔和。




但是,与链接中答案提供的方法不同,在您的情况下,我认为有一种更简单的方法可以使渲染更加等效:http://jsfiddle.net/zg8vdyns/7/

添加border-left: 1px solid rgba(255, 0, 0, 0.7);会“强制”渲染FireFox自然不会产生的半像素/子像素。

更新:

@ joshin855在下面也给出了一个很好的答案:添加属性background:rgba(255,255,255,0.01);也会有点“强制”半像素/子像素的渲染。您的解决方案非常好...它仅具有实心圆的缺点,根据情况可能不适合,但线动画似乎比我的解决方案中的效果更等效...因此,这也可能是一个不错的选择解。

07-24 09:50
查看更多