CSS3 Transformer provoquant le scintillement du texte dans Safari et Firefox Mac Yosemite
Je vais avoir cette étrange question sur Safari et Firefox (Mac/Yosemite) qui provoque presque tout le texte sur la page de scintillement lors du survol de la transformation de l'élément.
Exemple 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));
}
J'ai essayé les choses suivantes:
Ajouter toutes les combinaisons possibles de ces styles pour le corps, la transformation de l'élément et/ou son parent
-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;
Si (styles ci-dessous) sont appliquées sur le corps, le problème est résolu dans Safari mais pas sous Firefox car il n'est pas un navigateur webkit.
-webkit-transform: translate3d(0, 0, 0);
-webkit-text-stroke: 0.35px;
J'ai littéralement aucune idée de quelles sont les causes et comment je peux le fixer!
source d'informationauteur Rick Doesburg
Vous devez vous connecter pour publier un commentaire.
Bien!
Après une semaine de tests, la suppression et l'ajout de règles CSS j'ai enfin trouvé la solution qui a résolu mon problème. J'ai d'abord eu ce problème avec Firefox 39 et Safari 9 mais Firefox mystérieusement fixe lui-même avec la dernière mise à jour. Safari n'a cependant pas fait. Le problème a à voir avec le rendu 3D des éléments sur la page. L'élément que j'ai essayé de l'échelle a dû être transformé en contexte 3D, le scintillement des éléments sur la page de commutation entre les modes 2D et 3D, comme expliqué par @Woodrow-Barlow dans les autres réponses.
En ajoutant
à la lueur des éléments, et donc le rendu en 3D sur la page de la charge, ils n'ont plus eu à passer!
EDIT 1: Pour les personnes qui ont ce problème dans d'autres navigateurs, jetez un oeil à la CSS 'va-changement de propriété:
https://dev.opera.com/articles/css-will-change-property/
Note d'OP: vous semblez être au moins au courant de la plupart de ces concepts, mais j'ai compris beaucoup de détails dans cette réponse pour quelqu'un d'autre qui pourrait avoir un problème similaire.
Dans les navigateurs modernes en cours d'exécution sur un ordinateur qui possède un GPU (processeur pour le rendu des graphismes), le navigateur va parfois décalage de la tâche de rendu de la page web à partir de votre CPU (le "normal" du processeur) pour le GPU. Le CPU et le GPU ont chacun leurs propres forces et faiblesses de la nature de la GPU est qu'il peut rendre en 3 dimensions les transformations de manière très efficace, mais peut ne pas être en mesure de rendu du texte en clair en croquant que le CPU ne.
Votre vol stationnaire effet est à l'aide d'une transformation que votre navigateur a jugé approprié pour l'accélération matérielle pour le rendu sur GPU (plus probablement déclenchée par le
scale(1.1)
transformation), et donc il a changé de rendu temporairement pour le GPU alors que le hover de l'animation et de transition se produit. Après l'animation est réalisée, le PROCESSEUR prend plus de nouveau rendu. En raison des différences de rendu des stratégies utilisées par les différentes pièces de matériel, le texte est différent (moins vif), tandis que le GPU est en charge.Malheureusement, nous n'avons pas (encore) de contrôle explicite de l'accélération matérielle via le CSS, le navigateur établit que chaque fois qu'il veut. Ce que nous pouvons faire, cependant, est de définir certaines propriétés que nous suspect va mettre le navigateur en accélération matérielle GPU mode. La théorie est ici que nous allons garder le navigateur en mode GPU, même lorsque l'animation n'est pas de se produire, de sorte que nous ne voyons pas un "scintillement".
Cette stratégie a quelques inconvénients: les utilisateurs qui visitent votre site web sera une expérience légèrement augmenté utilisation de la mémoire vive, tandis que votre page est ouverte, et mobile /ordinateur portable de l'utilisateur a légèrement augmenté, de l'épuisement de la batterie. Sur les appareils qui n'ont pas de GPU dédié, l'accélération matérielle ne sera pas déclenché (mais là encore, ces dispositifs ne serait pas en voyant le "scintillement" que vous voyez de toute façon).
Il semble que vous avez tenté de le faire déjà par l'ajout de la
scale(1.0)
propriété à l'onu, a plané élément -- ma meilleure supposition est que votre navigateur(s) obtenu "intelligent" et a détecté que cette règle ne fait rien et l'ont ignoré. Le plus fiable que de déclencher l'accélération matérielle est généralement une transformation sur l'axe des Z. Essayez de changer votre transformation à la suivante:Plutôt que d'utiliser les valeurs "1" et "0", je suis en utilisant infiniment proche des valeurs; j'espère que cela va empêcher le navigateur d'être "intelligent" et ignorer la règle.
Je suis en supposant que votre Sass inclure il est en train de faire vendeur-la préfixation. Double-vérifier que le résultat final ne comprend pas seulement la
-webkit-transform:
et-moz-transform:
mais qu'il contient aussi de l'onu précédé d'transform:
de la syntaxe. Si vous voulez être certain (pour les fins de débogage), il suffit de les taper manuellement:Sur ma fin, je n'ai pas l'expérience de tout scintillement de commencer avec votre violon (je soupçonne que mon navigateur/OS/configuration matérielle ne pense pas qu'un 2-dimensions de l'échelle est appropriée pour le GPU), donc je ne suis pas en mesure de tester ce code. Cependant, j'ai utilisé des techniques similaires pour résoudre des problèmes similaires assez souvent.
Ahhh, mais avez-vous essayé
http://jsfiddle.net/j04mayvb/4/
Honnêtement, je n'ai aucune idée de pourquoi cela fonctionne, mais je peux le voir l'arrêt du clignotement sur votre Violon dans Safari.
OK!
Donc, le problème que j'ai été confronté a été personnalisé dans un popup où j'avais une roue d'effet sur le bouton croix à l'aide de css transition. Mais qui a provoqué le scintillement question dans la fenêtre contextuelle.
Après la visite de différents portails en ligne, j'ai appris à connaître que la transition de la propriété:
sur la transition de l'élément fonctionne vraiment et arrête le clignotement. Mais l'utilisation de cette propriété floue, l'ensemble du composant (popup) dans mon cas et pour arrêter cela, j'ai dû utiliser une autre propriété sur l'élément racine de la composante:
mais comme je l'utilise personnalisé dans un popup qui a déjà été traduit -50% selon la direction y pour le garder dans le centre, j'ai été restreint à ne pas l'utiliser.
Après avoir joué avec les propriétés css pour les jours et essayer différentes solutions, j'en suis venu à la conclusion que la hauteur totale du composant dans lequel la transition élément est utilisé doit être MÊME et dans le cas de la dynamique de données, nous avons besoin d'ajuster les marges et les rembourrages de telle manière que la hauteur totale reste MÊME.
Cela a résolu mon problème. Juste assurez-vous que la hauteur totale reste MÊME et ajuster les marges et les rembourrages en conséquence.
Espère que cela aide quelqu'un dans le besoin. 🙂
Ces codes sont écrits pour le soutien de plusieurs navigateur.
essayez ceci pour mozila
J'ai trouvé cela se produit surtout sur les éléments qui ont été transformées (ie: un modal qui se glisse dans). Est-il une transformation sur l'un des éléments de parent?
Il y a une tonne de bugs sur le web pour les navigateurs basés sur webkit, mais rien pour Firefox.
Nous avons également été à la recherche pour les semaines à essayer de résoudre ce problème. Vous pouvez utiliser toutes sortes de trucs comme ceux mentionnés ci-dessus pour mettre l'élément dans son propre GPU de la couche. Mais cela va entraîner le texte pour être transformé en une image bitmap et donc floue.
Dans notre cas, le problème s'est produit en raison de oneven pixels. Quand vous centre modale à l'aide d'un traduire -50% ou peut-être utiliser % tailles. Les éléments enfants à l'intérieur de ce conteneur peut obtenir oneven positions (en fonction de la largeur /hauteur de l'modal). Dans chrome, vous pouvez simplement vérifier sur un élément dans le calcul de l'onglet. Si il y a oneven positions, vous pouvez voir "sauter" lors du survol d'un élément différent, comme une animation css bouton.
Lorsque vous survolez le bouton css, ce n'est pas seulement le rendu de l'élément lui-même, mais aussi d'autres éléments dans la page. En raison de la oneven positions, vous pouvez voir l'élément de sauter partout.
Échelle
Dans notre cas, nous avons eu un deuxième problème, nous avons voulu à l'échelle vers le bas de la page complète lorsqu'un utilisateur visite la page avec un petit écran. Au début, nous avons utilisé une Traduction(de l'échelle). Une échelle sur un div parent est également à l'origine oneven postions des éléments enfants. Disons que votre échelle est 0.8343493. Dans ce cas, les éléments enfants d'obtenir recalculé et pourrait simplement obtenir oneven. Avec css3 animation, vous obtenez le même problème que décrit ci-dessus.
Après des semaines de recherche, la réponse de google Chrome, c'est assez simple, nous en sommes maintenant à l'aide de l'ancienne option de zoom:1.0 au lieu de traduire:(à l'échelle de 1.0). Le résultat est que nous avons maintenant une claire et non-scintillement page.
Exemple de résultat de fin d'échelle a & non-scintillement boutons & transitions: