Testo sfocato dopo aver usato CSS transform: scale (); in Chrome


126

Sembra che ci sia stato un recente aggiornamento a Google Chrome che causa testo sfocato dopo aver eseguito un file transform: scale(). Nello specifico sto facendo questo:

@-webkit-keyframes bounceIn {
  0% {
    opacity: 0;
    -webkit-transform: scale(.3);
  }

  50% {
    opacity: 1;
    -webkit-transform: scale(1.05);
  }

  70% {
    -webkit-transform: scale(.9);
  }

  100% {
    -webkit-transform: scale(1);
  }
}

Se visiti http://rourkery.com in Chrome, dovresti vedere il problema nell'area di testo principale. Non lo faceva e non sembra influenzare altri browser webkit (come Safari). C'erano altri post su persone che hanno riscontrato un problema simile con le trasformazioni 3d, ma non riesco a trovare nulla sulle trasformazioni 2d come questa.

Tutte le idee sarebbero apprezzate, grazie!


Ho appena visitato il sito utilizzando Firefox e IE 10, non vedo il problema. Se è limitato a Chrome, potrebbe essere necessario attendere che Google lo risolva da solo.
Nolonar

Non vedo alcuna sfocatura ... sono su Chrome v25 / PC
vsync

Mi sono imbattuto anche in questo problema in precedenza, come ha detto Nolonar, dovremo aspettare che Google lo risolva.
raj_n

Non è una soluzione, ma ho notato che il problema si verifica solo quando utilizzo CSS optimLegibility.
Bangkokian

Il collegamento è interrotto.
Timoteo 003

Risposte:


78

Ho riscontrato questo problema diverse volte e sembra che ci siano 2 modi per risolverlo (mostrato di seguito). È possibile utilizzare una di queste proprietà per correggere il rendering o entrambe contemporaneamente.

La visibilità della faccia posteriore nascosta risolve il problema in quanto semplifica l'animazione solo nella parte anteriore dell'oggetto, mentre lo stato predefinito è il fronte e il retro.

backface-visibility: hidden;

TranslateZ funziona anche in quanto è un trucco per aggiungere l'accelerazione hardware all'animazione.

transform: translateZ(0);

Entrambe queste proprietà risolvono il problema che stai riscontrando, ma ad alcune persone piace anche aggiungere

-webkit-font-smoothing: subpixel-antialiased;

al loro animato all'obiezione. Trovo che possa cambiare il rendering di un font web, ma sentiti libero di sperimentare anche quel metodo.


12
Tutte queste tecniche sembrano migliorare le cose, ma non riesco ancora a portare Chrome allo stesso livello di chiarezza che vedo in Firefox.
Michael Martin-Smucker

13
backface-visibility: hidden;sicuramente ha funzionato nel mio caso, nel risolvere alcuni strani movimenti sfocati causati dalla transizione dell'opacità, cioè. Lo strano movimento ora è sparito, MA ha reso invece i testi nel mio div sfocati in modo permanente.
ITWitch

14
Come suggerito da @ykadaru, prova ad aggiungere perspective(1px)al tuo transform:codice, questo ha funzionato per me in Chrome mentre nient'altro ha risolto il problema
Serge Eremeev

4
Non funziona su Chrome versione 65.0.3325.162 (versione ufficiale) (64 bit) in esecuzione su Ubuntu 17.10 con sessione Gnome X11 (Wayland off)
Marecky

3
In Chrome 72 le prime due opzioni
rendono

24

Per migliorare la sfocatura, esp. su Chrome, prova a farlo:

transform: perspective(1px) translateZ(0);
backface-visibility: hidden;

AGGIORNAMENTO: La prospettiva aggiunge la distanza tra l'utente e il piano z, che tecnicamente ridimensiona l'oggetto, facendo sembrare la sfocatura "permanente". Quanto perspective(1px)sopra è come il nastro adesivo perché stiamo abbinando la sfocatura che stiamo cercando di risolvere. Potresti avere più fortuna con il css di seguito:

transform: translateZ(0);
backface-visibility: hidden;

4
Per me, questo in realtà peggiora le cose.
balu

1
Per me questo risolve il problema tecnico (senza questo, l'elemento si sposta di 1px dopo che l'animazione è terminata, trasforma: solo la prospettiva (1px) risolve questo problema!)
Sergiu

