De temps en temps, Chrome rendra HTML / CSS parfaitement valide incorrectement ou pas du tout. Il suffit souvent de creuser dans l'inspecteur DOM pour qu'il se rende compte de l'erreur de ses chemins et redessine correctement, il est donc prouvé que le balisage est bon. Cela se produit assez fréquemment (et de manière prévisible) dans un projet sur lequel je travaille et que j'ai mis en place du code pour forcer un redessin dans certaines circonstances.
Cela fonctionne dans la plupart des combinaisons navigateur / système d'exploitation:
el.style.cssText += ';-webkit-transform:rotateZ(0deg)'
el.offsetHeight
el.style.cssText += ';-webkit-transform:none'
Comme dans, ajustez une propriété CSS inutilisée, puis demandez des informations qui forcent un redessin, puis décochez la propriété. Malheureusement, l'équipe brillante derrière Chrome pour Mac semble avoir trouvé un moyen d'obtenir cet offsetHeight sans redessiner. Tuer ainsi un hack autrement utile.
Jusqu'à présent, le meilleur que j'ai trouvé pour obtenir le même effet sur Chrome / Mac est cette laideur:
$(el).css("border", "solid 1px transparent");
setTimeout(function()
{
$(el).css("border", "solid 0px transparent");
}, 1000);
Comme dans, forcez l'élément à sauter un peu, puis refroidissez-le une seconde et sautez-le en arrière. Pire encore, si vous ramenez ce délai en dessous de 500 ms (là où il serait moins visible), il n'aura souvent pas l'effet souhaité, car le navigateur ne se mettra pas à redessiner avant de revenir à son état d'origine.
Quelqu'un veut-il offrir une meilleure version de ce hack de rafraîchissement / rafraîchissement (basé de préférence sur le premier exemple ci-dessus) qui fonctionne sur Chrome / Mac?
la source
Réponses:
Je ne sais pas exactement ce que vous essayez de réaliser, mais c'est une méthode que j'ai utilisée avec succès dans le passé pour forcer le navigateur à se redessiner, peut-être que cela fonctionnera pour vous.
Si ce simple redessin ne fonctionne pas, vous pouvez essayer celui-ci. Il insère un nœud de texte vide dans l'élément, ce qui garantit un redessin.
EDIT: En réponse à Šime Vidas ce que nous réalisons ici serait une refusion forcée. Vous pouvez en savoir plus sur le maître lui-même http://paulirish.com/2011/dom-html5-css3-performance/
la source
.hide().show(0)
sur n'importe quel élément (j'ai choisi le pied de page), cela devrait rafraîchir la page.Aucune des réponses ci-dessus n'a fonctionné pour moi. J'ai remarqué que le redimensionnement de ma fenêtre a causé un redessin. Donc, ça l'a fait pour moi:
la source
$(window).trigger('resize')
, il ne déclenche l'événement «resize» qui déclenche le gestionnaire associé que s'il est affecté.Nous avons récemment rencontré cela et découvert que la promotion de l'élément affecté en une couche composite avec translateZ corrigeait le problème sans avoir besoin de Javascript supplémentaire.
Comme ces problèmes de peinture apparaissent principalement dans Webkit / Blink, et que ce correctif cible principalement Webkit / Blink, il est préférable dans certains cas. D'autant plus que de nombreuses solutions JavaScript provoquent une refusion et une repeinture , pas seulement une repeinture.
la source
neon-animated-pages
. Merci: +1:Cette solution sans timeouts! Réel redessiner la force ! Pour Android et iOS.
la source
Cela fonctionne pour moi. Bravo, allez ici .
la source
$().hide().show(0)
show()
est différentshow(0)
en ce en spécifiant une durée dans ce dernier, il est déclenché par des méthodes d'animation jQuery dans un délai d' attente plutôt qu'immédiatement qui donne de temps pour prendre de la même manière que lehide(0, function() { $(this).show(); })
fait .Masquer un élément et l'afficher à nouveau dans un setTimeout de 0 forcera un nouveau tracé.
la source
myElement.getBoundingClientRect()
, qui étaient mises en cache, probablement à des fins d'optimisation / de performances. J'ai simplement ajouté un délai d'expiration de zéro milliseconde pour la fonction qui ajoute le nouvel élément au DOM et obtient les nouvelles valeurs après que l'ancien élément avec les valeurs précédentes (mises en cache) a été supprimé du DOM.Cela semble faire l'affaire pour moi. De plus, cela ne se voit vraiment pas du tout.
la source
l'appel
window.getComputedStyle()
devrait forcer une refusionla source
offsetHeight
propriété qui n'est pas CSS.J'ai rencontré ce défi aujourd'hui dans OSX El Capitan avec Chrome v51. La page en question a bien fonctionné dans Safari. J'ai essayé presque toutes les suggestions sur cette page - aucune ne fonctionnait correctement - toutes avaient des effets secondaires ... J'ai fini par implémenter le code ci-dessous - super simple - pas d'effets secondaires (fonctionne toujours comme auparavant dans Safari).
Solution: basculez une classe sur l'élément problématique selon vos besoins. Chaque bascule forcera un nouveau tracé. (J'ai utilisé jQuery pour plus de commodité, mais JavaScript vanille ne devrait pas poser de problème ...)
Basculement de classe jQuery
Classe CSS
Et c'est tout...
Remarque: vous devez exécuter l'extrait de code en dessous de «pleine page» afin de voir l'effet.
la source
appeler cette fonction après 500 millisecondes.
la source
Si vous souhaitez conserver les styles déclarés dans vos feuilles de style, mieux vaut utiliser quelque chose comme:
NB: avec le dernier webkit / blink, le stockage de la valeur de
offsetHeight
est obligatoire afin de déclencher le repeindre, sinon la VM (à des fins d'optimisation) sautera probablement cette instruction.Mise à jour: ajout de la deuxième
offsetHeight
lecture, il est nécessaire d'empêcher le navigateur de mettre en file d'attente / de mettre en cache un changement de propriété / classe CSS suivant avec la restauration de ladisplay
valeur (de cette façon, une transition CSS qui peut suivre doit être rendue)la source
// <== mauvaise idée$('article.child').redraw();
la source
.fadeIn(1)
au lieu de.show(300)
pour moi - ne pas pousser l'élément autour. Donc je suppose que c'est le déclenchementdisplay:none
et le retour deblock
Une approche qui a fonctionné pour moi sur IE (je ne pouvais pas utiliser la technique d'affichage car il y avait une entrée qui ne devait pas perdre le focus)
Cela fonctionne si vous avez 0 marge (la modification du rembourrage fonctionne également)
la source
CSS uniquement. Cela fonctionne pour les situations où un élément enfant est supprimé ou ajouté. Dans ces situations, les bordures et les coins arrondis peuvent laisser des artefacts.
la source
Ma solution pour IE10 + IE11. Fondamentalement, ce qui se passe est que vous ajoutez un DIV dans un élément enveloppant qui doit être recalculé. Il suffit ensuite de le retirer et le tour est joué; fonctionne comme un charme :)
la source
La plupart des réponses nécessitent l'utilisation d'un délai d'attente asynchrone, ce qui provoque un clignotement gênant.
Mais je suis venu avec celui-ci, qui fonctionne bien car il est synchrone:
la source
C'est ma solution qui a fonctionné pour la disparition de contenu ...
la source
J'ai rencontré un problème similaire et cette simple ligne de JS a aidé à le résoudre:
Dans mon cas, il s'agissait d'un bug avec une extension Chrome ne redessinant pas la page après avoir changé son CSS depuis l'extension.
la source
Je voulais ramener tous les états à l'état précédent (sans rechargement) y compris les éléments ajoutés par jquery. L'implémentation ci-dessus ne fonctionnera pas. et j'ai fait comme suit.
la source
J'avais une liste de composants React qui, lorsqu'elle était défilée, avait ouvert une autre page, puis lors du retour, la liste n'était pas rendue sur Safari iOS jusqu'à ce que la page défile. C'est donc le correctif.
la source
Ci-dessous, css fonctionne pour moi sur IE 11 et Edge, aucun JS n'est nécessaire.
scaleY(1)
fait l'affaire ici. Semble la solution la plus simple.la source
Ça m'a aidé
la source
2020: plus léger et plus fort
Les solutions précédentes ne fonctionnent plus pour moi.
Je suppose que les navigateurs optimisent le processus de dessin en détectant de plus en plus de changements "inutiles".
Cette solution fait que le navigateur dessine un clone pour remplacer l'élément d'origine. Cela fonctionne et est probablement plus durable:
testé sur Chrome 80 / Edge 80 / Firefox 75
la source