Производительность CSS относительно translateZ(0)
Ряд блогов выразили увеличение производительности в "обмане" графического процессора, чтобы думать, что элемент является 3D с помощью transform: translateZ(0)
для ускорения анимации и переходов. Мне было интересно, есть ли смысл использовать это преобразование следующим образом:
* {
-webkit-transform: translateZ(0);
-moz-transform: translateZ(0);
-ms-transform: translateZ(0);
-o-transform: translateZ(0);
transform: translateZ(0);
}
5 ответов:
Преобразования CSS создают новый контекст укладки и содержащий блок, как описано в спецификации .На простом английском языке это означает, что фиксированные позиционные элементы с преобразованием, примененным к ним, будут действовать скорее как абсолютно позиционированные элементы, и
z-index
значения, скорее всего, будут обмануты.Если вы посмотрите на эту демонстрацию, Вы поймете, что я имею в виду. Второй div имеет преобразование, примененное к нему, что означает, что он создает новый контекст укладки, и псевдо-элементы укладываются сверху, а не снизу.
Так что, в принципе, не делайте этого. Применяйте 3D-преобразование только тогда, когда вам нужна оптимизация.-webkit-font-smoothing: antialiased;
- это еще один способ подключиться к 3D-ускорению, не создавая этих проблем, но он работает только в Safari.
Если вам нужны последствия, в некоторых сценариях производительность Google Chrome ужасна с включенным аппаратным ускорением. Как ни странно, изменение "трюка" на
Я не верю, что мы когда-либо выяснили почему.-webkit-transform: rotateZ(360deg);
сработало просто отлично.
Это заставляет браузер использовать аппаратное ускорение для доступа к графическому процессору устройства (GPU), чтобы заставить пиксели летать. Веб-приложения, с другой стороны, работают в контексте браузера, что позволяет программному обеспечению выполнять большую часть (если не все) рендеринга, что приводит к снижению мощности переходов. Но интернет догоняет, и большинство производителей браузеров теперь обеспечивают графическое аппаратное ускорение с помощью определенных правил CSS.
Использование
-webkit-transform: translate3d(0,0,0);
приведет к запуску графического процессора в действие для CSS-переходов, делая их более плавными (выше FPS).Примечание:
translate3d(0,0,0)
ничего не делает с точки зрения того, что вы видите. Он перемещает объект на 0px по осям x, y и Z. Это всего лишь способ форсировать аппаратное ускорение.Хорошо читать здесь: http://www.smashingmagazine.com/2012/06/21/play-with-hardware-accelerated-css/
Я могу засвидетельствовать тот факт, что
-webkit-transform: translate3d(0, 0, 0);
будет иметь дело с новым свойствомposition: -webkit-sticky;
. С навигационным шаблоном левого ящика, над которым я работал, аппаратное ускорение, которое я хотел получить с помощью свойства transform, мешало фиксированному расположению моей верхней навигационной панели. Я выключил трансформацию, и позиционирование сработало отлично.К счастью, у меня, кажется, уже было аппаратное ускорение, потому что у меня был
-webkit-font-smoothing: antialiased
на элементе html. Я тестировал это поведение в iOS7 и Android.
На мобильных устройствах отправка всего на GPU вызовет перегрузку памяти и сбой приложения. Я столкнулся с этим в приложении для iPad в Кордове. Лучше всего отправлять только необходимые элементы в GPU, дивы, которые вы специально перемещаете.
Еще лучше, используйте 3d
переходыпреобразования, чтобы сделать анимацию, как translateX (50px) в отличие от left: 50px;