@balu controlla la mia risposta aggiornata! sbarazzarsi della perspective(1px)proprietà e vedere se funziona meglio.
ykadaru

16

Ho scoperto che la regolazione del rapporto di scala ha aiutato leggermente.

L'uso di scale(1.048)over (1.05)sembrava generare una migliore approssimazione alla dimensione del carattere di un intero pixel, riducendo la sfocatura dei sub-pixel.

Ho anche usato translateZ(0)che sembra regolare il passaggio di arrotondamento finale di Chrome nell'animazione di trasformazione. Questo è un vantaggio per il mio utilizzo onhover perché aumenta la velocità e riduce il rumore visivo. Per una funzione onclick, tuttavia, non la userei perché il carattere trasformato non sembra essere così croccante.


1
Questo è l'unico approccio che ha funzionato per me. Gli altri approcci (visibilità sul retro, aggiunta di filtri, prospettiva e buon vecchio translateZ) hanno solo peggiorato le cose. Prova a ridimensionare a pixel interi. Ad esempio, passa da 14px a 16px utilizzando un fattore di scala di 1,1429 (16/14).
hugo der hungrige

1
Ha funzionato per me senza translateZ(0), cambiato solo 1.05in1.048
A. Volg

15

Dopo aver provato tutto il resto qui senza fortuna, ciò che alla fine ha risolto questo problema per me è stato rimuovere la will-change: transform;proprietà. Per qualche motivo ha causato un ridimensionamento orribilmente sfocato in Chrome, ma non in Firefox.


