2009-10-27 5 views
5

Ich möchte jQuery verwenden, um die Notwendigkeit der Verwendung eines GIFs zu entfernen, um eine ziemlich einfache Animation zu erstellen.jQuery GIF Animationen

Was ich will, ist ein Bild mit vier Stufen. 1) Nichts zeigt 2) Der erste Teil des Bildes 3) Zweiter Teil des Bildes 4) Dritter Teil des Bildes - Start über

Ich dachte, ich würde brauchen, um die Bildstufen erstellen Verwenden Sie dann die Methode "Ersetze das aktuelle Bild durch die nächste" mit jQuery, um die Animation zu erstellen. Das könnte mit Rückrufen recht einfach sein.

Der nächste Teil besteht darin, diese Animation an mehreren Stellen erscheinen zu lassen, nachdem die vorherige Animation geladen wurde. Noch einmal, könnte mit Rückrufen leicht sein.

Ich war nach ein paar Gedanken dazu. Ist es dumm, nicht nur GIFs zu benutzen? Oder könnte das mit jQuery gemacht werden?

Antwort

0

Zuerst können Sie den Hintergrund von mehreren div verwenden Sie das Teil des Bildes setzen Sie

css_background-position

benötigen, dann müssen Sie die div zeigen, wie Sie in Abhängigkeit von der Art der Animation angezeigt werden müssen, was Sie brauchen .

0

Verwenden Sie animierte GIFs - dafür sind sie gemacht. Ich bin mir sicher, dass es möglich ist, eine Lösung mit JQuery zusammen zu hacken, aber Sie würden in der Entwicklungszeit und -komplexität Kosten tragen.

Darüber hinaus sollten Sie erkennen, dass Sie mit einer benutzerdefinierten JQuery/CSS-Lösung entscheiden, Ihre Animation eng mit der Seite zu verknüpfen, auf der sie sich befindet. Was ist, wenn jemand die Animation auf einer anderen Seite einbinden möchte? Sie müssten statt einer einzelnen GIF-Datei eine Menge Code kopieren. Was ist, wenn jemand es in eine E-Mail- oder PowerPoint-Präsentation einbinden möchte? Kann nicht gemacht werden ...

+0

Gifs sind UGLY und sie sind Vergangenheit, keine Alphamap, mit soliden Matte auf transparenten Hintergründen. mit bg positionierung von css sprites kannst du viel mehr erreichen als mit gifs. – Sinan

+0

Wenn ein transparenter Hintergrund oben auf einem nicht-durchgehenden Hintergrund eine wichtige Überlegung in diesem Fall ist, dann gehen Sie ja mit der leistungsfähigeren JQuery-Sprite-Lösung. Aber die Sache, die Sie erkennen müssen, ist, dass Sie damit eine Steuer in zusätzlicher Komplexität bezahlen. Denken Sie an die schlechte Wartung Coder, der in den Code gehen muss, um die Grafik in ein paar Jahren zu ändern. Ist es fair anzunehmen, dass sie JQuery und CSS-Sprites gut verstehen werden? Sie wissen das vielleicht, aber ich denke, es wäre viel einfacher, sie einfach in ein neues GIF einzuladen und damit fertig zu werden. –

+0

yep du hast Recht, es ist ressourcenintensiver als Gifs, aber wir sind auf dem Weg nach 2010, sie sollten es lieber lernen :) – Sinan

0

Wenn es konstant und nicht ereignisgesteuert ist, würde ich empfehlen, Gifs zu verwenden.

Wenn die Animation jedoch als Reaktion auf etwas geschieht, das auf der Seite passiert, oder wenn sie nur starten soll, nachdem alles geladen ist, dann ist jQuery wahrscheinlich der richtige Weg.

Sie sollten nur in der Lage sein, die Bildquelle (oder die Positionsverschiebung, wenn Sie ein einzelnes Bild verwenden) zu ändern, um das Bild zu ändern. Sehen Sie sich some "pause" options in jQuery an, um Änderungen zwischen Bildern zu verzögern.

Ungeprüfte Beispiel (abgeleitet von Simons Antwort in dem obigen Link):

function chg1() { $('#myimage').attr('src', ''); } 
function chg2() { $('#myimage').attr('src', 'image1src.jpg'); } 
function chg3() { $('#myimage').attr('src', 'image2src.jpg'); } 
function chg4() { $('#myimage').attr('src', 'image3src.jpg'); } 

