Что делает -webkit-transform: translate3d(0,0,0); точно делать? Применить к телу?

Что значит -webkit-transform: translate3d(0,0,0); точно делать? Есть ли проблемы с производительностью? Должен ли я просто применить его к телу или отдельным элементам? Кажется, радикально улучшить события прокрутки.

Спасибо за урок!

6 ответов

Решение

-webkit-transform: translate3d(0,0,0); заставляет некоторые устройства запускать аппаратное ускорение.

Хорошее чтение найдено здесь

Собственные приложения могут получить доступ к графическому процессору устройства (GPU), чтобы заставить пиксели летать. С другой стороны, веб-приложения выполняются в контексте браузера, что позволяет программному обеспечению выполнять большую часть (если не все) рендеринга, что приводит к меньшей мощности для переходов. Но Интернет догонял, и большинство поставщиков браузеров теперь обеспечивают графическое аппаратное ускорение с помощью определенных правил CSS.

С помощью -webkit-transform: translate3d(0,0,0); активирует GPU для переходов CSS, делая их более плавными (более высокий FPS).

Замечания: translate3d(0,0,0) ничего не делает с точки зрения того, что вы видите. он перемещает объект на 0px по осям x, y и z. Это всего лишь техника форсирования аппаратного ускорения.


Альтернатива -webkit-transform: translateZ(0), И если на Chrome и Safari вспыхивает мерцание, попробуйте -webkit-backface-visibility: hidden а также -webkit-perspective: 1000, Для получения дополнительной информации обратитесь к этой статье.

Я не видел здесь ответа, объясняющего это. Много преобразований может быть сделано путем расчета каждого из div и его варианты, используя сложный набор проверки. Однако, если вы используете 3D-функцию, каждый из ваших 2D-элементов рассматривается как 3D-элементы, и мы можем выполнить матричное преобразование этих элементов на лету. Однако большинство элементов "технически" уже аппаратно ускорены, поскольку все они используют графический процессор. Но 3D-преобразования работают непосредственно с кэшированными версиями каждого из этих 2D-рендеров (или с кэшированными версиями div) и непосредственно использовать матричные преобразования на них (которые векторизованы и распараллелены FP математикой).

Важно отметить, что 3D-преобразования ТОЛЬКО вносят изменения в объекты в кэшированном 2D-элементе Div (другими словами, элемент Div уже является визуализированным изображением). Таким образом, такие вещи, как изменение ширины и цвета границы, больше не являются "трехмерными", если говорить смутно. Если вы думаете об этом, изменение ширины границ требует перерисовки div потому что и перепишите это так, чтобы 3D-преобразования могли быть применены.

Надеюсь, что это имеет смысл, и дайте мне знать, если у вас есть еще вопросы.

Чтобы ответить на ваш вопрос, translate3d: 0x 0y 0z ничего не будет делать, так как преобразования работают непосредственно с текстурой, которая формируется путем запуска вершин div в шейдер GPU. Этот ресурс шейдера теперь кэшируется, и при рисовании в буфере кадров будет применяться матрица. Таким образом, в принципе нет никакой пользы от этого.

Вот как браузер работает внутри.

Шаг 1: Разбор ввода

<div style = "position:absolute;left:0;right:0;bottom:0;top:0;"></div>

Шаг 2: Разработка составного слоя

CompositeLayer compLayer = new CompositeLayer();
compLayer.setPosition(0, 0, 0, 0);
compLayer.setPositioning(ABSOLUTE); // Note. this is psuedocode. The actual code
Pipeline.add(compLayer, zIndex); // would be significantly more complex.

Шаг 3: сделать составной слой

for (CompositeLayer compLayer : allCompositeLayers){

     // Create and set cacheTexture as active target
     Texture2D cacheTexture = new Texture2D();
     cacheTexture.setActive();

     // Draw to cachedTexture
     Pipeline.renderVertices(compLayer.getVertices());
     Pipeline.setTexture(compLayer.getBackground());
     Pipeline.drawIndexed(compLayer.getVertexCount());

     // Set the framebuffer as active target
     frameBuffer.setActive();

     // Render to framebuffer from texture and **applying transformMatrix**
     Pipeline.renderFromCache(cacheTexture, transformMatrix);
}

В MobileSafary (iOS 5) есть ошибка с прокруткой, которая приводит к появлению артефактов в виде копий элементов ввода в контейнере прокрутки.

Использование translate3d для каждого дочернего элемента может исправить эту странную ошибку. Вот пример CSS, который спас мне день.

.scrolling-container {
    overflow: auto;
    -webkit-overflow-scrolling: touch;
}

.scrolling-container .child-element {
    position: relative;
    -webkit-transform: translate3d(0,0,0);
}

Translate3D форсирует аппаратное ускорение.CSS-анимации, преобразования и переходы не ускоряются GPU автоматически, а вместо этого выполняются из более медленного движка рендеринга программного обеспечения браузера. Для использования графического процессора мы используем translate3d

В настоящее время браузеры, такие как Chrome, FireFox, Safari, IE9+ и последняя версия Opera, поставляются с аппаратным ускорением, они используют его только тогда, когда у них есть признаки того, что элемент DOM выиграет от этого.

Имейте в виду, что он создает контекст стека (плюс то, что сказано в других ответах), поэтому он потенциально оказывает влияние на то, что вы видите, например, заставляет что-то появляться поверх наложения, когда это не предполагается.

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

Другие вопросы по тегам