CSS effet de transition rend l'image floue / déplacé de l'image de 1px, dans Chrome?

lorsque la div est survolée, un effet de transition CSS déplace la div.

le problème, comme vous pouvez le voir dans l'exemple, est que la transition 'translate' a l'horrible effet secondaire de faire bouger l'image dans le div par 1px vers le bas / droite (et peut-être redimensionner si légèrement?) de sorte qu'il semble hors de propos et flou...

le bug semble appliquer tout le temps l'effet de vol stationnaire est appliquée, et d'un processus d'essai et erreur que je peux dire en toute sécurité ne semble se produire lorsque la traduire de transition se déplace de la div (zone d'ombre et l'opacité sont également appliquées, mais pas de différence à l'erreur lors de la suppression).

2e édition: en fait, le problème n'est pas résolu!

en créant un JSFiddle pour illustrer le problème, je suis tombé sur une observation intéressante. Le problème ne se produit que lorsque la page a des barres de défilement. Ainsi l'exemple avec une seule instance de la div est bien, mais une fois de plus des divs identiques sont ajoutés et la page nécessite donc un scrollbar le problème frappe à nouveau...

des idées?!

125
demandé sur feeela 2013-03-17 21:47:28

12 réponses

avez-vous essayé cela dans CSS ?

.yourDivClass {
    /* ... */

    -webkit-backface-visibility: hidden;
    -webkit-transform: translateZ(0) scale(1.0, 1.0);
}

ce que cela fait est il rend la division à se comporter"plus 2D".

  • Backface est dessiné par défaut pour permettre de retourner des objets avec rotation et tel. Il n'y a pas besoin de cela si vous ne vous déplacez que vers la gauche, la droite, le haut, le bas, l'échelle ou la rotation (anti-)sens des aiguilles d'une montre.
  • traduit Z-axis pour avoir toujours une valeur zéro.

Modifier

Chrome maintenant les poignées backface-visibility et transform sans le préfixe -webkit- . Je ne sais pas actuellement comment cela affecte les autres navigateurs rendant (FF, IE), donc utilisez les versions non préfixées avec prudence.

226
répondu sampoh 2017-01-09 11:44:33

vous devez appliquer la transformation 3d à l'élément, pour qu'il obtienne sa propre couche composite. Par exemple:

.element{
    -webkit-transform: translateZ(0);
    transform: translateZ(0);
}

ou

.element{
    -webkit-transform: translate3d(0,0,0);
    transform: translate3d(0,0,0);
}

pour en savoir plus sur les critères de création de couches, vous pouvez lire ici: rendu accéléré en Chrome


une explication:

Exemples (hover zone verte):

lorsque vous utilisez n'importe quelle transition sur votre élément il cause navigateur pour recalculer les styles, puis re-layout votre contenu même si la propriété de transition est visuelle (dans mes exemples c'est une opacité) et finalement peindre un élément:

screenshot

la question ici est la mise en page du contenu qui peut faire un effet de" danse "ou" clignotement " des éléments sur la page pendant que la transition se produit. Si vous allez dans Paramètres, cochez la case "Afficher les couches composites" et appliquez ensuite la transformation 3d à un élément, vous verrez qu'il possède sa propre couche qui est délimitée par une bordure orange.

screenshot

après element obtient sa propre couche, le navigateur a juste besoin de couches composites sur la transition sans re-layout ou même opérations de peinture donc le problème doivent être résolus:

screenshot

83
répondu sol0mka 2015-05-08 00:34:54

