Cómo evitar el cambio de representación de texto de Webkit durante la transición de CSS


81

Estoy usando transiciones de CSS para la transición entre estados transformados de CSS (básicamente, la transición de la escala de un elemento). Noto que cuando el elemento está en transición, el resto del texto en la página (en Webkit) tiende a alterar levemente su representación hasta que se realiza la transición.

Violín: http://jsfiddle.net/russelluresti/UeNFK/

También noté que esto no ocurre en mis encabezados, que tienen el -webkit-font-smoothing: antialiasedpar propiedad / valor en ellos. Entonces, me pregunto, ¿hay alguna forma de que el texto mantenga su apariencia predeterminada (el valor "automático" para suavizado de fuentes) y no altere la representación durante una transición?

Intenté configurar explícitamente el texto para usar el valor "auto", pero eso no hace nada. También debo tener en cuenta que establecer el suavizado de fuentes en "ninguno" también evita que el renderizado parpadee durante la transición.

Se agradece cualquier ayuda.

Editar 1

Debo señalar que estoy en OS X. Mientras miraba mi prueba en Chrome en Parallels, no vi que los dos párrafos diferentes se comportaran de manera diferente, por lo que este puede ser un problema exclusivo de Mac.


21. Y la versión de Safari es 6. Ocurre en ambos navegadores, lo que me hace pensar que es Webkit y no el navegador.
RussellUresti

tanto los párrafos con suavizado como con alias muestran el mismo comportamiento. chrome Versión 23.0.1270.0 canary | 21.0.1180.89 m | 5.17 safari

Supongo que estás en la versión para desarrolladores de Chrome. Sin embargo, el sistema operativo puede estar jugando un papel en esto. Editaré la pregunta para notar que estoy usando OSX.
RussellUresti

1
No tengo ni idea de por qué funciona esto, pero agrego '-webkit-transform: translateZ (0);' a '.antialiased {} parece arreglarlo. Incluso funciona si lo agrega a 'p {}'. Como no puedo explicar por qué funciona esto, no me pareció correcto proporcionarlo como respuesta. ¡Espero que ayude!
Christofer Vilander

@Christofer Eso los hace consistentes, pero hace que todos parezcan antialias (todos son texto más delgado). Estoy tratando de hacer que el texto sin suavizado (el primer párrafo) permanezca en su estilo predeterminado (que aparece un poco más audaz que el texto con suavizado).
RussellUresti

Respuestas:


83

Creo que encontré una solución:

-webkit-transform: translateZ(0px);

Forzar la aceleración de hardware en el elemento padre parece resolver el problema ...

EDITAR Como se comentó, este truco deshabilita el suavizado de fuentes y puede degradar la representación de texto dependiendo de sus fuentes, navegador y sistema operativo.


Probé el suavizado de fuentes y no funcionó. Probé esto, funcionó perfectamente
locrizak

Esto no me dio el resultado deseado para este problema indicado, pero esto ha ayudado a solucionar otros problemas de transición de CSS que he tenido (como un texto parpadeante extraño al ocultar / mostrar contenido dentro del elemento de transición).
RussellUresti

3
No funciona para mí mientras que -webkit-font-smoothing: antialiased; y -webkit-backface-visibilidad: oculto; trabajos. Los créditos van aquí stackoverflow.com/questions/11589985/…
F Lekschas

+1 increíble, este es el único método que funcionó para la situación en la que me encontré
Larry

4
Esto deshabilita el suavizado de fuentes en primer lugar. Por lo tanto, no tiene suavizado de fuente al comienzo de la transición, no tiene suavizado de fuente durante la transición y no tiene suavizado de fuente al final. Por lo tanto, no hay cambios de suavizado de fuentes, pero tampoco ningún tipo de suavizado de fuentes.
yunzen

45

ACTUALIZACIÓN Agosto 2020

Ya no es necesario orientar a Safari con una consulta de medios para habilitar el suavizado de fuentes de subpíxeles. El valor predeterminado está bien.

Sin embargo , a pesar de que utiliza los subpíxeles suavizado de fuentes por defecto, hay una significativa mosca en la sopa en Chrome suavizado de fuentes, para cualquiera que busque una representación coherente del texto .

  1. Esta es la representación de Chrome de texto claro sobre un fondo oscuro luz sobre oscuridad
  2. Esta es la representación de Chrome de texto oscuro sobre un fondo claro oscuro sobre la luz

