Erzwinge DOM-Neuzeichnen / Aktualisieren auf Chrome / Mac
Jeder einmal in eine Weile, Chrome rendert perfekt valides HTML/CSS falsch oder gar nicht. Graben durch den DOM-Inspektor ist oft genug, um es zu realisieren, die Fehler seiner Wege und ordnungsgemäß neu gezeichnet werden, so ist es nachweislich der Fall, dass das markup ist gut. Dies passiert Häufig (und vorhersagbar) genug, in einem Projekt an dem ich arbeite, habe ich code in Ort, um Kraft neu unter bestimmten Umständen.
Dies funktioniert in den meisten browser/os-Kombinationen:
el.style.cssText += ';-webkit-transform:rotateZ(0deg)'
el.offsetHeight
el.style.cssText += ';-webkit-transform:none'
Als in, zwicken einige nicht verwendete CSS-Eigenschaft ist, dann Fragen Sie nach einigen Informationen, die Kräfte neu, dann untweak Eigentum. Leider, das helle-team hinter Chrome für den Mac zu haben scheinen einen Weg gefunden zu bekommen, offsetHeight, ohne nachzuziehen. So ist das töten eines ansonsten nützlichen hack.
Bisher die beste, die ich mir ausgedacht habe, um den gleichen Effekt auf Chrome/Mac ist dieses Stück Hässlichkeit:
$(el).css("border", "solid 1px transparent");
setTimeout(function()
{
$(el).css("border", "solid 0px transparent");
}, 1000);
Als im eigentlich Kraft, um das element zu springen ein bisschen, dann chill eine zweite und springen Sie zurück. Macht es schlimmer, wenn Sie Tropfen, der timeout unter 500ms (wo wäre es weniger Auffällig), es oft nicht den gewünschten Effekt haben, da der browser nicht, um sich zu festigen, bevor er sich wieder in seinen ursprünglichen Zustand.
Jemand Pflege zu bieten, eine bessere version von diesem neu zeichnen/aktualisieren-hack (vorzugsweise basierend auf dem ersten Beispiel oben), das funktioniert in Chrome/Mac?
InformationsquelleAutor der Frage Jason Kester | 2012-01-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht genau wissen, was Sie zu erreichen versuchen, aber das ist eine Methode, die ich verwendet haben in der Vergangenheit mit Erfolg zu zwingen, den browser neu zu zeichnen, vielleicht wird es für Sie arbeiten.
Wenn diese einfach nachzeichnen nicht funktioniert, können Sie versuchen, diese ein. Es fügt eine leere text-Knoten in das element, welches garantiert neu.
EDIT: In Reaktion auf Šime Vidas, was wir erreichen hier wäre eine Zwangs-reflow. Sie können herausfinden, mehr vom Meister selbst http://paulirish.com/2011/dom-html5-css3-performance/
InformationsquelleAutor der Antwort Juank
Keine der oben genannten Antworten, die für mich gearbeitet. Ich habe bemerkt, dass Größenänderung mein Fenster führten zu einem Neuzeichnen. Also das hat es für mich:
InformationsquelleAutor der Antwort Vincent Sels
Diese Lösung ohne timeouts! Real Kraft neu zeichnen! Für Android und iOS.
InformationsquelleAutor der Antwort aviomaksim
Wir haben vor kurzem festgestellt und entdeckt, dass die Förderung der betroffene element zu einem composite-Schicht mit translateZ das Problem ohne zusätzliche javascript.
Als diese Gemälde, Probleme zeigen sich meist in Webkit/Blink, und dieses Update meistens Ziele Webkit/Blink, es ist besser in manchen Fällen. Vor allem, da viele JavaScript-Lösungen, die die Ursache für reflow und neu Lackierennicht nur ein repaint.
InformationsquelleAutor der Antwort morewry
Dies funktioniert für mich. Großes Lob gebührt hier.
InformationsquelleAutor der Antwort zupa
Versteckt sich ein element und dann zeigt es wieder in ein setTimeout von 0 erzwingt ein Neuzeichnen.
InformationsquelleAutor der Antwort Brady Emerson
Das scheint, den trick zu tun für mich. Plus, es ist wirklich nicht zeigen überhaupt.
InformationsquelleAutor der Antwort Xavier Follet
call
window.getComputedStyle()
zwingen sollte, ein reflow -InformationsquelleAutor der Antwort qlqllu
Wenn Sie möchten, erhalten die styles erklärte in Ihren stylesheets, besser, etwas zu verwenden, wie:
NB: mit dem neuesten webkit/blink, speichern den Wert von
offsetHeight
ist zwingend erforderlich, damit trigger die repaint, da sonst die VM (für Optimierungen Zwecke) wird wahrscheinlich überspringen Sie die Anweisung.Update: es wurde die zweite
offsetHeight
Lesen, es ist notwendig, um zu verhindern, dass browser von queueing - /Zwischenspeichern eines folgenden CSS-Eigenschaft/Klasse ändern sich mit der Wiederherstellung derdisplay
Wert (auf diese Weise eine CSS-transition, die Folgen können, dargestellt werden soll)InformationsquelleAutor der Antwort guari
//<==schlechte Idee$('article.child').redraw();
InformationsquelleAutor der Antwort Mehdi Rostami
Einen Ansatz, der arbeitete für mich auf IE (den ich nicht nutzen konnte, die display-Technik, da gab es einen Eingang, der darf nicht Locker-Fokus)
Es funktioniert, wenn man 0-Marge (änderung der Polsterung als gut funktioniert)
InformationsquelleAutor der Antwort Rogel Garcia
Nur CSS. Dies funktioniert für Situationen, in denen ein Kind-element entfernt oder Hinzugefügt. In diesen Situationen, Ränder und abgerundete Ecken lassen können Artefakte.
InformationsquelleAutor der Antwort rm.rf.etc
Mein fix für IE10 + IE11. Im Grunde, was passiert ist, dass Sie fügen Sie ein DIV innerhalb einer Verpackung-element berechnet werden. Dann entfernen Sie einfach es und voila, funktioniert wie ein Charme 🙂
InformationsquelleAutor der Antwort Narayan
Meisten Antworten erfordern ein asynchroneous timeout, was bewirkt, dass lästige blinken.
Aber ich kam mit dieser, die reibungslos funktioniert, denn es ist synchroneous:
InformationsquelleAutor der Antwort Oriol
Dies ist meine Lösung, arbeitete für das verschwinden von Inhalten...
InformationsquelleAutor der Antwort Kosmos
rufen Sie diese Funktion nach 500 Millisekunden.
InformationsquelleAutor der Antwort Shobhit
Ich lief in ein ähnliches Problem und diese einfache Zeile von JS geholfen, um es zu beheben:
In meinem Fall war es ein bug mit einer Chrome-Erweiterung, nicht Neuaufbau der Seite nach dem ändern seine CSS aus der extension.
InformationsquelleAutor der Antwort Rotareti