CSS3-Transform verursacht, text flackern in Safari und Firefox Mac Yosemite
Ich habe dieses seltsame Problem auf Safari und Firefox (Mac/Yosemite), die bewirkt, dass fast alle der text auf der Seite an zu flackern, wenn die Maus über das element verwandeln.
Beispiel gif: (Firefox, Yosemite)
.usp {
//USP has an icon that is defined below
opacity: .4;
@include transition(all .3s ease-in-out);
&:hover {
opacity: 1;
@include transition(all .3s ease-in-out);
.icon {
@include transform(scale(1.1));
@include transition(all 1.7s ease-in-out);
}
} //:hover
}
.usp .icon {
display: block;
height: 75px;
width: 75px;
//Insert background-image sprite (removed from this example)
@include transition(all .3s ease-in-out);
@include transform(scale(1.0));
}
Ich habe versucht, die folgenden Dinge:
Fügen Sie jede mögliche Kombination dieser Stile, die Körper, die sich transformierenden element und/oder seiner Eltern
-webkit-transform-style:preserve-3d;
-webkit-backface-visibility: hidden;
-moz-backface-visibility: hidden;
-ms-backface-visibility: hidden;
backface-visibility: hidden;
-webkit-filter: opacity(.9999);
-webkit-font-smoothing: antialiased;
-webkit-transform: translate3d(0, 0, 0);
-moz-transform: translate3d(0, 0, 0);
-webkit-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
-webkit-font-smoothing: subpixel-antialiased;
-webkit-text-stroke: 0.35px;
If (Modelle unten) auf den Körper aufgetragen, das problem wird behoben, in Safari aber nicht im Firefox, denn es ist kein webkit-browser.
-webkit-transform: translate3d(0, 0, 0);
-webkit-text-stroke: 0.35px;
Ich habe buchstäblich keine Ahnung, was das verursacht und wie ich es beheben kann!
InformationsquelleAutor der Frage Rick Doesburg | 2015-06-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
In Ordnung!
Nach einer Woche des testens, das entfernen und hinzufügen von CSS-Regeln habe ich endlich die Lösung gefunden, dass mein problem behoben. Ursprünglich hatte ich dieses problem sowohl in Firefox 39 9 und Safari, aber Firefox auf mysteriöse Weise behoben, die sich mit dem neuesten update. Safari jedoch nicht. Das problem hat zu tun mit der 3D-Darstellung von Elementen auf der Seite. Das element habe ich versucht zu skalieren, musste umgewandelt werden in 3D-Kontext, das flackernde Elemente auf der Seite umschaltbar zwischen 2D-und 3D-erklärt von @Woodrow-Barlow in den anderen Antworten.
Durch hinzufügen
dem flackernden Elemente, und somit Rendern in 3D auf die Seite laden, Sie musste nicht mehr wechseln!
BEARBEITEN 1: Für Menschen, die haben dieses Problem auch in anderen Browsern, werfen Sie einen Blick auf die CSS - '-ändern " - Eigenschaft:
https://dev.opera.com/articles/css-will-change-property/
InformationsquelleAutor der Antwort Rick Doesburg
Hinweis zu OP: Sie scheint zumindest wissen die meisten dieser Konzepte, aber ich habe viele Details in diese Antwort für jemand anderen, der vielleicht ein ähnliches problem.
In modernen Browsern ausgeführt auf einem computer, die eine dedizierte GPU (Prozessor für die Wiedergabe von Grafiken), wird der browser manchmal verlagern die Aufgabe der Erbringung der Webseite von der CPU (die "normal" - Prozessor) und der GPU. Die CPU und GPU haben jeweils Ihre eigenen stärken und Schwächen-die Art der GPU ist, dass es machen kann 3-dimensionale Transformationen sehr effizient, aber möglicherweise nicht in der Lage zu Rendern als Klartext knusprig wie die CPU.
Ihre hover-Effekt wird mit Hilfe einer transformation, die Ihr browser als geeignet für hardware-beschleunigte GPU-rendering (wahrscheinlich ausgelöst durch die
scale(1.1)
- transformation), und damit hat es sich verschoben rendering vorübergehend auf die GPU, während der hover-animation/transition Auftritt. Nachdem die animation fertig ist, wird die CPU übernimmt das Rendern wieder. Aufgrund der unterschiedlichen rendering-Strategien, die von den verschiedenen Teile der hardware, der text sieht anders aus (weniger scharfe), während die GPU ist in Rechnung zu stellen.Wir leider (noch) nicht die explizite Steuerung von hardware-Beschleunigung über die CSS - -- der browser setzt, Wann immer es will. Was wir jedoch tun können, ist einige Eigenschaften, die wir vermuten wird die browser in hardware-beschleunigte GPU-Modus. Die Theorie hier ist, dass wir die browser in den GPU-Modus, auch wenn die animation nicht vorkommt, so dass wir nicht sehen, ein "flimmern".
Diese Strategie hat einige Nachteile: - Nutzer besuchen Ihre website Erfahrung leicht erhöhte RAM-Speicherauslastung während Ihrer Seite ist offen, und mobile - /laptop-Nutzer erleben wird, leicht erhöhte Batterieverbrauch. Auf Geräten, die nicht über eine dedizierte GPU-hardware-Beschleunigung wird nicht ausgelöst (aber dann wieder, diese Geräte würden nicht sehen, die "flimmern", das sehen Sie sowieso).
Es sieht aus wie Sie versucht haben, tun Sie dies bereits, indem die
scale(1.0)
- Eigenschaft, um die un-betreffende element -- meine beste Vermutung ist, dass Ihr browser(s) hat, "clever" und hat erkannt, dass diese Regel findet auch nichts und ignoriert es. Der zuverlässigste Weg zur Auslösung von hardware-Beschleunigung ist in der Regel eine transformation auf der Z-Achse. Versuchen Sie, Ihre transformation auf die folgenden:Anstatt den Werte "1" und "0" ist, bin ich mit infinitesimal engen Werten; das wird hoffentlich verhindern, dass der browser immer "clever" und ignorieren dabei die Regel.
Ich gehe davon aus, dass Ihr Sass gehören es tut vendor-Präfix. Überprüfen Sie, dass die Letzte Ausgabe enthält nicht nur die
-webkit-transform:
und-moz-transform:
aber es enthält auch die un-Präfixtransform:
syntax. Wenn Sie sicher sein wollen, (für die Zwecke von debugging), nur geben Sie Sie manuell:Auf mein Ende, ich habe nicht die Erfahrung jedes flimmern zu starten, die auf Ihrer Geige (ich vermute, dass mein browser - /OS - /hardware-Konfiguration nicht glaube, dass eine 2-dimensionale Skala ist geeignet für die GPU), also ich bin nicht in der Lage diesen code zu testen. Allerdings habe ich verwendet ähnliche Techniken, ähnliche Probleme zu lösen oft.
InformationsquelleAutor der Antwort Woodrow Barlow
Ahhh, aber Sie haben versucht,
http://jsfiddle.net/j04mayvb/4/
Ich habe ehrlich gesagt keine Ahnung, warum das funktioniert, aber ich kann sehen, es zu stoppen das flackern auf Ihrer Fiddle in Safari.
InformationsquelleAutor der Antwort MattDiamant
OK!
So, das problem, das ich konfrontiert wurde, war in eine benutzerdefinierte popup, wo ich eine Rad-Effekt auf die Kreuz-Schaltfläche mit css-übergang. Aber das flimmern verursacht Problem im popup.
Nach dem Besuch verschiedenen online-Portalen, die ich kennengelernt habe, die transition-Eigenschaft:
auf dem transition-element funktioniert wirklich und hält das flackern. Aber mit dieser Eigenschaft verwischt die gesamte Komponente (popup -) in meinem Fall und zu stoppen, hatte ich die Verwendung einer anderen Eigenschaft auf das root-element der Komponente:
aber da ich es in eine benutzerdefinierte popup-was bereits übersetzt wurde und 50% in y-Richtung zu halten, im Zentrum, ich war eingeschränkt, es nicht zu verwenden.
Nach dem spielen mit der css-Eigenschaften für Tage und ausprobieren verschiedener Lösungen, kam ich zu dem Schluss, dass insgesamt die Höhe der Komponente in die transition-element verwendet werden muss AUCH und im Falle von dynamischen Daten, die wir brauchen, um stellen Sie die Ränder und Leerstellen in einer Weise, die Gesamthöhe bleibt AUCH.
Dieser mein Problem gelöst. Nur stellen Sie sicher Gesamthöhe bleibt AUCH und passen die Margen und Polster entsprechend.
Hoffe, es hilft jemand in not zu. 🙂
InformationsquelleAutor der Antwort Avaneesh Tripathi
Diese codes sind geschrieben für die Unterstützung mehrerer browser.
versuchen Sie, diese für mozila
InformationsquelleAutor der Antwort Tuku
Ich habe festgestellt, das tritt vor allem auf Elemente, die transformiert wurden (sprich: ein -, modal -, Folien). Gibt es eine Transformation auf jede der übergeordneten Elemente?
Es gibt eine Tonne von fixes rund um das web für webkit-basierte Browser, aber nichts für den Firefox.
InformationsquelleAutor der Antwort Westley Mon
Haben wir auch gesucht, die seit Wochen versuchen, dieses Problem zu lösen. Sie können alle Art von tricks wie der oben genannten zu setzen, das element in seinem eigenen GPU-Ebene. Aber dadurch wird der text umgewandelt werden in ein bitmap und daher unscharf.
In unserem Fall ist das problem aufgetreten, weil der oneven Pixel. Wenn Sie center ein modal mit einem übersetzen -50% oder vielleicht verwenden Sie % Größen. Untergeordnete Elemente innerhalb dieses Containers können bekommen oneven Positionen (je nach Breite /Höhe des modal). In chrome können Sie einfach überprüfen diese auf ein element in der berechneten tab. Wenn es oneven Positionen können Sie sehen, wie Sie 'springen', wenn die Maus über einem anderen element, wie eine animierte css-Taste.
Wenn Sie den Mauszeiger über den css-button, es ist nicht nur die rendering-element selbst, sondern auch andere Elemente der Seite. Weil die oneven Positionen können Sie sehen, das element springen.
Skala
In unserem Fall hatten wir ein zweites problem: wir wollten nach unten skalieren die komplette Seite, wenn ein Benutzer besucht die Seite mit einem kleineren Bildschirm. Zunächst verwendeten wir ein Übersetzen(Skala). Eine Skala auf einem übergeordneten div ist auch die oneven Stellenausschreibungen von Kind-Elementen. Nehmen wir an, Ihre Waage ist 0.8343493. In diesem Fall untergeordnete Elemente neu berechnet und konnte einfach oneven. Mit einer css3-animation bekommen Sie die gleichen problem wie oben beschrieben.
Nach Wochen der Suche, ist die Antwort für Chrome war ganz einfach, wir sind jetzt mit der älteren option zoom:1.0 statt zu übersetzen:(Skala 1.0). Das Ergebnis ist, dass wir jetzt haben a scharf und Flimmerfrei-Seite.
Beispiel das Ergebnis mit scale & Flimmerfrei-Tasten & übergänge:
InformationsquelleAutor der Antwort Berry van Elk