什么-webkit-transform:translate3d(0,0,0); 到底怎么办?适用于身体?

WIW*_*ire 80 html css webkit css3

到底-webkit-transform: translate3d(0,0,0); 是做什么的?它有任何性能问题吗?我应该将它应用于身体或个体元素吗?它似乎大大改善了滚动事件.

谢谢你的教训!

Yot*_*mer 104

-webkit-transform: translate3d(0,0,0); 使一些设备运行其硬件加速.

这里找到一个很好的阅读

本机应用程序可以访问设备的图形处理单元(GPU)以使像素飞行.另一方面,Web应用程序在浏览器的上下文中运行,这使得软件可以完成大部分(如果不是全部)渲染,从而减少了转换的马力.但是Web一直在追赶,大多数浏览器厂商现在通过特定的CSS规则提供图形硬件加速.

使用-webkit-transform: translate3d(0,0,0);将使GPU进入CSS过渡的动作,使它们更平滑(更高的FPS).

注意: translate3d(0,0,0)就你所看到的而言,什么都不做.它在x,y和z轴上移动对象0px.这只是一种强制硬件加速的技术.


另一种选择是-webkit-transform: translateZ(0).如果由于转换导致Chrome和Safari出现闪烁,请尝试-webkit-backface-visibility: hidden-webkit-perspective: 1000.有关更多信息,请参阅此文章.


Mat*_*ian 11

我没有在这里看到解释这个问题的答案.通过div使用一组复杂的验证计算每个选项及其选项,可以完成大量转换.但是,如果使用3D功能,则您拥有的每个2D元素都被视为3D元素,我们可以动态地对这些元素执行矩阵变换.但是,大多数元素在技术上已经硬件加速,因为它们都使用GPU.但是,3D变换直接在这些2D渲染(或缓存版本div)的缓存版本上工作,并直接对它们使用矩阵变换(矢量化和并行化FP数学).

重要的是要注意,3D变换仅对缓存的2D div上的特征进行更改(换句话说,div已经是渲染图像).因此,改变边框宽度和颜色等内容不再是模糊地说"3D".如果您考虑一下,更改边框宽度需要您重新渲染,div并重新缓存它以便可以应用3D变换.

希望这是有道理的,如果您有任何疑问,请告诉我.

为了回答你的问题,translate3d: 0x 0y 0z因为变换直接在通过运行divGPU着色器的顶点形成的纹理上工作,所以什么都不做.此着色器资源现在被缓存,并且在绘制到帧缓冲区时将应用矩阵.所以,基本上没有这样做的好处.

这就是浏览器内部工作的方式.

第1步:解析输入

<div style = "position:absolute;left:0;right:0;bottom:0;top:0;"></div>
Run Code Online (Sandbox Code Playgroud)

第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.
Run Code Online (Sandbox Code Playgroud)

第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);
}
Run Code Online (Sandbox Code Playgroud)


Ser*_*kyy 6

在MobileSafary(iOS 5)中滚动存在一个错误,导致在滚动容器中出现作为输入元素副本的工件.

对每个子元素使用translate3d可以修复那个奇怪的bug.这是一个CSS的例子,为我节省了一天.

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

.scrolling-container .child-element {
    position: relative;
    -webkit-transform: translate3d(0,0,0);
}
Run Code Online (Sandbox Code Playgroud)


Pra*_*thi 5

Translate3D会强制硬件加速 .CSS动画,变换和过渡不会自动通过GPU加速,而是从浏览器的慢速软件渲染引擎执行。为了使用GPU,我们使用了translate3d

当前,Chrome,FireFox,Safari,IE9 +和最新版本的Opera之类的浏览器都具有硬件加速功能,只有在有迹象表明DOM元素会从中受益时才使用它。


Jas*_*ung 5

请注意,它会创建一个堆叠上下文(加上其他答案所说的内容),因此它确实可能会对您所看到的内容产生影响,例如,使某些不应该出现的内容出现在覆盖层上。