Анимация ключевого кадра CSS с преобразованием преобразования привязывается к целым пикселям в IE 10 и Firefox.

Похоже, что и 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
   }
}

Вот пример того, что я имею в виду:

http://jsfiddle.net/yZgTM/.

Просто откройте его в Chrome и IE 10 (или Firefox), и вы заметите разницу в плавности движения.

Я понимаю, что на это поведение может влиять множество факторов, например, отрисовывается ли элемент с аппаратным ускорением или нет.

Кто-нибудь знает об исправлении, позволяющем заставить браузеры всегда отображать элементы в субпикселях?

Я нашел этот похожий вопрос, но ответ заключался в том, чтобы анимировать с помощью преобразования перевода, что я и делаю: Переходы CSS3 "привязываются к пикселю".

Обновление: немного поигравшись, я нашел исправление для Firefox, но ничего не делает в IE 10. Хитрость заключается в том, чтобы немного уменьшить масштаб элемента и использовать translate3d со смещением в 1 пиксель по оси 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
   }
}

person Strille    schedule 29.05.2013    source источник
comment
Хм... Я протестировал вашу оригинальную версию в IE 10, и, кажется, она отлично работает! (Применение исправления снова делает IE 10 негладким.) Вы уверены, что исходная версия (без масштабирования) не работает гладко в IE 10?   -  person gkalpak    schedule 29.05.2013
comment
Да, я уверен. Ни один из них не работает гладко в IE 10 для меня. Спасибо за сообщение о том, что в IE 10 это не всегда плохо. Мне интересно, какие факторы определяют такое поведение.   -  person Strille    schedule 29.05.2013
comment
На самом деле, вы правы. Мой первый комментарий неверен. Меня смутил тот факт, что я постоянно наблюдаю такое поведение в IE 10: когда я загружаю jsFiddle и начинается анимация, она действительно не плавная. После того, как я нажимаю «Выполнить» в jsFiddle (без внесения каких-либо изменений), он снова загружается, и на этот раз анимация плавная!?   -  person gkalpak    schedule 29.05.2013
comment
Я надеялся, что document.msCSSOMElementFloatMetrics = true; (который обеспечивает рендеринг с точностью до субпикселя в IE10) поможет, но заставить его работать не удалось. думаю сдаться :(   -  person gkalpak    schedule 29.05.2013
comment
Спасибо за ваши усилия в любом случае!   -  person Strille    schedule 29.05.2013
comment
Странно, у меня в IE 10 все гладко при первой загрузке с помощью jsfiddle. Chrome работает плавно, Firefox дергается.   -  person Robert McKee    schedule 31.05.2013
comment
Роберт, у вас Windows 7 или 8?   -  person Strille    schedule 31.05.2013
comment
Добавление небольшого поворота, похоже, позволяет включить субпиксельный рендеринг в Firefox (не тестировалось в IE). transform: translate(0px, 0px) rotate(0.0001deg); Просмотрите эту отредактированную Fiddle в FF.   -  person Moob    schedule 08.08.2013
comment
На самом деле вы не обязаны двигаться на 1 пиксель, вам просто нужно использовать translate3d, даже если в качестве значений указано только 0. Он включает аппаратное ускорение.   -  person FLX    schedule 13.08.2013
comment
@FC': обычно 0 действительно работает для запуска аппаратного ускорения, но не в Firefox в этом случае. Сначала я попробовал с 0 (например, всегда работает с 0 на iOS).   -  person Strille    schedule 13.08.2013
comment
@Strille Хорошо, приятно знать. Вы также можете попробовать что-то из этого списка: transform: translateZ(0); трансформировать: перевести3d(0,0,0); перспектива: 1000; обратная видимость: скрытая; Каждый должен включать ускорение, возможно, один из них будет работать в Firefox даже со значением 0. translateZ кажется лучшим (видно на blog.teamtreehouse .com/)   -  person FLX    schedule 13.08.2013


Ответы (3)



@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);       
   }
}
person Zanderi    schedule 11.12.2013

Не может быть движения полпикселя, такого понятия не существует.

Ваша проблема в скорости и плавности анимации, а не в "привязке пикселей".

person Nemanja    schedule 18.08.2013
comment
Вы когда-нибудь слышали о сглаживании? Вы когда-нибудь рисовали кривую линию? Линия, которая повернута не на 0 или 180 градусов? Пиксельная привязка определенно проблема :/ - person Lodewijk; 02.08.2015
comment
Хороший пример привязки к пикселям: forum.unity.com/attachments/line- aa-gif.223415 - person Miro; 09.04.2020