cosa fa -webkit-transform: translate3d (0,0,0); esattamente? Applicare al corpo?


88

cosa fa -webkit-transform: translate3d(0,0,0); esattamente? Ha problemi di prestazioni? Dovrei applicarlo solo al corpo o ai singoli elementi? Sembra migliorare drasticamente gli eventi di scorrimento.

Grazie per la lezione!


4
Cosa manca alle risposte: traduce effettivamente l'elemento di 0 pixel sugli assi x, yez. ;)
inserirenomeutentequi

Ha anche un impatto sul rendering dei caratteri, particolarmente visibile su caratteri di grandi dimensioni. In caso contrario, i bordi smussati appaiono di nuovo alias. Potrebbe essere specifico del browser o del sistema operativo, osservato in Chrome 33 su Windows 7.
patrickj

1
@patrickj Ho anche iniziato a notare un comportamento leggermente diverso con translate3d(0,0,0)Chrome 33 (33.0.1750.117m) su Windows 7. Ha reso invisibile uno dei miei elementi, quindi l'ho rimosso.
David Sherret,

2
Per riferimento futuro: will-changeseparerà anche l'elemento html nel proprio livello. developer.mozilla.org/en-US/docs/Web/CSS/will-change . will-changesostituirà l' -webkit-transform:translate3d(0,0,0)hack.
Jason Lydon

non usarlo con il selettore * css tutti i miei link sono diventati inattivi :)
stefan

Risposte:


111

-webkit-transform: translate3d(0,0,0); fa sì che alcuni dispositivi eseguano la loro accelerazione hardware.

Una buona lettura si trova qui

Le applicazioni native possono accedere all'unità di elaborazione grafica (GPU) del dispositivo per far volare i pixel. Le applicazioni Web, d'altra parte, vengono eseguite nel contesto del browser, che consente al software di eseguire la maggior parte (se non tutto) del rendering, con una conseguente minore potenza per le transizioni. Ma il Web ha recuperato terreno e la maggior parte dei fornitori di browser ora fornisce l'accelerazione hardware grafica per mezzo di particolari regole CSS.

L'utilizzo -webkit-transform: translate3d(0,0,0);farà entrare in azione la GPU per le transizioni CSS, rendendole più fluide (FPS più alti).

Nota: translate3d(0,0,0) non fa nulla in termini di ciò che vedi. sposta l'oggetto di 0px sugli assi x, yez. È solo una tecnica per forzare l'accelerazione hardware.


Un'alternativa è -webkit-transform: translateZ(0). E se c'è uno sfarfallio su Chrome e Safari a causa delle trasformazioni, prova -webkit-backface-visibility: hiddene -webkit-perspective: 1000. Per maggiori info fare riferimento a questo articolo .


Non sono sicuro che l'applicazione di una trasformazione di matrice sulla trama memorizzata nella cache migliorerebbe davvero i benefici. Quando il contenuto viene spostato dalla trama memorizzata nella cache al framebuffer, la trasformazione aumenta le prestazioni per operazioni complesse, ma non apporta alcun vantaggio per i normali eventi di disegno. Non farà alcun danno né avrà alcun vantaggio. Correggimi se sbaglio?
Mathew Kurian

Penso che anche le normali pitture verranno accelerate .. uno dei criteri di creazione dei livelli è "Proprietà CSS di trasformazione 3D o prospettiva".
Yotam Omer

Ad esempio, il carousel di bootstrap lo utilizza, mentre sposta l'immagine visualizzata da destra a sinistra.
Ethan

@YotamOmer Possiamo in alternativa usare translateZ (0) o scale3d (1,1,1) per attivare l'acceleratore h / w?
Ethan

1
@Ethan Yes, secondo questo entrambi dovrebbero funzionare. Sapevo solo della trasformazione 3D, ma a quanto pare translateZfarà anche il trucco nella maggior parte dei browser.
Yotam Omer

12

Non ho visto una risposta qui che spieghi questo. È possibile eseguire molte trasformazioni calcolando ciascuna delle dive le relative opzioni utilizzando un insieme complicato di convalida. Tuttavia, se utilizzi una funzione 3D, ciascuno degli elementi 2D che hai sono considerati elementi 3D e possiamo eseguire una trasformazione di matrice su questi elementi al volo. Tuttavia, la maggior parte degli elementi sono "tecnicamente" già accelerati hardware perché utilizzano tutti la GPU. Tuttavia, le trasformazioni 3D funzionano direttamente sulle versioni memorizzate nella cache di ciascuno di questi rendering 2D (o versioni memorizzate nella cache di div) e utilizzano direttamente una trasformazione di matrice su di esse (che sono matematiche FP vettorializzate e parallelizzate).

È importante notare che SOLO le trasformazioni 3D apportano modifiche alle caratteristiche su un div 2D memorizzato nella cache (in altre parole, il div è già un'immagine renderizzata). Quindi, cose come cambiare la larghezza e il colore del bordo non sono più "3D" per essere vagamente parlando. Se ci pensi, la modifica della larghezza del bordo richiede di rieseguire il rendering del divperché e memorizzarlo nuovamente in modo che le trasformazioni 3D possano essere applicate.

Spero abbia senso e fammi sapere se hai altre domande.

Per rispondere alla tua domanda, translate3d: 0x 0y 0znon farebbe nulla poiché le trasformazioni funzionano direttamente sulla trama che si forma eseguendo i vertici di divnello shader GPU. Questa risorsa shader è ora memorizzata nella cache e verrà applicata una matrice quando si disegna nel frame buffer. Quindi, fondamentalmente non c'è alcun vantaggio nel farlo.

Ecco come funziona internamente il browser.

Passaggio 1: input di analisi

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

Passaggio 2: sviluppo del livello composito

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.

Passaggio 3: rendering dello strato composito

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);
}

6

C'è un bug con lo scorrimento in MobileSafary (iOS 5) che fa apparire artefatti come copie di elementi di input nel contenitore a scorrimento.

L'uso di translate3d per ogni elemento figlio può correggere questo strano bug. Ecco un esempio di CSS che mi ha salvato la giornata.

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

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

5

Translate3D forza l'accelerazione hardware. Le animazioni, le trasformazioni e le transizioni CSSS non sono automaticamente GPU CSSS accelerate dalla , ma vengono eseguite dal motore di rendering software più lento del browser.

Attualmente, browser come Chrome, FireFox, Safari, IE9 + e l'ultima versione di Opera sono tutti dotati di accelerazione hardware, la usano solo quando hanno un'indicazione che un elemento DOM ne trarrebbe vantaggio.


3

Essere consapevoli che si crea un contesto di stratificazione (oltre a quello che le altre risposte hanno detto), in modo che non potenzialmente hanno un effetto su ciò che si vede, ad esempio, fare qualcosa di apparire più di una sovrapposizione quando non dovrebbe.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.