2010-03-05 25 views
42

E 'possibile utilizzare javascript per controllare quale fotogramma di un'immagine GIF mostra e/o interrompere l'animazione. Voglio poter caricare uno GIF con diversi frame e mostrare solo uno di essi.È possibile controllare l'animazione GIF con Javascript?

So che potrei farlo con un sacco di immagini separate, ma se posso fare quello che voglio con uno GIF, sarà solo un file di cui preoccuparsi.

+3

Puoi anche farlo con una grande immagine con sprite e mostrare solo sprite esatte ritagliando l'immagine – MBO

+1

D'accordo con @MBO, con gli sprite è abbastanza semplice, controlla questa domanda correlata: http://stackoverflow.com/questions/1736922/how-to-show-animated-image-from-png-image-using-javascript-like-gmail – CMS

+0

Usa video senza audio. proprio come 9gag – atilkan

risposta

9

È possibile farlo con una singola immagine utilizzando CSS sprites.

+3

Questo è vero fino a quando ciò che si vuole fare è dividere diverse variazioni di un'immagine attorno al piano 2D, e non dividerlo come fotogrammi separati. – Pointy

40

È possibile utilizzare la libreria libgif.

Consente di avviare/arrestare la gif e controllare su quale fotogramma è inserita la gif.

<script type="text/javascript" src="./libgif.js"></script> 
<img src="./example1_preview.gif" rel:animated_src="./example1.gif" 
width="360" height="360" rel:auto_play="1" rel:rubbable="1" /> 

<script type="text/javascript"> 
    $$('img').each(function (img_tag) { 
     if (/.*\.gif/.test(img_tag.src)) { 
      var rub = new SuperGif({ gif: img_tag }); 
      rub.load(function(){ 
       console.log('oh hey, now the gif is loaded'); 
      }); 
     } 
    }); 
</script> 

(la maggior parte del codice è presa direttamente dal loro esempio)

+0

Questo codice non sembra funzionare per me. Suona la gif con 'sup1.load()', quindi quando la gif è terminata, va al primo frame con 'sup1.move_to (frame)'. Ho anche provato a usare 'pause()' ma non sembra che blocchi la gif anche sul primo frame. Ho modificato il codice originale in modo che si fermi sul primo fotogramma, ma c'è un modo per mettere in pausa la gif sul primo fotogramma senza modificare il codice? –

+0

@LeoCHan Ho aggiornato il codice di esempio all'ultima API, provalo ora – Charlotte

+1

Questa risposta si rivolge alla domanda molto meglio di quella accolta. – Wortex17

16

lo uso x-gif è abbastanza fresco e facile da installare.

Da Github:

<x-gif src="probably_cats.gif"></x-gif> 

dove è possibile aggiungere quanto segue come attributi:

modalità
  • di riproduzione:
    • speed="1.0" (modalità predefinita) moltiplica la velocità in base al valore della attributo;
    • sync riporta la riproduzione a un oggetto esterno;
    • bpm="120" sincronizza GIF a battiti al minuto;
  • Opzioni:

    • stopped impedisce il GIF da animare;

    • fill causa l'espansione del GIF per coprire il contenitore;

    • n-times="3.0" (solo modalità velocità) arresta la riproduzione (aggiungendo l'attributo interrotto) dopo un determinato numero di volte;
    • snap (sincronizzazione solo & modalità bpm) anziché consentire a GIF più lunghe di sincronizzarsi con più battute, forzarle a inserirsi in una sola;
    • ping-pong riproduce la GIF fronte-retro e poi avanti-indietro;
  • debug:
    • debug attiva l'uscita debug dal Gif Exploder;
    • exploded interrompe la riproduzione e rende ogni frame fuori affiancato.
+0

Dalla loro pagina [Github] (https://github.com/geelen/x-gif) funziona come questo '': puoi aggiungere diversi attributi a questo tag con modalità di riproduzione, opzioni e debug. Ho provato a modificare la tua risposta fornendo un [riassunto con loro] (http://stackoverflow.com/review/suggested-edits/9071628), ma è stato rifiutato, se hai tempo, puoi modificarlo da solo. – Armfoot

+0

Grazie @Armfoot – insan3

+0

No, grazie insan3! :) – Armfoot

4

Se siete OK con la conversione del GIF a un foglio sprite, si può fare in questo modo (usando ImageMagick):

montage animation.gif -coalesce -tile x1 -geometry +0+0 -background None -quality 100 spritesheet.png 

E 'anche probabile che la nuova immagine sarà di dimensioni inferiori.

Una volta che hai un foglio sprite, usa l'animazione CSS. Un'animazione con un tempo di telaio fisso è qui utilizzato:

var el = document.getElementById('anim'); 
 
function play() { 
 
    el.style.animationPlayState = 'running'; 
 
} 
 
function pause() { 
 
    el.style.animationPlayState = 'paused'; 
 
} 
 
function reset() { 
 
    el.style.animation = 'none'; 
 
    el.offsetHeight; /* trigger reflow to apply the change immediately */ 
 
    el.style.animation = null; 
 
} 
 
function stop() { 
 
    reset(); 
 
    pause(); 
 
}
#anim { 
 
    background-image: url('https://i.stack.imgur.com/J5drY.png'); 
 
    width: 250px; 
 
    height: 188px; 
 
    animation: anim 1.0s steps(10) infinite; 
 
} 
 
@keyframes anim { 
 
    100% { background-position: -2500px; } 
 
}
<div id="anim" title="Animated Bat by Calciumtrice"></div> 
 
<button onclick="play()">Play</button> 
 
<button onclick="pause()">Pause</button> 
 
<button onclick="reset()">Reset</button> 
 
<button onclick="stop()">Stop</button>

Se si desidera che l'animazione non inizia automaticamente, aggiungere paused alla fine del animation regola.

+0

Questo è un modo fantastico e semplice per risolvere questo problema, gratz! – rafaelcastrocouto

Problemi correlati