Mira el tamaño del todo en la letra e de arriba. El texto claro sobre un fondo oscuro se representa con un peso perceptiblemente más pesado que el texto oscuro sobre un fondo claro (con un estilo de fuente CSS idéntico).

Una solución, para los sitios que respetan la configuración del tema oscuro / claro del usuario, es apuntar a Chrome con una consulta de medios que se limita al modo oscuro y cambiarlo a suavizado sin subpíxeles de la siguiente manera:

@media screen
and (-webkit-min-device-pixel-ratio: 0)
and (min-resolution: 0.001dpcm)
and (prefers-color-scheme: dark) {
  body {
    -webkit-font-smoothing: antialiased;
  }
}

El resultado :

oscuro sobre la luzclaro sobre oscuro antialias

Un peso de texto mucho más consistente independientemente de si se procesa claro sobre oscuro o oscuro sobre claro.

Vea la comparación lado a lado de antes y después: luz sobre oscuridadclaro sobre oscuro antialias

-

ACTUALIZACIÓN Mayo 2018

-webkit-font-smoothing: subpixel-antialiasedahora no tiene ningún efecto en Chrome pero en Safari todavía mejora mucho las cosas PERO SOLO EN RETINA. Sin él, en Safari en las pantallas de retina, el texto es delgado e insípido, mientras que con él, el texto tiene el peso adecuado. Pero si usa esto en pantallas que no son retina en Safari, (especialmente en valores livianos) el texto es un desastre. Recomiendo encarecidamente utilizar una consulta de medios:

@media screen and (-webkit-min-device-pixel-ratio: 2) {
  body {
    -webkit-font-smoothing: subpixel-antialiased;
  }
}

La configuración explícita -webkit-font-smoothing: subpixel-antialiasedes la mejor solución actual si desea evitar al menos parcialmente el texto antialiased más delgado.

--tl; dr--

Tanto con Safari como con Chrome, donde la representación de fuente predeterminada usa subpíxeles-antialiasing, cualquier CSS que fuerce la representación basada en GPU, como las sugerencias anteriores para usar una transformación usando translateZ o incluso solo una transición de escala, hará que Safari y Chrome "se rindan automáticamente "en el suavizado de fuentes con suavizado de subpíxeles y, en su lugar, cambie a texto solo con suavizado, que se ve mucho más claro y delgado, especialmente en Safari.

Otras respuestas se han centrado en mantener una representación constante simplemente estableciendo o forzando el suavizado de fuentes al texto con suavizado más delgado. En mi opinión, el uso de translateZ o backface hidden degrada significativamente la calidad de la representación del texto y la mejor solución si desea que el texto se mantenga consistente y está de acuerdo con el texto más delgado es solo para usar -webkit-font-smoothing: antialiased. Sin embargo, la configuración explícita en -webkit-font-smoothing: subpixel-antialiasedrealidad tiene algún efecto: el texto aún cambia ligeramente y es visiblemente más delgado durante las transiciones renderizadas en la GPU, pero no tan delgado como sería sin esta configuración. Por lo tanto, parece que esto evita, al menos parcialmente, el cambio a texto sin suavizado.


2
¡Gracias por una excelente reseña!
Denis Gorbachev

2
Esta es la mejor solución. Todos los demás degradan la representación del texto, que es lo que OP pidió específicamente evitar
Fregante

¡Salvavidas para mí! Gracias. Evita el cambio abrupto a la representación de subpíxeles después de una transición css. Al menos con la transición de opacidad, esto mantiene la fuente activada (teóricamente siempre predeterminada) en la representación de subpíxeles incluso durante la transición. ¡Excelente!
Garavani

la mejor solución para nosotros! Gracias
kernel

Gracias, me encontré con esto hace más de un año y lo olvidé por completo. Esta es la única solución que resolvió el problema descrito para mí.
Iain Collins

20

Me he dado cuenta de que casi todas las veces que tengo problemas con los gráficos (parpadeo / tartamudeo / entrecortamiento / etc.) debido a una transición, uso -webkit-backface-visible: hidden; sobre los elementos que actúan tiende a resolver el problema.


3
Esta es la respuesta (actualmente) correcta. Que yo sepa, webkit-font-smoothing se eliminó hace un tiempo, se suponía que se agregaría nuevamente, pero actualmente no me funciona en la última versión de Chrome. El truco de translateZ tampoco parece funcionar. Supongo que esto puede volver a cambiar en cualquier momento. : /
Mantriur