a eu le même problème avec embededed youtube iframe (traductions ont été utilisées pour le centrage de l'élément iframe). Aucune des solutions ci-dessus n'a fonctionné jusqu'à ce que essayé Réinitialiser les filtres css et la magie s'est produite.

de la Structure:

<div class="translate">
     <iframe/>
</div>

Style [avant]

.translate {
  transform: translateX(-50%);
  -webkit-transform: translateX(-50%);
}

Style [après]

.translate {
  transform: translateX(-50%);
  -webkit-transform: translateX(-50%);
  filter: blur(0);
  -webkit-filter: blur(0);
}
35
répondu xb1itz 2015-02-17 15:48:42

j'ai recommandé un nouvel attribut expérimental CSS que j'ai testé sur le dernier navigateur et il est bon:

image-rendering: optimizeSpeed;             /*                     */
image-rendering: -moz-crisp-edges;          /* Firefox             */
image-rendering: -o-crisp-edges;            /* Opera               */
image-rendering: -webkit-optimize-contrast; /* Chrome (and Safari) */
image-rendering: optimize-contrast;         /* CSS3 Proposed       */
-ms-interpolation-mode: nearest-neighbor;   /* IE8+                */

avec ceci le navigateur connaîtra l'algorithme pour rendre

27
répondu Felipez 2015-05-08 00:21:04

Essayer filter: blur(0);

Il a travaillé pour moi

2
répondu Fred K 2017-06-05 14:15:40

vient de trouver une autre raison pour laquelle un élément devient flou quand 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û à moi en utilisant une valeur décimale pour une des valeurs de traduction. Des nombres entiers ne causent pas le flou, et plus je m'éloignais du nombre entier, plus le flou devenait mauvais.

i.e. 5.5px brouille l'élément le plus, 5.1px le moins.

j'ai pensé jeter ça ici au cas où ça aiderait quelqu'un.

2
répondu ashrobbins 2017-12-14 10:11:57

j'ai triché problème en utilisant la transition par étapes ,pas en douceur

transition-timing-function: steps(10, end);

Ce n'est pas une résolution, c'est une tricherie et peut être appliquée partout.

Je ne peux pas l'expliquer, mais ça marche pour moi. Aucune autre réponse ne m'aide (OSX, Chrome 63, affichage Non rétinien).

https://jsfiddle.net/tuzae6a9/6 /

2
répondu Evgeny Gendel 2018-01-12 19:15:14

mise à l'Échelle à double et à ramener à la moitié avec zoom a fonctionné pour moi.

transform: scale(2);
zoom: 0.5;
1
répondu Kushagra Gour 2016-05-11 10:42:33
filter: blur(0)
transition: filter .3s ease-out
transition-timing-function: steps(3, end) // add this string with steps equal duration

j'ai été aidé par le réglage de la valeur de durée de la transition .3s l'égalité calendrier de transition étapes .3s

0
répondu j-tap 2018-03-01 09:13:40

j'ai essayé environ 10 solutions possibles. Mixte et ils ne fonctionne toujours pas correctement. Il y avait toujours 1 px secouer à la fin.

je trouve la solution en réduisant le temps de transition sur le filtre.

ça n'a pas marché:

.elem {
  filter: blur(0);
  transition: filter 1.2s ease;
}
.elem:hover {
  filter: blur(7px);
}

Solution:

.elem {
  filter: blur(0);
  transition: filter .7s ease;
}
.elem:hover {
  filter: blur(7px);
}

Essayez ceci dans le violon:

.blur {
  border: none;
  outline: none;
  width: 100px; height: 100px;
  background: #f0f;
  margin: 30px;
  -webkit-filter: blur(10px);
  transition: all .7s ease-out;
  /* transition: all .2s ease-out; */
}
.blur:hover {
  -webkit-filter: blur(0);
}

.blur2 {
  border: none;
  outline: none;
  width: 100px; height: 100px;
  background: tomato;
  margin: 30px;
  -webkit-filter: blur(10px);
  transition: all .2s ease-out;
}
.blur2:hover {
  -webkit-filter: blur(0);
}
<div class="blur"></div>

<div class="blur2"></div>

j'espère que cela aidera quelqu'un.

0
répondu Adam Orlov 2018-03-21 11:51:26

pour moi, maintenant en 2018. La seule chose qui a corrigé mon problème (une ligne blanche glitchy-flicker courant à travers une image en stationnaire) a été d'appliquer ceci à mon élément de lien contenant l'élément d'image qui a transform: scale(1.05)

a {
   -webkit-backface-visibility: hidden;
   backface-visibility: hidden;
   -webkit-transform: translateZ(0) scale(1.0, 1.0);
   transform: translateZ(0) scale(1.0, 1.0);
   -webkit-filter: blur(0);
   filter: blur(0);
}
a > .imageElement {
   transition: transform 3s ease-in-out;
}
0
répondu mateostabio 2018-04-29 02:12:54

vient d'avoir le même problème. Essayez de définir la position:par rapport à l'élément parent, cela a fonctionné pour moi.

-6
répondu Martin 2013-03-24 21:23:10