J'ai du CSS qui, en survolant, un effet de transition CSS déplace un div.
Le problème, comme vous pouvez le voir dans l'exemple, est que la translate
transition a pour effet secondaire horrible de faire bouger l'image dans le div de 1px vers le bas / droite (et peut-être redimensionner légèrement?) De sorte qu'elle semble déplacée et flou...
Le pépin semble s'appliquer tout le temps où l'effet de survol est appliqué, et à partir d'un processus d'essais et d'erreurs, je peux dire en toute sécurité que cela ne semble se produire que lorsque la transition de traduction déplace le div (l'ombre et l'opacité de la boîte sont également appliquées mais ne font aucune différence pour l'erreur une fois supprimée).
Le problème ne semble se produire que lorsque la page a des barres de défilement. Donc, l'exemple avec une seule instance du div est bien, mais une fois de plus des div identiques sont ajoutés et la page nécessite donc une barre de défilement, le problème se produit à nouveau ...
Réponses:
Mise à jour 2020
image-rendering
propriété CSS.<img>
balise utilisant la propriété CSS adaptée à l' objet .Réponse originale
Essayez ceci dans votre CSS :
Cela fait que la division se comporte "plus 2D".
backface-visibility
ettransform
sans le-webkit-
préfixe. Je ne sais actuellement pas comment cela affecte le rendu des autres navigateurs (FF, IE), alors utilisez les versions non préfixées avec prudence.la source
-webkit-transform
, je ne peux pas vraiment voir un changement, et quand j'ouvre la console développeur chromes. Je vois que ces 2 propriétés css sont barrées, comme si elles étaient écrasées, mais elles ne le sont pas (css et html vides). C'est comme si Chrome ne les acceptait plus.Vous devez appliquer une transformation 3D à l'élément afin qu'il obtienne son propre calque composite. Par exemple:
ou
En savoir plus sur les critères de création de couches, vous pouvez lire ici: Rendu accéléré dans Chrome
Une explication:
Exemples (survolez la case verte):
Lorsque vous utilisez une transition sur votre élément, le navigateur recalcule les styles, puis remodèle votre contenu même si la propriété de transition est visuelle (dans mes exemples, il s'agit d'une opacité) et peint finalement un élément:
Le problème ici est la remise en page du contenu qui peut faire un effet d'éléments «dansants» ou «clignotants» sur la page pendant la transition. Si vous allez dans les paramètres, cochez la case "Afficher les calques composites" puis appliquez la transformation 3D à un élément, vous verrez qu'il obtient son propre calque qui est entouré d'une bordure orange.
Une fois que l'élément a son propre calque, le navigateur a juste besoin de composer des calques lors de la transition sans re-disposition ni même des opérations de peinture, le problème doit donc être résolu:
la source
translateZ: 0.000001
(un # infinitésimal) et le tour est joué! Des images de fond nettes une fois de plus!J'ai eu le même problème avec l'iframe youtube intégré (les traductions étaient utilisées pour centrer l'élément iframe). Aucune des solutions ci-dessus n'a fonctionné jusqu'à ce que vous essayiez de réinitialiser les filtres css et que la magie se produise.
Structure:
Style [avant]
Style [après]
la source
filter: blur(0)
l'a fait pour moi!-webkit-
préfixe ne devrait-il pas précéder? Plus d'infosJ'ai recommandé un nouvel attribut CSS expérimental que j'ai testé sur le dernier navigateur et c'est bien:
Avec cela, le navigateur connaîtra l'algorithme de rendu
la source
image-rendering: -webkit-optimize-contrast;
résout le problème sur Chrome. Cependant, le rendu des images sur d'autres navigateurs, par exemple Firefox, est bien pire avec le jeu d'options de rendu. Par conséquent, je n'utilise que la directive WebKit, qui fonctionne également sur le moteur Blink. Merci!Je viens de trouver une autre raison pour laquelle un élément devient flou lorsqu'il est transformé. J'utilisais
transform: translate3d(-5.5px, -18px, 0);
pour repositionner un élément une fois qu'il avait été chargé, mais cet élément est devenu flou.J'ai essayé toutes les suggestions ci-dessus, mais il s'est avéré que c'était dû à l'utilisation d'une valeur décimale pour l'une des valeurs de traduction. Les nombres entiers ne causent pas le flou, et plus je m'éloignais du nombre entier, plus le flou devenait pire.
c'est-à-dire
5.5px
brouille le plus l'élément,5.1px
le moins.Je pensais juste que je jetterais ça ici au cas où ça aiderait quelqu'un.
la source
J'ai triché le problème en utilisant la transition par étapes, pas en douceur
Ce n'est pas une solution, c'est une triche et ne peut pas être appliqué partout.
Je ne peux pas l'expliquer, mais ça marche pour moi. Aucune autre réponse ne m'aide (OSX, Chrome 63, écran non Retina).
https://jsfiddle.net/tuzae6a9/6/
la source
La mise à l'échelle pour doubler et réduire de moitié avec a
zoom
fonctionné pour moi.la source
J'ai essayé environ 10 solutions possibles. Mélangez-les et ils ne fonctionnaient toujours pas correctement. Il y avait toujours une secousse 1px à la fin.
Je trouve la solution en réduisant le temps de transition sur le filtre.
Cela n'a pas fonctionné:
Solution:
Essayez ceci en violon:
J'espère que ça aidera quelqu'un.
la source
Essayer
filter: blur(0);
Ça a marché pour moi
la source
Pour moi, maintenant en 2018. La seule chose qui a résolu mon problème (une ligne blanche scintillante traversant une image en survol) était de l'appliquer à mon élément de lien contenant l'élément d'image qui a
transform: scale(1.05)
la source
J'ai été aidé en définissant la valeur des
.3s
étapes de synchronisation de transition égales de durée de transition.3s
la source
J'ai juste le même problème. Essayez de définir la position: par rapport à l'élément parent, cela a fonctionné pour moi.
la source