3
Esto hizo que un texto se volviera borroso para mí.
John

8

Para evitar cambios en la representación del texto debido a la aceleración del hardware, puede:

  1. Establezca todo el texto en -webkit-font-smoothing: antialiased. Esto significa que el texto es más delgado y no tiene un suavizado de subpíxeles.

  2. Si desea que el texto que se ve afectado por la aceleración de hardware tenga un suavizado de subpíxeles (el tipo predeterminado de suavizado de fuentes), poner ese texto dentro de una entrada, sin bordes y deshabilitado, mantendrá ese subpíxel suavizado (al menos en Chrome en Mac OS X). No lo he probado en otras plataformas, pero si el antialiasing de subpíxeles es importante, al menos puede usar este truco.


He probado la opción 2 (truco con el elemento de entrada) en Win8.1 y Chrome 47 y no funciona.
Paya


3

Esto es lo que funcionó para mí. Espero eso ayude. Encontrado en otra publicación de stackoverflow.

-webkit-font-smoothing:antialiased;
-webkit-backface-visibility:hidden;

1

Para evitar el cambio de renderizado, debe establecer font-smoothing: antialiased(o none).

El navegador que deshabilita la representación de fuentes de subpíxeles es probablemente un efecto secundario de la aceleración del hardware. Cuando el fondo contra el que se renderiza cambia constantemente, el texto no se puede renderizar en una capa separada, ya que cada fotograma debe comprobarse con todas las capas de fondo. Esto podría degradar gravemente el rendimiento.

Apple a menudo desactiva el suavizado de fuentes de subpíxeles en sus propios sitios.


El problema de configurar el suavizado de fuentes en suavizado es que el texto no se ve como yo quiero. Quiero el efecto visual de establecer el suavizado de fuentes en "automático" (el aspecto más atrevido), pero cuando lo hace, el texto cambiará durante cualquier transición. Por lo tanto, mi objetivo es mantener el aspecto atrevido de "auto" en todo momento.
RussellUresti

1
Puede solucionarlo sin utilizar la aceleración de hardware. Use un temporizador en jQuery y haga la transición a mano (sin transición CSS). Sin embargo, no estoy seguro de recomendarlo, ya que el rendimiento y la suavidad serán peores.
Henrik

Es cierto, podría usar jQuery para animarlo ... Esa puede ser la única solución si no hay otra solución.
RussellUresti

1

Además de las soluciones anteriores ( -webkit-transform: translateZ(0px)en el elemento y -webkit-font-smoothing: antialiaseden la página), algunos elementos aún pueden comportarse mal. Para mí, era un texto de marcador de posición en un elemento de entrada: para esto, useposition:relative


-1

Yo tuve el mismo problema. Léalo detenidamente:

Noto que cuando el elemento está en transición, el resto del texto en la página (en Webkit) tiende a alterar levemente su representación hasta que finaliza la transición.

ninguna de las soluciones anteriores pareció funcionar. Sin embargo, configurar (cosas como)

#myanimation { -webkit-transform: translateZ(0px); }

en el elemento que tiene la animación funcionó.

Al llevar el elemento animado a la capa de GPU, lo sacas del flujo normal de renderizado de la página (cosas como el índice z ya no funcionarán, por ejemplo). Como efecto secundario, la animación y el resto de la página ya no se influirán entre sí.

Si afecta la renderización de su fuente, solo lo hace para el elemento animado, por supuesto. No veo la diferencia en mi Chrome.


Me quedo corregido. Veo cambios en la representación de fuentes en el resto de la página, también en lugares donde no se aplica translateZ (0).
commonpike

Esto es lo único que funcionó para mí cuando tenía iconos de fuentes que se volvían borrosos. Aplicó la transformación a las secciones que se estaban animando y resolvió el problema.
Proyecto de ley

Amigo, esto ya fue respondido hace 2 años. Justo encima ... Exactamente la misma respuesta / código.
NiCk Newman

sí, mi único punto es que tienes que poner el -webkit-transformen el elemento que tiene la animación , para evitar cambios de renderizado en otros elementos de la página . pero como se comentó, funcionó por un tiempo y dejó de funcionar cuando cambié partes de la página más tarde.
commonpike
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.