Я создаю анимацию ключевого кадра CSS, чтобы элемент выглядел так, как будто он случайно/медленно плавает вокруг. Он вложен в родителях, который использует translateX(), чтобы медленно перемещать его влево и вправо, и тот, который использует translateY(), чтобы медленно и независимо перемещать его вверх и вниз.
Chrome и Safari отлично справляются с этим, давая ему постепенное колебательное движение. Он сглаживает анимацию (возможно, сглаживание подпикселей?), Так что все выглядит очень гладко. Однако Firefox оживляет пиксель за пикселем, поэтому вместо того, чтобы плавно качаться, вы можете увидеть, как он прыгает на каждом пикселе.
Посмотрите JSFiddle в Chrome и FireFox, чтобы увидеть разницу: http://jsfiddle.net/gonygdfz/6/
Есть ли способ сделать FireFox рендерить это плавно, а не прыгать пиксель за пикселем? Это очень заметно в самом приложении для этого.
Разметка:
<div id="parent">
<div id="move-x">
<div id="move-y">
<div id="child"></div>
</div>
</div>
</div>
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);
}
}