2011-11-05 20 views
52

Sto riscontrando un problema in cui Chrome e altri browser WebKit sfocatura in modo massivo qualsiasi contenuto scalato in css che ha applicato anche translate3d.WebKit: testo sfocato con scala css + translate3d

Ecco un JS Fiddle: http://jsfiddle.net/5f6Wg/. (Vedi in Chrome.)

.test { 
 
    -webkit-transform: translate3d(0px, 100px, 0px); 
 
} 
 

 
.testInner 
 
{ 
 
    /*-webkit-transform: scale(1.2);*/ 
 
    -webkit-transform: scale3d(1.2, 1.2, 1); 
 
    text-align: center; 
 
}
<div class="test"> 
 
    <div class="testInner"> 
 
    This is blurry in Chrome/WebKit when translate3d and scale or scale3d are applied. 
 
    </div> 
 
</div>

Esistono soluzioni alternative note per questo? Lo prendo nel semplice esempio sopra, potrei semplicemente usare translate piuttosto che translate3d - il punto qui è quello di spogliare il codice fino all'essenziale.

+0

Same su Firefox – Krii

+0

Penso che questo è fisso, aspetto esterno non sfocata a me – neaumusic

+0

Una piccola addittion: in ultima Chrome i stucked con il problema di come quando si usano i valori non arrotondati per 'translate3d'. Arrotondandoli, ho aggiustato tutto per me. – saroff

risposta

33

Webkit tratta gli elementi trasformati 3d come trame anziché vettori per fornire l'accelerazione hardware 3d. L'unica soluzione a questo sarebbe aumentare la dimensione del testo e ridimensionare l'elemento, in pratica creando una texture di res più alta.

vedere qui: http://jsfiddle.net/SfKKv/

Nota che antialiasing è ancora underpar (steli sono perse) quindi sto rinforzando il testo con un po 'd'ombra del testo.

+0

Super utile, grazie! – phil

+1

sarà molto più lento sui webkits mobili allora? –

+0

Ottima soluzione, sembra un po 'come una soluzione di retina, ma poi per i desktop. Adoro l'idea, implementandola in questo momento, super-oggetti di scena. – ReSpawN

-2

Webkit tratta gli elementi trasformati 3d come trame anziché i vettori per fornire l'accelerazione hardware 3d.

Questo non ha nulla a che fare con questo. Noterai che il tuo problema di aliasing può essere risolto aggiungendo informazioni sulla durata e sulla direzione (ad es. 0.3 lineare). Il vostro avendo una cavalla cercando di rendere tutto in fase di esecuzione:

Lo stesso per quanto sopra^

+2

Scusa Tom, ma non ho idea di cosa ti riferisci. Stai parlando di aggiungere un'animazione? (L'intento era solo quello di ridimensionare, non di animare nulla.) Se modifichi il JS Fiddle originale, forse sarebbe utile. – phil

+0

Poiché sto utilizzando una transizione, ho aggiunto la durata e la direzione. La sfocatura persiste ancora. –

-1
body { 
-webkit-font-smoothing: subpixel-antialiased; 
} 

o Penso che si potrebbe mettere che su un elemento specifico, ma ho avuto problemi con un elemento che colpisce l'intera luogo.

Penso che sia un problema con i font personalizzati con font-face.

+1

Apprezzo che tu stia cercando di aggiungere valore qui, ma il JS Fiddle che ho fornito non usa un carattere personalizzato, e -webkit-font-smoothing non sembra fare alcuna differenza. Funziona per te nel Fiddle sopra? – phil

+1

subpixel-antialiased font-smoothing è ora l'impostazione predefinita in Chrome. –

1

Mi sono imbattuto in questo problema quando si utilizza il plug-in isotopo (http://isotope.metafizzy.co/index.html) in combinazione con il plug-in zoom (http://janne.aukia.com/zoomooz/). Ho creato un plugin jQuery per gestire il mio caso. L'ho gettato in un repository Github nel caso in cui qualcuno potesse trarne beneficio. - https://github.com/charleshimmer/jquery-hirestext.

32

ho trovato che l'uso di:

-webkit-perspective: 1000; 

sul contenitore del vostro carattere o set di icone mantenuto le cose nitide per me dopo esperimento con l'emissione su Android Nexus 4.2 per qualche tempo.

+3

Dang, l'ha fatto! Insieme a -webkit-transform: translate3d (0,0,0). Le lettere si stavano formando in modo strano alla fine della scala, e questo la sistemò. Ho provato tutto il resto sotto il sole. – jwinn

+1

Supponiamo che queste proprietà attivino l'accelerazione GPU, aumentando anche le prestazioni delle transizioni su quegli elementi! :) – hallodom

+3

Questa soluzione deve essere contrassegnata come risposta corretta. –

28

Un effetto di filtro css è un'operazione grafica che consente di manipolare l'aspetto di qualsiasi elemento HTML. Dal momento che Chromium 19 questi filtri sono accelerati dalla GPU per renderli super veloci.

CSS3 introduce una serie di effetti filtranti standard, uno di questi è fitler sfocatura:

-webkit-filter: blur(radius); 

Il parametro 'radius' influenza quanti pixel sullo schermo fondono a vicenda, così un valore maggiore creerà più sfocatura. Ovviamente, l'immagine rimane invariata.

Impostare il raggio su 0 obbligherà il browser a utilizzare il calcolo GPU e lo imporrà per mantenere invariato il proprio elemento html. È come applicare effetti "bordi duri".

Quindi la soluzione migliore per me per risolvere questo effetto sfocato è stato quello di aggiungere questo semplice riga di codice:

-webkit-filter: blur(0); 

C'è anche un bug noto che colpisce solo gli schermi retina. (Vedi qui: Why doesn't blur(0) remove all text blur in Webkit/Chrome on retina screens?). Quindi, al fine di renderlo funziona anche per la retina, vi consiglio di aggiungere questa seconda linea:

-webkit-transform: translateZ(0); 
+1

per favore dare qualche spiegazione alla tua risposta – Blip

+0

Come una nota che applica la sfocatura al volo negli strumenti dev sembra non avere lo stesso effetto di essere lì a caricamento pagina. Non sono sicuro se fossi solo io ma questa potrebbe essere la risposta che stai cercando, basta ricaricare la pagina. – Spaceman

+4

Dopo aver provato TUTTO su una ricerca su google questa era la soluzione. Grazie! – th317erd

0

ho usato javascript per spostare il testo top 1px e poi con 100 ms dopo, di nuovo verso il basso 1px. È quasi insensibile e ha risolto completamente il problema del cross-browser.

5

Prova questa

...{ 
zoom:2; 
-webkit-transform: scale(0.5); 
transform: scale(0.5); 
} 

O per un approccio più precisa si può chiamare una funzione javascript per ricalcolare la matrice di trasformazione rimuovendo i valori decimali della matrice. vedi: https://stackoverflow.com/a/42256897/1834212

Problemi correlati