Html 带有平移变换的CSS关键帧动画捕捉到IE 10和Firefox中的整个像素

Html 带有平移变换的CSS关键帧动画捕捉到IE 10和Firefox中的整个像素,html,css,css-animations,css-transforms,Html,Css,Css Animations,Css Transforms,在css关键帧动画中使用translate 2d transform设置元素位置动画时,IE 10和Firefox都会将元素捕捉到整个像素 Chrome和Safari则不然,这在为细微动作设置动画时看起来要好得多 动画通过以下方式完成: @keyframes bobbingAnim { 0% { transform: translate(0px, 0px); animation-timing-function:ease-in-out } 50% {

在css关键帧动画中使用translate 2d transform设置元素位置动画时,IE 10和Firefox都会将元素捕捉到整个像素

Chrome和Safari则不然,这在为细微动作设置动画时看起来要好得多

动画通过以下方式完成:

@keyframes bobbingAnim {
   0% {
       transform: translate(0px, 0px);
       animation-timing-function:ease-in-out
   }

   50% {
       transform: translate(0px, 12px);
       animation-timing-function:ease-in-out
   }

   100% {
       transform: translate(0px, 0px);
       animation-timing-function:ease-in-out
   }
}
这里有一个例子来说明我的意思:

只要在Chrome和IE 10(或Firefox)中打开它,你就会注意到运动平滑度的不同

我意识到可能有很多因素会影响这种行为,比如元素是否以硬件加速绘制

有没有人知道一种修复方法,可以强制浏览器总是在子像素上绘制元素?

我发现了这个类似的问题,但答案是使用平移变换设置动画,这正是我正在做的: .

更新: 在玩了一会儿之后,我找到了一个Firefox的修复程序,但它在IE10中没有做任何事情。诀窍是稍微缩小元素的比例,并在Z轴上使用具有1px偏移的translate3d:

@keyframes bobbingAnim {
   0% {
       transform: scale(0.999, 0.999) translate3d(0px, 0px, 1px);
       animation-timing-function:ease-in-out
   }

   50% {
       transform: scale(0.999, 0.999) translate3d(0px, 12px, 1px);
       animation-timing-function:ease-in-out
   }

   100% {
       transform: scale(0.999, 0.999) translate3d(0px, 0px, 1px);
       animation-timing-function:ease-in-out
   }
}

不可能有半个像素的运动,没有这样的事情


你的问题是动画的速度和平滑度,而不是“像素捕捉”。

@Nemanja是正确的。你会发现,如果你调整速度,你会看到更好的效果,这在css动画中非常典型。此外,在这种情况下,如果启用硬件加速,也没有什么区别。我整理了一下代码,运行起来没有任何问题,我没有ie10;然而,我有11个。如果translateZ的第二个变换没有在10秒内运行,您可能需要删除它

body {
    background-color: #ccc;
}

.bobbing {
    position: absolute;  
    animation: bobbingAnim ease-in-out .5s infinite;
    -moz-animation: bobbingAnim ease-in-out .5s infinite;
    -webkit-animation: bobbingAnim ease-in-out .5s infinite;    
}

.bobbing.text {
    font-size: 50px;
    color: #000;
    left: 30px;
    top: 30px;
}

.bobbing.image {
    left: 30px;
    top: 150px;
    background: url(http://placehold.it/300x100/aa0000&text=Bobbing+image) 50% 50% no-repeat;
    width: 310px;
    height: 110px;
}

@keyframes bobbingAnim {
   50% {
       transform: translate(0, 12px) translateZ(0);       
   }
}

@-webkit-keyframes bobbingAnim {
   50% {
       -webkit-transform: translate3d(0, 12px, 0);       
   }
}

@-moz-keyframes bobbingAnim {
   50% {
       -moz-transform: translate3d(0, 12px, 0);       
   }
}
我喜欢你的问题! 注意firefox和IE10中的像素管理单元做得很好

我在不久前研究过这个问题,我建议您查看GSAP论坛,因为它们包含很多关于网络动画的有用信息

这里有一个关于

您需要做的是向元素添加最小旋转。因此IE和Firefox将以不同的方式重新绘制它-这将永远停止像素捕捉:)

Tyr这是:

@keyframes bobbingAnim {
  0% {
   transform: translate(0px, 0px) rotateZ(0.001deg);  
   animation-timing-function:ease-in-out
  }

  50% {
    transform: translate(0px, 12px) rotateZ(0.001deg);
    animation-timing-function:ease-in-out
  }

  100% {
   transform: translate(0px, 0px) rotateZ(0.001deg);
   animation-timing-function:ease-in-out
  }
}

嗯…我在IE10上测试了你的原始版本,它似乎工作得很好!(应用修复会使IE 10再次变得不平滑。)你确定原始版本(没有“缩放”)在IE 10上不平滑吗?是的,我确定。对我来说,他们中没有一个是十全十美的。感谢您的报告,它不是一贯的“坏”在IE 10。我想知道决定这种行为的因素是什么。事实上,你是对的。我的第一个评论是不准确的。我一直在IE 10中观察到这种行为,这让我感到困惑:当我加载JSFIDLE并启动动画时,它确实不是平滑的。在我按下JSFIDLE中的“Run”(不做任何更改)之后,它会再次加载,这次动画是平滑的!?我希望
document.msCSSOMElementFloatMetrics=true
(在IE10中启用亚像素精度渲染)可以做到这一点,但它没有成功实现。我想我放弃了:(奇怪的是,在IE 10中,我第一次使用你的JSFIDLE加载时它是平滑的。Chrome是平滑的,Firefox是不稳定的。听说过抗锯齿吗?有没有画过曲线?没有旋转0度或180度的线?像素捕捉肯定是个问题:/像素捕捉的一个很好的例子: