De vez en cuando, Chrome renderizará HTML / CSS perfectamente válido de forma incorrecta o no lo hará. Excavar a través del inspector DOM a menudo es suficiente para que se dé cuenta del error de sus formas y vuelva a dibujar correctamente, por lo que es probable que el marcado sea bueno. Esto sucede con frecuencia (y previsiblemente) lo suficiente en un proyecto en el que estoy trabajando que puse el código para forzar un redibujo en ciertas circunstancias.
Esto funciona en la mayoría de las combinaciones de navegador / sistema operativo:
el.style.cssText += ';-webkit-transform:rotateZ(0deg)'
el.offsetHeight
el.style.cssText += ';-webkit-transform:none'
Al igual que en, modifique alguna propiedad CSS no utilizada, luego solicite información que obligue a volver a dibujar, luego destrabe la propiedad. Desafortunadamente, el brillante equipo detrás de Chrome para Mac parece haber encontrado una manera de compensar la altura sin volver a dibujar. Por lo tanto, matar a un truco útil.
Hasta ahora, lo mejor que se me ocurrió para obtener el mismo efecto en Chrome / Mac es este pedazo de fealdad:
$(el).css("border", "solid 1px transparent");
setTimeout(function()
{
$(el).css("border", "solid 0px transparent");
}, 1000);
Como en, realmente fuerce al elemento a saltar un poco, luego enfríe un segundo y salte hacia atrás. Para empeorar las cosas, si deja ese tiempo de espera por debajo de 500 ms (hasta donde sería menos notable), a menudo no tendrá el efecto deseado, ya que el navegador no podrá volver a dibujar antes de volver a su estado original.
¿Alguien quiere ofrecer una mejor versión de este hack de redibujar / actualizar (preferiblemente basado en el primer ejemplo anterior) que funciona en Chrome / Mac?
fuente
Respuestas:
No estoy seguro de qué es exactamente lo que está tratando de lograr, pero este es un método que he utilizado en el pasado con éxito para forzar al navegador a volver a dibujar, tal vez funcione para usted.
Si este simple redibujo no funciona, puedes probar este. Inserta un nodo de texto vacío en el elemento que garantiza un nuevo dibujo.
EDITAR: En respuesta a Šime Vidas, lo que estamos logrando aquí sería un reflujo forzado. Puede obtener más información del propio maestro http://paulirish.com/2011/dom-html5-css3-performance/
fuente
.hide().show(0)
en cualquier elemento (elegí el pie de página) debería actualizar la página.Ninguna de las respuestas anteriores funcionó para mí. Me di cuenta de que cambiar el tamaño de mi ventana causó un redibujo. Entonces esto lo hizo por mí:
fuente
$(window).trigger('resize')
no lo hace, solo lanza el evento 'redimensionar' que activa el controlador relacionado si está asignado.Recientemente nos encontramos con esto y descubrimos que la promoción del elemento afectado a una capa compuesta con translateZ solucionó el problema sin necesidad de javascript adicional.
Como estos problemas de pintura se muestran principalmente en Webkit / Blink, y esta solución se dirige principalmente a Webkit / Blink, es preferible en algunos casos. Especialmente porque muchas soluciones de JavaScript causan un reflujo y repintado , no solo un repintado.
fuente
neon-animated-pages
. Gracias: +1:Esta solución sin tiempos de espera! ¡ Fuerza real redibujada! Para Android e iOS.
fuente
Esto funciona para mi. Felicitaciones ve aquí .
fuente
$().hide().show(0)
show()
es diferenteshow(0)
al especificar una duración en este último, se desencadena por los métodos de animación jQuery en un tiempo de espera en lugar de inmediatamente, lo que da tiempo para renderizar de la misma manera que lohide(0, function() { $(this).show(); })
hace .Ocultar un elemento y luego mostrarlo nuevamente dentro de un setTimeout de 0 forzará un redibujo.
fuente
myElement.getBoundingClientRect()
, que estaban siendo almacenados en caché, probablemente para fines de optimización / rendimiento. Simplemente agregué un tiempo de espera de cero milisegundos para la función que agrega el nuevo elemento al DOM y obtiene los nuevos valores después de que el elemento anterior con los valores anteriores (en caché) se eliminó del DOM.Esto parece hacer el truco para mí. Además, realmente no se muestra en absoluto.
fuente
la llamada
window.getComputedStyle()
debe forzar un reflujofuente
offsetHeight
propiedad que no es CSS.Me encontré con este desafío hoy en OSX El Capitan con Chrome v51. La página en cuestión funcionó bien en Safari. Intenté casi todas las sugerencias en esta página, ninguna funcionó bien, todas tuvieron efectos secundarios ... Terminé implementando el código a continuación, súper simple, sin efectos secundarios (todavía funciona como antes en Safari).
Solución: cambie una clase sobre el elemento problemático según sea necesario. Cada palanca forzará un nuevo dibujo. (Usé jQuery por conveniencia, pero JavaScript vainilla no debería ser un problema ...)
jQuery Class Toggle
Clase CSS
Y eso es...
NOTA: tiene que ejecutar el fragmento debajo de "Página completa" para ver el efecto.
fuente
llame a esta función después de 500 milisegundos.
fuente
Si desea conservar los estilos declarados en sus hojas de estilo, es mejor usar algo como:
NB: con el último kit web / parpadeo, el almacenamiento del valor de
offsetHeight
es obligatorio para activar el repintado, de lo contrario, la VM (para fines de optimización) probablemente omitirá esa instrucción.Actualización: se agregó la segunda
offsetHeight
lectura, es necesario evitar que el navegador ponga en cola / guarde en caché el siguiente cambio de propiedad / clase CSS con la restauración deldisplay
valor (de esta manera se debe procesar una transición CSS que pueda seguir)fuente
// <== mala idea$('article.child').redraw();
fuente
.fadeIn(1)
lugar de.show(300)
para mí, no empujando el elemento. Así que supongo, es el desencadenantedisplay:none
y regreso ablock
Un enfoque que funcionó para mí en IE (no pude usar la técnica de visualización porque había una entrada que no debía perder el foco)
Funciona si tienes margen 0 (cambiar el relleno también funciona)
fuente
CSS solamente. Esto funciona para situaciones en las que se elimina o agrega un elemento secundario. En estas situaciones, los bordes y las esquinas redondeadas pueden dejar artefactos.
fuente
Mi solución para IE10 + IE11. Básicamente, lo que sucede es que agrega un DIV dentro de un elemento de ajuste que debe ser recalculado. Luego solo quítalo y listo; Funciona de maravilla :)
fuente
La mayoría de las respuestas requieren el uso de un tiempo de espera asincrónico, lo que provoca un molesto parpadeo.
Pero se me ocurrió este, que funciona sin problemas porque es sincrónico:
fuente
Esta es mi solución que funcionó para desaparecer el contenido ...
fuente
Me encontré con un problema similar y esta simple línea de JS ayudó a solucionarlo:
En mi caso, fue un error con una extensión de Chrome que no redibujó la página después de cambiar su CSS desde dentro de la extensión.
fuente
Quería devolver todos los estados al estado anterior (sin recargar), incluidos los elementos agregados por jquery. La implementación anterior no funcionará. e hice lo siguiente.
fuente
Tuve una lista de componentes de reacción que cuando se desplazó, luego abrió otra página, luego, al regresar, la lista no se procesó en Safari iOS hasta que se desplazó la página. Entonces esta es la solución.
fuente
Debajo de css funciona para mí en IE 11 y Edge, no se necesita JS.
scaleY(1)
hace el truco aquí. Parece la solución más simple.fuente
Me ayudó
fuente
2020: más ligero y más fuerte
Las soluciones anteriores ya no funcionan para mí.
Supongo que los navegadores optimizan el proceso de dibujo al detectar más y más cambios "inútiles".
Esta solución hace que el navegador dibuje un clon para reemplazar el elemento original. Funciona y probablemente sea más sostenible:
probado en Chrome 80 / Edge 80 / Firefox 75
fuente