Firefox CSS动画平滑(子像素平滑)

Rya*_*yan 14 css firefox animation css-animations

我正在创建一个CSS关键帧动画,让一个元素看起来像是随便/缓慢地浮动一点.它嵌套在父母身上,一个使用translateX()慢慢地向左和向右移动,一个使用translateY()慢慢地和独立地上下移动它.

Chrome和Safari完美呈现,让它逐渐摇摆.它可以平滑动画(可能使用子像素平滑?),使一切看起来都非常流畅.然而,Firefox逐像素地为它设置动画,因此您可以看到它在每个像素处跳跃,而不是平滑地摇摆.

查看Chrome和FireFox中的JSFiddle来查看差异:http://jsfiddle.net/gonygdfz/6/

有没有办法让FireFox顺利渲染,而不是让它逐像素地跳跃?它在实际应用中非常引人注目.

标记:

<div id="parent">
    <div id="move-x">
        <div id="move-y">
            <div id="child"></div>
        </div>
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

CSS:

#parent {
    width: 400px;
    height: 326px;
    background-color: yellow;
    background: url(http://paint.net.amihotornot.com.au/Features/Effects/Plugins/Render/Grid_CheckerBoard_Maker/Grid_CheckerBoard_Maker.Paint.NET.001.png) top center repeat;
}

#child {
    position: absolute;
    top: 75px;
    left: 150px;
    width: 100px;
    height: 100px;
    background-color: black;
    animation: range-y 10s infinite ease;
}

#move-x { 
    animation: range-x 10s infinite ease; 
    -webkit-animation: range-x 10s infinite ease;
}
#move-y { 
    animation: range-y 15s infinite ease; 
    -webkit-animation: range-y 15s infinite ease;
}

@keyframes range-x {
  0%   { 
    transform: translateX(0); 
  }
  30% {
    transform: translateX(-8px); 
  }
  50% {
    transform: translateX(1px); 
  }
  65% {
    transform: translateX(6px); 
  }
  80% {
    transform: translateX(0px); 

  }
  89% {
    transform: translateX(-3px); 
  }
  100% {
    transform: translateX(0); 
  }
}


@keyframes range-y {
  0%   { 
    transform: translateY(0); 
  }
  20% {
    transform: translateY(13px); 
  }
  35% {
    transform: translateY(-1px); 
  }
  70% {
    transform: translateY(-14px); 
  }
  90% {
    transform: translateY(2px); 
  }
  100% {
    transform: translateY(0); 
  }
}


@-webkit-keyframes range-x {
  0%   { 
    transform: translateX(0); 
  }
  30% {
    transform: translateX(-8px); 
  }
  50% {
    transform: translateX(1px); 
  }
  65% {
    transform: translateX(6px); 
  }
  80% {
    transform: translateX(0px); 

  }
  89% {
    transform: translateX(-3px); 
  }
  100% {
    transform: translateX(0); 
  }
}


@-webkit-keyframes range-y {
  0%   { 
    transform: translateY(0); 
  }
  20% {
    transform: translateY(13px); 
  }
  35% {
    transform: translateY(-1px); 
  }
  70% {
    transform: translateY(-14px); 
  }
  90% {
    transform: translateY(2px); 
  }
  100% {
    transform: translateY(0); 
  }
}
Run Code Online (Sandbox Code Playgroud)

Dre*_*TeK 11

每个浏览器的渲染引擎明显不同.Firefox没有对CSS动画实现抗锯齿效果.这本身并不会使它变得更好或更糟,它只取决于你的动画效果.例如,线性过渡在Chrome中可能会出现不必要的模糊.

这就是说你想要实现的是具有抗锯齿/子像素平滑过渡.我们无法改变引擎呈现的方式,但我们可以操纵动画使最终用户看起来更柔和.


一切都不会丢失

我已经修改了你的答案,并在原件旁边呈现了一个更平滑的版本.在Firefox中查看时,这应该更柔和.

点击比较

用于此效果的技巧:

  • 线性过渡而不是轻松.
  • 动画对象上的框阴影.(软化边缘有助于创造假AA效果).
  • 旋转对象.添加最小的旋转有助于更好地利用渲染引擎.†

CSS

#parent {
    width: 50%;
    float:left;
    height: 326px;
    background-color: yellow;
    background: url(http://paint.net.amihotornot.com.au/Features/Effects/Plugins/Render/Grid_CheckerBoard_Maker/Grid_CheckerBoard_Maker.Paint.NET.001.png) top center repeat;
}
#child {
    position: absolute;
    top: 75px;
    left: 150px;
    width: 100px;
    height: 100px;
    background-color: black;
    box-shadow:0 0 1px rgba(0,0,0,0.7);
    animation: range-y 10s infinite linear;
    -webkit-animation: range-y 10s infinite linear;
}
#move-x { 
    animation: range-x 10s infinite linear; 
    -webkit-animation: range-x 10s infinite linear;
}
#move-y { 
    animation: range-y 15s infinite linear; 
    -webkit-animation: range-y 15s infinite linear;
}
@keyframes range-x {
    0%   {transform: translateX(0);}
    30%  {transform: translateX(-8px) rotate(0.02deg);}
    50%  {transform: translateX(1px) rotate(0deg);}
    65%  {transform: translateX(6px) rotate(0.02deg);}
    80%  {transform: translateX(0px) rotate(0deg);}
    89%  {transform: translateX(-3px) rotate(0.02deg);}
    100% {transform: translateX(0) rotate(0deg);}
}
@keyframes range-y {
    0%   {transform: translateY(0);}
    20%  {transform: translateY(13px) rotate(0.02deg);}
    35%  {transform: translateY(-1px) rotate(0deg);}
    70%  {transform: translateY(-14px) rotate(0.02deg);}
    90%  {transform: translateY(2px) rotate(0deg);}
    100% {transform: translateY(0) rotate(0.02deg);}
}
@-webkit-keyframes range-x {
    0%   {transform: translateX(0);}
    30%  {transform: translateX(-8px) rotate(0.02deg);}
    50%  {transform: translateX(1px) rotate(0deg);}
    65%  {transform: translateX(6px) rotate(0.02deg);}
    80%  {transform: translateX(0px) rotate(0deg);}
    89%  {transform: translateX(-3px) rotate(0.02deg);}
    100% {transform: translateX(0) rotate(0deg);}
}
@-webkit-keyframes range-y {
    0%   {transform: translateY(0);}
    20%  {transform: translateY(13px) rotate(0.02deg);}
    35%  {transform: translateY(-1px) rotate(0deg);}
    70%  {transform: translateY(-14px) rotate(0.02deg);}
    90%  {transform: translateY(2px) rotate(0deg);}
    100% {transform: translateY(0) rotate(0.02deg);}
}
Run Code Online (Sandbox Code Playgroud)

最后的话

您仍然可以通过某种方式调整效果以满足您的要求.它并不完美,但我希望它有助于软化实际动画的最终效果.


†:可在此处找到此技术的说明.

  • @ThePragmatick至少可以说是一个疯狂的假设。我已经使用这种技术几年了。无论那是我最初从不知道的地方学到的东西,都是很久以前的事了。但是是我花了两个小时试图为op制作一个工作演示,其他人都不愿意提供帮助。 (2认同)