Кажется, что IE 10 и Firefox привязывают элементы к целым пикселям при анимации их позиции, используя преобразование 2d в анимации ключевого кадра css.
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), и вы заметите разницу в гладкости движения.
Я понимаю, что может быть много факторов, влияющих на это поведение, например, если элемент рисуется с аппаратным ускорением или нет.
Кто-нибудь знает о попытке заставить браузеры всегда рисовать элементы на субпикселях?
Я нашел этот похожий вопрос, но ответ заключался в анимировании с использованием трансляционного преобразования, что я и делаю: Переход CSS3 к пикселям.
Update: Поиграв немного, я нашел исправление для Firefox, но ничего не делает в IE 10. Трюк состоит в том, чтобы немного уменьшить элемент и использовать translate3d с 1px смещением по оси Z:
@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
}
}