Perché qualcuno dovrebbe svalutarlo? Non capisco ... :( Questo è un problema completamente valido in alcune versioni di Chrome, e sembra che "cambierà" in generale sia ancora abbastanza nuovo e probabilmente non dovrebbe essere usato. Per maggiori informazioni vedi greensock .com / will-change
Dan

Ha avuto lo stesso problema. Grazie per aver postato.
raine

Ho avuto lo stesso problema con il rendering dei componenti di material design su Chrome 75. Rimuovendo lo stile CSS "will-changed" è stato risolto il problema.
Rob il

Confermato in Chrome 79
Fareesh Vijayarangam

1
Ho l'opposto, aggiungendo che will-change: transform;risolve leggermente il problema
Jakub Zawiślak il

14

Invece di

transform: scale(1.5);

utilizzando

zoom : 150%;

risolve il problema di sfocatura del testo in Chrome.


Può aiutare ma introduce anche altri problemi, come le linee di confine bianche che vengono introdotte a volte
Kevin

1
non so perché il voto negativo. Quando l'ho applicato alle caselle di controllo, ha funzionato molto meglio della trasformazione: scale ()
Brian McCall,

2
Per firefox, usa transform: scale () funziona come un fascino senza sfocature. Dovrai lavorare sul rilevamento del browser e agire di conseguenza per Chrome / Safari e Firefox.
Naisheel Verdhan

15
Un altro problema è che lo zoom non sembra funzionare con la proprietà di transizione, quindi non può essere utilizzato per le animazioni CSS
ericgrosse

3
Funziona e modifica la sfocatura, ma cambia anche la posizione degli elementi.
user1156544

8

Questo deve essere un bug con Chrome (versione 56.0.2924.87), ma quanto segue risolve la sfocatura per me quando si modificano le proprietà css nella console ('. 0'). Lo segnalerò.

filter: blur(.0px)

1
Sei arrivato da qualche parte con la tua segnalazione di bug?
Diazole

temo di non ricordare nemmeno dove ho inviato il bug. Lo ha fatto però.
andyw

Sto usando Bootstrap (4.4.1), Chrome (80.0.3987.132), Windows 10 (con visualizzazione ingrandita al 125%) e ho testi sfocati nel menu a discesa. Il menu è posizionato utilizzando transform: translate3d();e questo sembra causare il problema. Nessuna delle soluzioni suggerite ha funzionato per me. Tranne / un po 'questo. Funziona solo se lo imposto prima su un valore positivo (ad esempio blur(0.1px)) e poi cambio in blur(0px). Poiché l'elemento è dinamico e richiede anche una soluzione dinamica (JS), ... questo fa schifo: \
akinuri

7

Sunderls mi ha portato alla risposta. Tranne filter: scaleche non esiste, ma filter: bluresiste.

Applica le dichiarazioni successive agli elementi che appaiono sfocati (nel mio caso erano all'interno di un elemento trasformato):

backface-visibility: hidden;    
-webkit-filter: blur(0);

Ha funzionato quasi perfettamente. " Quasi " perché sto usando una transizione e durante la transizione gli elementi non sembrano perfetti, ma una volta completata la transizione, lo fanno.


-webkit-filter: blur(0);da solo funziona per me. backface-visibility: hidden;sfoca il mio elemento quando ripristino la scala in seguito.
Kai Hartmann

questo è un po 'divertente per Chrome ... se lo imposto blur(0px);non lo risolve. ma se lo faccio blur(1px);e poi premo il tasto freccia giù blur(0px);sembra corretto. Aggiornamento della pagina andato / non importa cosa scrivo nel CSS
Tom Roggero

1
@TomRoggero Suona meno specifico per il valore della proprietà blur e più su quando viene eseguito il ridisegno del layout. Potresti provare a forzare il ridisegno dell'elemento utilizzando JavaScript dopo un po 'di ritardo.
Gajus

5

Ho scoperto che il problema si verifica in qualche modo sulle trasformazioni relative. translateX (50%), scale (1.1) o altro. fornire valori assoluti funziona sempre (non produce testo sfocato (ures)).

Nessuna delle soluzioni menzionate qui ha funzionato e penso che non ci sia ancora una soluzione (usando Chrome 62.0.3202.94 mentre sto scrivendo questo).

Nel mio caso transform: translateY(-50%) translateX(-50%)provoca la sfocatura (voglio centrare una finestra di dialogo).

Per raggiungere valori un po 'più "assoluti", ho dovuto impostare valori decimali su transform: translateY(-50.09%) translateX(-50.09%).

NOTA

Sono abbastanza sicuro che questi valori variano a seconda delle dimensioni dello schermo. Volevo solo condividere le mie esperienze, nel caso aiutasse qualcuno.


Stavo riscontrando esattamente lo stesso problema facendo la stessa identica cosa. Stavo centrando un modale con translate3d (-50%, -50%, 0). Nel mio caso, ho aumentato i valori a -50,048% e sembra perfetto.
Chris Gutierrez


4

L'aggiunta ha perspective(1px)funzionato per me.

transform: scale(1.005);

per

transform: scale(1.005) perspective(1px);


3

Nel mio caso il codice seguente ha causato un carattere sfocato:

-webkit-transform: translate(-50%,-50%);
transform: translate(-50%,-50%);

e solo l'aggiunta della proprietà zoom lo ha risolto per me. Gioca con lo zoom, quanto segue ha funzionato per me:

zoom: 97%;   

4
Nessun supporto per Firefox perzoom
Dustin Poissant,

3

Un'altra soluzione da provare che ho appena trovato per le trasformazioni sfocate (translate3d, scaleX) su Chrome è impostare l'elemento come " display: inline-table ;". In alcuni casi sembra forzare l'arrotondamento dei pixel (sull'asse X).

Ho letto che il posizionamento dei subpixel in Chrome era previsto e gli sviluppatori non lo risolveranno.


3

Aggiornamento 2019
Il bug del display di Chrome non è ancora stato risolto e, sebbene non sia colpa degli utenti, nessuno dei suggerimenti offerti nella totalità di questo sito Web aiuta a risolvere il problema. Posso concordare di aver provato tutti invano: solo 1 si avvicina e questa è la regola css: filtro: sfocatura (0); che elimina lo spostamento di un contenitore di 1px ma non risolve il bug di visualizzazione sfocata del contenitore stesso e di qualsiasi contenuto che potrebbe avere.

Ecco la realtà: non esiste letteralmente alcuna soluzione a questo problema, quindi ecco un modo per aggirare i siti Web fluidi

CASO
Attualmente sto sviluppando un sito web fluido e ho 3 div, tutti centrati con effetti al passaggio del mouse e condividendo valori percentuali sia in larghezza che in posizione. Il bug di Chrome si verifica sul contenitore centrale che è impostato a sinistra: 50%; e trasformare: translateX (-50%); un ambiente comune.

ESEMPIO: prima l'HTML ...

<div id="box1" class="box">
    Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry"s standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.
</div>

<div id="box2" class="box">
    Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry"s standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.
</div>

<div id="box3" class="box">
    Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry"s standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.
</div>

Ecco il CSS in cui si verifica il bug di Chrome ...

*{margin:0; padding:0; border:0; outline:0; box-sizing:border-box;  background:#505050;}
.box {position:absolute; border:1px solid #fff; border-radius:10px; width:26%; background:#8e1515; padding:25px; top:20px; font-size:12pt; color:#fff; overflow:hidden; text-align:center; transition:0.5s ease-in-out;}
.box:hover {background:#191616;}
.box:active {background:#191616;}
.box:focus {background:#191616;}
#box1 {left:5%;}
#box2 {left:50%; transform:translateX(-50%);} /* Bugged */
#box3 {right:5%;}

Ecco il css corretto ...

*{margin:0; padding:0; border:0; outline:0; box-sizing:border-box;  background:#505050;}
.box {position:absolute; border:1px solid #fff; border-radius:10px; width:26%; background:#8e1515; padding:25px; top:20px; font-size:12pt; color:#fff; overflow:hidden; text-align:center; transition:0.5s ease-in-out;}
.box:hover {background:#191616;}
.box:active {background:#191616;}
.box:focus {background:#191616;}
#box1 {left:5%;}
#box2 {left:37%;} /* Fixed */
#box3 {right:5%;}

Violino con bug: https://jsfiddle.net/m9bgrunx/2/
Violino fisso: https://jsfiddle.net/uoc6e2dm/2/

Come puoi vedere, una piccola quantità di modifiche al CSS dovrebbe ridurre o eliminare la necessità di utilizzare la trasformazione per il posizionamento. Ciò potrebbe essere applicato anche a siti Web a larghezza fissa e fluidi.


La sfocatura è prevista quando si utilizza la traduzione, perché l'elemento può finire su un mezzo pixel . Ora ci sono alternative migliori per centrare le cose: campione flexbox , esempio griglia
Timothy003

L'unico browser che ho testato che sembra avere un problema con il centro di trasformazione è Chrome, tutto il resto sembra cristallino. Ho guardato indietro e questo problema esiste da 7 anni! Tuttavia ci sono molti modi per scuoiare un gatto e come dici tu non è nemmeno più necessario.
SJacks

questo è incredibile, ma filtro: blur (-0.1px); mi ha aiutato !!. come diavolo funziona ??
jt3k

3

Ho lo stesso problema. Ho risolto questo problema usando:

.element {
  display: table
}

2
folle ma funziona; Chrome è il nuovo IE a quanto pare
Arthur

oooow signore! funziona! immagino che la larghezza della tabella 'fix' in PX non fosse possibile larghezza con mezzo pixel ...
LuanLuanLuan

2

Nessuno dei precedenti ha funzionato per me. Ho avuto questa animazione per i popup:

@keyframes pulse {
  from {
    transform: scale3d(1, 1, 1);
  }
  50% {
    transform: scale3d(1.05, 1.05, 1.05);
  }
  to {
    transform: scale3d(1, 1, 1);
  }
}

Nel mio caso l'effetto sfocato era sparito dopo aver applicato questa regola: -webkit-perspective: 1000;anche se è contrassegnato come non utilizzato in Chrome Inspector.


Per me funziona ed è anche contrassegnato come non utilizzato. Ho anche aggiunto will-change: transform;che corregge lo sfocato dei bordi degli elementi. Qualsiasi altra risposta non ha funzionato per me.
Jakub Zawiślak

2

La mia soluzione era:

display: iniziale;

Poi è stato croccante


1

Nessuno dei precedenti ha funzionato per me.

Ha funzionato quando ho aggiunto la prospettiva

cioè da

transform : translate3d(-10px,-20px,0) scale3d(0.7,0.7, 1)

ho cambiato in

transform : perspective(1px) translate3d(-10px,-20px,0) scale3d(0.7,0.7, 1)


L'aggiunta in perspective(1px)realtà ha peggiorato le cose per me :(
balu

1

Ho risolto il mio caso aggiungendo:

transform: perspective(-1px)

Questo per me ha appena rimosso il scale()risultato della trasformazione
jpenna

1

PER CHORME:

Ho provato tutti i suggerimenti qui. Ma non ha funzionato. Il mio college ha trovato un'ottima soluzione, che funziona meglio:

NON dovresti scalare oltre 1.0

E includi translateZ(0)nel passaggio del mouse ma NON nella posizione iniziale / nessuno.

Esempio:

a {
    transition: all 500ms cubic-bezier(0.165, 0.840, 0.440, 1.000);
    transform: scale(0.8, 0.8);
}

a:hover {
    transform: translateZ(0)scale(1.0, 1.0);
}

1

Ho usato una combinazione di tutte le risposte e questo è ciò che ha funzionato per me alla fine:

.modal .modal--transition {
  display: inline-table;
  transform: perspective(1px) scale(1) translateZ(0);
  backface-visibility: hidden;
  -webkit-font-smoothing: subpixel-antialiased;
}

1

Stavo affrontando il problema del testo sfocato su Chrome ma non su Firefox quando l'ho usato transform: translate(-50%,-50%).

Bene, ho davvero provato molte soluzioni alternative come:

transform: perspective(1px);
filter: blur(0);
transform: translateZ(0);
backface-visibility: hidden;

Nessuno di questi ha funzionato per me.

Infine, ho uniformato l'altezza e la larghezza dell'elemento. Ha risolto il problema per me !!!

Nota: potrebbe dipendere dal caso d'uso al caso d'uso. Ma sicuramente vale la pena provare!


1

Ho provato molti esempi da queste risposte, purtroppo, nulla di aiuto per Chrome Version 81.0.4044.138 che ho aggiunto invece all'elemento di trasformazione

 transform-origin: 50% 50%;

questo

 transform-origin: 51% 51%;

per me aiuta


0

Per me il problema era che i miei elementi stavano usando transformStyle: preserve-3d. Mi sono reso conto che questo non era effettivamente necessario per l'app e rimuoverlo ha risolto la sfocatura.


0

L'ho rimosso dal mio codice transform-style: preserve-3d; e l' ho aggiuntotransform: perspective(1px) translateZ(0);

il mosso è andato via!


0

In Chrome 74.0.3729.169, corrente dal 25 al 25-19, non sembra esserci alcuna correzione per la sfocatura che si verifica a determinati livelli di zoom del browser causati dalla trasformazione. Anche un semplice TransformY(50px)sfocerà l'elemento. Ciò non si verifica nelle versioni correnti di Firefox, Edge o Safari e non sembra verificarsi a tutti i livelli di zoom.


Questo è quello che è successo al mio. Non riesco a sbarazzarmi di questo effetto sfocato. Una soluzione che ha funzionato è impostare queste proprietà: top: 0, bottom: 0, left: 0; right: 0; margin: automa poi il contenitore occuperà tutto lo spazio che può (deve essere la larghezza), quindi questo non funziona nel caso in cui il contenuto debba decidere quanto sarà grande il contenitore.
kwiat1990

0

Sarà difficile da risolvere solo con css.

Quindi l'ho risolto con jquery.

Questo è il mio CSS.

.trY {
   top: 50%;
   transform: translateY(-50%);
}

.trX {
   left: 50%;
   transform: translateX(-50%);
}

.trXY {
   top: 50%;
   left: 50%;
   transform: translate(-50%, -50%);
}

e questo è il mio jquery.

function tr_init() {
$(".trY, .trX, .trXY").each(function () {
    if ($(this).outerWidth() % 2 != 0) {
        var fixed_width = Math.ceil($(this).outerWidth() / 2) * 2;
        $(this).css("width", fixed_width);
    }
    if ($(this).outerHeight() % 2 != 0) {
        var fixed_height = Math.ceil($(this).outerHeight() / 2) * 2;
        $(this).css("height", fixed_height);
    }
})}

0

Solo per aumentare la mania delle correzioni, mettere {border: 1px solid # ???} attorno all'oggetto dall'aspetto sgradevole risolve il problema per me. Se hai un colore di sfondo stabile, considera anche questo. Questo è così stupido che nessuno ha pensato di menzionarlo, immagino, eh eh.



-1

Il testo non sarà sfocata se non transitionlatransform .

Basta fare questo:

&:hover {
    transform: scale(1.1);
}

Senza la transizione mi piace transition: all .2s;

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.