function StartAnimation() { 
    setTimeout(chg1, 2000); // blank after 2 seconds 
    setTimeout(chg2, 4000); // img 1 after 4 seconds 
    setTimeout(chg3, 6000); // img 2 after 6 seconds 
    setTimeout(chg4, 8000); // img 3 after 8 seconds 
    setTimeout(StartAnimation, 8000); // start again after 8 seconds 
} 

StartAnimation(); // start it off 
+0

sieht aus wie die Aufrufe zu 'animate' werden gut genug, aber die Änderungen auf die 'src', da sie nicht als Callback zu Ihren Animationen auftreten, werden alle sofort nacheinander ausgelöst? – Funka

+0

@Funka - du hast recht, Animate blockiert nicht. Ich werde den Code ändern. – Damovisa

+0

Ja, @Funka hat Recht. jQuery ist asynchron, daher müssen Sie stattdessen Callbacks verwenden. –

0

Wäre es möglich, Ihre vier Bilder zu einem Sprite zu kombinieren (1 echte Grafik mit allen vier Bildern enthalten & nicht überlappend)? Aus Performance-Sicht muss der Browser des Kunden nur ein einzelnes Bild herunterladen, statt vier Anfragen für jedes Ihrer vier Bilder zu stellen.

Erstellen der Animation wäre so einfach wie die oben von Damovisa vorgeschlagene Technik, nur mit einem Blockelement, dieses einzelne Bild als Hintergrund setzen und die Größe des Elements auf die Größe einer "Kachel" einstellen des einzelnen Bildes und Ändern der css-Eigenschaft der Hintergrundposition. Ich bin mir da nicht ganz sicher (bitte korrigiere mich, wenn ich falsch liege), aber es scheint eine weniger teure Operation zu sein, ein Hintergrundbild zu verschieben, anstatt vier verschiedene Bilder auszuwechseln.

In Bezug auf Portabilität und Wiederverwendbarkeit können Sie einfach ein jQuery-Plugin erstellen, um es an mehreren Stellen verwenden zu können.

3

Das ist viel einfacher und pflegt Ketten Fähigkeit:

JQuery:

$(document).ready(function(){ 
    //rotator - delay, children 
    $('#slideshow').rotator(50, 'img'); 
}); 

Markup:

<script type="text/javascript" src="http://code.jquery.com/jquery-1.5.min.js"></script> 
<script type="text/javascript" src="scripts/jquery.rotator.js"></script> 

<style type="text/css"> 
#slideshow { 
    position:absolute; //or whatever you need 
    display:block; 
    top:0px; 
    left:0px; 
} 
#slideshow img { 
    position:absolute; 
    opacity:0; 
} 
</style> 

<!-- SLIDESHOW --> 
<div id="slideshow"> 
    <img src="images/1.png"> 
    <img src="images/2.png"> 
    <img src="images/3.png"> 
</div> 

Plugin:

(function($){ 
    $.fn.rotator = function(delay, child){ 
     //set curImage val 
     var currImg = 0; 
     var currIt = true; 
     //set array of images 
     var ss = $('#slideshow').children(child); 
     var ssize = ss.size(); 
     setInterval(function() { 
      if(currIt){ 
       $(ss[currImg]).css('opacity','1'); 
       currIt = !currIt; 
      }else if (!currIt){ 
       $(ss[currImg]).css('opacity','0'); 
       $(ss[currImg+1]).css('opacity','1'); 
       currIt = !currIt; 
       currImg++; 
      } 
      //reset 
      if(currImg >= ssize){ 
       currImg = 0; 
       $(ss[currImg]).css('opacity','1'); 
      } 
     }, delay); 
     return this; 
    }; 
})(jQuery); 
+0

Dies ist eine großartige Lösung, ich arbeite an einem smilaren Projekt und habe diesen Code verwendet, aber es ist ein Problem aufgetreten. Ich habe eine 9-Sekunden-Animation über eine Bildsequenz exportiert und muss 300 Bilder durchlaufen. Das funktioniert super, die Diashow bleibt jedoch hängen. Gibt es eine Möglichkeit, Bilder vorab zu laden, so dass die Diashow startet, sobald die Bilder geladen sind? – TechyDude