Façon correcte de réinitialiser une animation GIF avec affichage: aucun sur Chrome
Titre est explicite, mais je vais prévoir une étape-par-étape sur la question. J'espère que je ne suis pas le premier à l'avoir remarqué (apparemment) bug sur Webkit/Chrome.
Je veux réinitialiser une animation GIF. Tous les exemples que j'ai vu jusqu'à présent, soit il suffit de régler la src
de l'image pour elle-même ou une chaîne vide suivie de l'original src
de nouveau.
Prendre un coup d'oeil à ce JSFiddle de référence. Le GIF rétablit parfaitement bien sur IE, Firefox et Chrome.
Le problème que j'ai, c'est quand l'image a display:none
sur Google Chrome n'.
Cochez cette JSFiddle. Le GIF réinitialise correctement sur IE et Firefox avant d'être affiché sur la page, mais Chrome refuse tout simplement de réinitialiser son animation!
Ce que j'ai essayé jusqu'à présent:
- Réglage de la
src
à lui-même comme dans son Violon, ne fonctionne pas sous Chrome. - Réglage de la
src
à une chaîne vide et la restauration de la valeur par défaut, cela ne fonctionne pas. - Mettre un wrapper autour de l'image, de la vidange du conteneur par
.html('')
et de mettre l'image à l'intérieur d'elle, ne fonctionne pas non plus. - La modification de la
display
de l'image à travers.show()
ou.fadeIn()
juste avant le réglage de lasrc
ne fonctionne pas non plus.
La seulement solution de contournement que j'ai trouvé jusqu'à présent est de garder l'image et sa valeur par défaut display
et de les manipuler à travers .animate()
ing et .css()
ing l'opacité, la hauteur et la visibilité nécessaire pour simuler un display:none
comportement.
La raison principale (contexte) de cette question est que j'ai voulu réinitialiser un ajax loader GIF droite avant de disparaître dans la page.
Donc ma question est, est-il une bonne façon de réinitialiser une image GIF animation (ce qui évite de google Chrome display:none
"bug") ou est-il réellement un bug?
(ps. Vous pouvez changer le GIF dans les violons pour un plus approprié/plus d'animation gif pour les tests)
source d'informationauteur Fabrício Matté
Vous devez vous connecter pour publier un commentaire.
Chrome traite avec des changements de style différemment que les autres navigateurs.
Dans google Chrome, lorsque vous appelez
.show()
sans argument, l'élément n'est pas réellement montré tout de suite à droite où vous appeler. Au lieu de cela, Chrome files d'attente l'application du nouveau style pour l'exécution après l'évaluation de l'actuel morceau de JavaScript, tandis que d'autres navigateurs appliquer le nouveau style de la changer immédiatement..attr()
cependant, n'est pas mis en file d'attente. Si vous tentez de définir lasrc
lorsque l'élément n'est pas encore visible en fonction de Chrome et de Chrome de ne pas faire quoi que ce soit lorsque l'originalsrc
et de nouvellessrc
sont les mêmes.Au lieu de cela, ce que vous devez faire est de s'assurer que jQuery définit la
src
aprèsdisplay:block
est appliquée. Vous pouvez faire usage desetTimeout
pour obtenir cet effet:Cela garantit que
src
est définie aprèsdisplay:block
a été appliqué à l'élément.La raison pour laquelle cela fonctionne est parce que setTimeout files d'attente de la fonction pour l'exécution plus tard (cependant, à long plus tard l'est), donc la fonction n'est plus considéré comme faisant partie de l'actuelle "morceau" de JavaScript, et il fournit un écart de Chrome à rendre et à appliquer les
display:block
d'abord, ce qui rend l'élément visible avant sonsrc
attribut est défini.Démo: http://jsfiddle.net/F8Q44/19/
Grâce à shoky en #jquery de freenode IRC pour la fourniture d'une simple réponse.
Alternativement, vous pouvez forcer un rafraîchissement à vider le groupées des changements de style. Cela peut être fait, par exemple, en accédant à l'élément
offsetHeight
propriété:Démo: http://jsfiddle.net/F8Q44/266/
Le moyen le plus fiable pour "réinitialiser" un GIF est en ajoutant un hasard de la chaîne de requête. Toutefois, cela ne signifie pas que le GIF sera retéléchargé à chaque fois donc, assurez-sûr que c'est un fichier de petite taille.
Ce solution met le gif et le prend de la dom et puis retour à la src (évitant ainsi un autre téléchargement)
Je l'ai juste testé à l'aide de jquery pour supprimer l'attribut et il fonctionne très bien.
Exemple:
Juste parce que j'ai encore besoin de ce que chaque maintenant et puis j'ai pensé que la pure JS-je utiliser la fonction peut être utile pour quelqu'un d'autre. C'est un pur JS façon de redémarrage d'un gif animé, sans la recharger. Vous pouvez appeler à partir d'un lien et/ou le document de l'événement load.
Sur certains navigateurs, vous avez seulement besoin de réinitialiser le img.src pour lui-même et il fonctionne très bien. Sur IE vous besoin de le vider avant de le réinitialiser. Cette resetGif() récupère le nom de l'image à partir de l'id de l'image. C'est pratique dans le cas où vous changez le réel lien de l'image pour un identifiant donné parce que vous n'avez pas à vous rappeler de changer le resetGiF() appelle.
--Nico
voici mon hack pour les images d'arrière-plan:
Cela semblait fonctionner pour moi dans Chrome, il s'exécute à chaque fois juste avant que j'ai fondu dans l'image et efface ensuite les recharges de la src et de mon animation démarre maintenant à partir de début à chaque fois.
J'ai un bouton avec une animation sans boucle de l'image. Je viens de recharger l'image, jquery et cela semble fonctionner pour moi.
Je suis tombé sur ce fil après avoir cherché beaucoup d'autres. David Bell post m'a conduit à la solution que j'ai besoin.
Je pensais que je poste mon expérience dans le cas où il pourrait être utile pour ceux qui cherchent à accomplir ce que je recherchais. Ceci est pour le HTML5/JavaScript/jQuery web app qui sera une application iPhone via PhoneGap. Les essais en Chrome.
L'Objectif:
B, gif animé devrait réapparaître et de lire à partir du début.
Le Problème:
Puis, appuyez/cliquez sur le bouton A, après appuyez/cliquez sur le bouton B, j'ai été re-ajouter le chemin d'accès pour le gif que la src.
- Cela ne fonctionne pas. Le gif se présentent sur les robinets/clics de bouton...cependant, plus j'ai tapoté/cliqué sur le bouton A, le plus de fois le gif serait de charger et de recommencer. C'est, si je suis allé en arrière et en avant, en appuyant sur/en cliquant sur le bouton A puis sur le bouton B 3 fois, le gif semblerait puis sur start/stop/start 3 fois...et mon ensemble de l'application a commencé à souffler. Je suppose que le gif a été chargé à plusieurs reprises, même si j'avais mis de la src à une chaîne vide lorsque le bouton B a été mis sur écoute/cliqué.
La Solution:
Après avoir regardé David Bell post, je suis arrivé à ma réponse.
Tout comme David l'a suggéré, je l'ai fait (en plus d'un ajout):
ENSUITE, dans la fonction de la touche B, j'ai mis la src à une chaîne vide, puis retiré de la div contenant le gif:
Maintenant, je peux appuyez/cliquez sur le bouton A puis sur le bouton B bouton A, etc., tout au long de la journée. Le gif charges et joue sur appuyez/cliquez sur le bouton A, puis se cache sur appuyez/cliquez sur le bouton B, puis charge et joue depuis le début sur d'autres robinets de bouton A chaque fois sans aucun problème.
J'ai travaillé sur une solution complète de ce problème. Il peut être trouvé ici: https://stackoverflow.com/a/31093916/1520422
Ma solution redémarrage de l'animation, SANS re-chargement de l'image des données à partir du réseau.
Cela renforce également l'image de la repeindre pour fixer la peinture des artefacts qui s'est produit (dans chrome).
J'ai eu des problèmes avec toutes les solutions ci-dessus. Ce qui a fonctionné a été le remplacement de la src temporairement avec un transparent 1px gif:
Il a été plusieurs années et j'ai décidé de revisiter ce depuis que nous avons un certain nombre de nouvelles options à notre disposition.
Le problème avec ma réponse précédente est qu'il force un re-téléchargement du fichier GIF à chaque fois que vous souhaitez re-démarrer. Tout c'est très bien pour les petits fichiers, c'est toujours une surcharge qui est à éviter si possible.
Avec cela à l'esprit, j'ai une nouvelle solution qui utilise AJAX pour télécharger le GIF une fois, et puis les convertit en données d'URL (par l'intermédiaire d'un FileReader) et l'utilise comme la source avec un nombre aléatoire de chaîne de requête ci-joint.
De cette façon, le navigateur n'a jamais télécharge l'image une fois, et peut même mettre en cache correctement, et que le "reset" tire à partir de ce pré-téléchargé ressource.
Le seul hic, bien sûr, est que vous devez vous assurer qu'il est correctement chargé avant de pouvoir l'utiliser.
Démo: http://adamhaskell.net/misc/numbers/numbers.html
Code: