39 votes

Très difficile à résoudre et étrange problème de transition d'opacité en CSS3 (... doit être un bug?)

Je suis absolument en train de m'arracher les cheveux avec ce problème CSS hautement frustrant et étrange que je suis en train de rencontrer.

J'utilise le squelette Bones pour créer un site web, et tout se passait bien, jusqu'à maintenant...

Il utilise un système de grille fluide et j'ai récemment essayé de créer une galerie simple que j'ai transformée en grille (4 images, chacune enveloppée dans un quart de colonne, avec des classes first/last ajoutées aux premières/dernières images).

Si vous survolez les images (surtout les trois premières pour une raison quelconque), vous remarquerez qu'elles changent de largeur d'un ou deux pixels pour une raison folle. Les images sont définies avec max-width:100%, et j'ai l'impression que c'est en quelque sorte le coupable, car si vous attribuez aux images une largeur "fixe" (exemple .gallery-icon img {max-width:165px;}, cela résout le problème, mais étant donné qu'il s'agit d'un système de grille fluide, je ne peux pas emprunter cette voie, car les images restent à 165px lorsque vous redimensionnez le navigateur, et même si je définis 4 largeurs différentes en fonction des médias, entre ces tailles de médias, les images ne s'alignent pas correctement.

Si ce n'était pas pour le problème de l'effet de transition (si je désactive la transition, les images baissent l'opacité correctement, mais sans animation), cela fonctionnerait comme je le souhaite :(

S'il vous plaît les gars, aidez-moi!

Voici un site de démonstration vide sur lequel le squelette Bones est utilisé et rien de plus que la galerie sur la page. Faites-moi savoir si vous rencontrez le problème de secousses.

(Je n'ai pas pu le recréer sur jsfiddle, donc je l'ai installé sur un vieux domaine que j'avais laissé trainer hehe)

EDIT: Je viens de remarquer que le problème semble se produire avec les images qui sont plus grandes que la div en largeur et en hauteur. Les images 1 + 3 ont ce problème, alors que les images 2,4 semblent correctes? et les images 2+4 ont une hauteur plus petite que la div..... Mais même si je définis une max-hauteur pour les images, le problème persiste..

EDIT2: Ajout d'une vidéo rapide pour montrer le problème (dernière version de Firefox et Chrome) http://www.youtube.com/watch?v=uL81hLfMvvw

0 votes

La démonstration semble fonctionner correctement sur Google Chrome v24.0.1312.57

0 votes

Veuillez vérifier à nouveau, en utilisant Chrome sur différents ordinateurs, je suis convaincu que ce n'est pas seulement un problème avec mon ordinateur. Survolez les images 1+3 et regardez attentivement le bord droit des images. C'est subtil mais lorsque vous avez beaucoup d'images faisant la transition sur l'écran chaque fois qu'une transition se produit (flexslider défile une diapositive), c'est visible et ça ne rend pas bien :( (j'ai utilisé la même Version 24.0.1312.57 m)

0 votes

Je le vois sur Chrome 24.0.1312.57

101voto

2called-chaos Points 1104

Merci à vals d'avoir souligné l'aspect du GPU... Cela m'a rappelé ce snippet CSS qui tend à résoudre les problèmes de rendu dans Chrome:

-webkit-transform: translateZ(0);

J'ai appliqué ceci au conteneur (div.post) contenant l'élément problématique (i.icon-) qui a une largeur fractionnée, problème résolu!

Crédit: J'ai obtenu cette solution de cette réponse pour corriger les éléments incorrectement rendus (fixés) après avoir navigué vers une ancre de page.

0 votes

Travaillant ici aussi pour mon opacité animée.

0 votes

Merci - cela a résolu une de mes questions concernant un carrousel Bootstrap avec une transition d'opacité : stackoverflow.com/questions/19499404/…

0 votes

De manière étonnante, ce bug se produit même si la transition de l'opacité est appliquée à un élément différent qui chevauche l'élément bogué. La solution a fonctionné pour moi, merci!

15voto

vals Points 12518

Je dirais que c'est vraiment un bug dans Chrome (j'utilise la version 24.0.1312.57 m).

Le problème ne se situe pas vraiment sur les images 1 + 3, je l'ai vu sur l'image numéro 2.

Je pense que le problème survient lorsque vous avez la largeur de l'image en une fraction (disons 146,71 px). En affichage fixe, cela est arrondi à 146 px. En transition, cela est arrondi vers le haut (plus correctement !) à 147 px.

0 votes

Cela aurait tout son sens, et je pense que c'est exactement le problème. Très frustrant de se rendre compte mais vrai ! Cela expliquerait pourquoi définir une largeur à un nombre rond (165px) corrige le problème.

0 votes

Pendant ce temps, j'ai vérifié cela dans Canary. Le problème est également présent, mais disparaît lorsque vous désactivez l'accélération GPU. Ainsi, le problème serait un rendu différent lorsque le GPU (pour l'animation) entre en jeu.

12voto

isaldarriaga Points 26

Utilisez l'indice CSS suivant pour promouvoir l'élément affecté vers une nouvelle couche composite (Cela a résolu exactement le même problème pour moi) :

. {
will-change: ;}
</code></pre>

<p>Cela indique au compositeur d'isoler le processus de peinture de l'élément dans une nouvelle couche composite. Lors de l'inspection des couches dans les outils de développement Chrome, vous pouvez vérifier que l'élément a été promu et donc que le problème est résolu. L'élément apparaîtra dans une nouvelle couche avec les raisons de composition suivantes : a une animation ou une transition accélérée active. A un indice de composition de type will-change.</p>

<p>Il semble qu'après avoir promu l'élément vers une nouvelle couche de cette manière, le navigateur est capable de rendre correctement l'état final de la transition.</p>

<p>Ivan.</p></x-turndown>

1 votes

Cette fonctionnalité n'existait pas à l'époque où cette question a été posée. Mais elle fonctionne maintenant depuis Chrome 36 et FF 36 (liens).

1 votes

Cette réponse est la meilleure - elle ne nécessite pas d'ajouter -webkit-transform: translateZ(0) à l'élément parent.

4voto

Mr Br Points 213

Sur ce lien, vous pouvez trouver la solution pour le bug de Mozilla.

Vous devez ajouter 1 règle CSS :

-moz-backface-visibility: hidden;

1voto

Tammy Shipps Points 237

Je suggère d'utiliser jQuery pour gérer votre opacité plutôt que d'utiliser les attributs CSS3 car vous avez raison que votre max-width perturbe malheureusement vos transitions.

$(".gallery-icon img").hover(function(){
    $(this).fadeTo(fast, 0.7);
}, function(){
    $(this).fadeTo(fast, 1.0);
});

Utiliser jQuery résoudra bon nombre de ces petits problèmes avec les transitions et s'assurera que votre changement d'opacité est effectué de manière compatible avec tous les navigateurs (oui, je sais qu'il y a beaucoup de balises pour les transitions pour les navigateurs, mais il n'y a pas d'attributs pour tous les navigateurs.) :) J'espère que cela vous aidera!

0 votes

Merci pour cela Tammy, très utile en effet :) À contrecoeur (j'aime le css), je vais devoir aller avec jQuery.

0 votes

Pas de problème! Je préfère aussi le CSS, mais tous les bugs ne seront jamais complètement corrigés, n'est-ce pas? Peut-être un jour!

0 votes

Ce méthode affecte la taille des éléments lors de l'animation dans Chrome. Lorsque l'élément apparaît, il semble s'animer en ajustant la largeur et la hauteur de 0 à 100%.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X