2012-06-22 5 views
5

Ich habe diesen Text folgende Jquery fly-in animation.Here mein Code, bevor ich weiter erklären:JQuery Textanimation Verzögerungsfunktion nicht funktioniert

<script type="text/javascript"> 

$(document).ready(function(){ 

    $('.flying1 .flying-text').css({opacity:0}); 
    $('.flying1 .active-text').animate({opacity:1, marginLeft: "0px"}, 1200); //animate first text 
    var int = setInterval(changeText, 3500); // call changeText function every 5 seconds 

function changeText(){ 
    var $activeText = $(".flying1 .active-text");  //get current text  
    var $nextText = $activeText.next(); //get next text 

    if ($activeText.is('.end')) { 
     $activeText.stop().delay(5000); 
     $('.flying1').html('<div class="flying-text active-text">Text4<div> 
           <div class="flying-text">Text5</div> 
           <div class="flying-text end2">Text6</div>'); 
     $('.flying1 .flying-text').css({opacity:0}); 
     $('.flying1 .active-text').animate({opacity:1, marginLeft: "0px"}, 1200); //animate first text 
    }; 

    if ($activeText.is('.end2')) { 
     $activeText.stop().delay(5000); 
     $('.flying1').html('<div class="flying-text active-text">Text1<div> 
           <div class="flying-text">Text2</div> 
           <div class="flying-text end">Text3</div>'); 
     $('.flying1 .flying-text').css({opacity:0}); 
     $('.flying1 .active-text').animate({opacity:1, marginLeft: "0px"}, 1200); //animate first text 
    }; 

    $nextText.css({opacity: 0}).addClass('active-text').animate({opacity:1, marginLeft: "0px"}, 1200, function(){ 

     $activeText.removeClass('active-text');           
    }); 
} 
}); 
</script> 

HTML

<div class="flying-text active-text">Text1<div> 
<div class="flying-text">Text2</div> 
<div class="flying-text end">Text3</div> 

Nun, wie Sie sehen können, , Text1-3 animiert/fliegt zuerst ein, dann, wenn Text3 erreicht ist, werden sie durch Text4-6 in der Animation ersetzt, wenn Text6 wieder erreicht wird, springt es wieder zu Text1-3 ... Nun, im Grunde, was ich will Wenn Sie das Ende des Texts erreichen, wird die Animation für einen längeren Zeitraum angehalten/verzögert, also in Text3 (class = "fliegende Text Ende") ") und Text6 (class =" fliegender Text end2 "). Ich möchte Text3 und Text6 länger animieren als alle anderen. wie mache ich das? Der Code, den ich verwendet:

$activeText.stop().delay(5000); 

nicht ...

Sie funktioniert Vielen

+0

Ihre Zitate falsch verschachtelt sind. Kannst du ein Beispiel auf http://jsfiddle.net erstellen? –

+0

http: // jsfiddle.net/pB8zp/8/ –

+0

soll Text3 bis zum Beginn des nächsten Zyklus auf dem Bildschirm bleiben? – Alnitak

Antwort

3

Ich glaube, Sie Dinge zu kompliziert für sich selbst gemacht haben.

Sie müssen nur normale setTimeout verwenden, um die nächste Animation auszulösen, aber tun Sie das innerhalb der Animation "complete" -Funktion, um sicherzustellen, dass Sie Animationstimer nicht mit normalen Timern mischen.

Sie sollten auch setInterval aus dem gleichen Grund vermeiden - es wird nicht mit Animationszeitgebern synchron sein, insbesondere wenn die jQuery-Autoren wieder auf zurückgreifen.

Hier ist meine Lösung:

var text = [ 
    ['Text1', 'Text2', 'Text3'], 
    ['Text4', 'Text5', 'Text6'] 
    ]; 

var n = 0, 
    page = 0; 
var $f = $('.flying-text'); 

function changeText() { 
    $f.eq(n).text(text[page][n]).css({ 
     opacity: 0, 
     marginLeft: '-50px' 
    }).animate({ 
     opacity: 1, 
     marginLeft: "0px" 
    }, 1200, function() { 
     if (++n === 3) { 
      page = 1 - page; 
      n = 0; 
      setTimeout(function() { 
       $f.empty(); 
       changeText(); 
      }, 6000); 
     } else { 
      setTimeout(changeText, 2000); 
     } 
    }); 
}; 

changeText();​ 

Arbeits Demo auf http://jsfiddle.net/alnitak/GE2gN/

Beachten Sie, dass diese vollständig den Textinhalt aus der Animation Logik trennt.

+0

Das sieht gut aus, hoffentlich wird Dexter zustimmen. Ich verbrachte ewig damit, an Zeitüberschreitungen und Intervallen herumzuhacken und konnte es nur weiter oben als oben bekommen. –

+0

Ehrfürchtig. Es ist genau das, was ich brauche. Schätzen Sie Ihre Hilfe und Ihren Einsatz. Problem ist, ich habe versucht, es auf meiner Webseite zu implementieren, aber es funktioniert nicht. Ich habe es wie es ist verwendet, alles ist doppelt vorhanden, aber es erscheint kein Text. Ich benutze ein paar andere Preloader-Skripte und einige andere jquery-Funktionen, also weiß ich nicht, ob sie kollidieren. Irgendwelche Vorschläge? –

+0

@DexterSchneider das ist knifflig - ist deine Seite überall öffentlich? – Alnitak

1

Es gibt eine ähnliche Frage hier:

delay JQuery effects

In den Kommentaren der zweiten antwort es sagt, dass Verzögerung nicht mit Stop funktioniert.

Ich hoffe, diese Seite ist nützlich für Sie.

EDIT OK, ich habe eine Lösung gefunden. Probieren Sie das aus und lassen Sie mich wissen, ob es geeignet ist.

Ersetzen Sie Ihre Verzögerungsleitungen mit diesem:

$(this).animate('pause').delay(5000).animate('resume'); 
+0

Hi. Ich habe diese Funktion für verschiedene Elemente und verschiedene Implementierungen ausprobiert, aber die Hauptfunktion/Animation überschreibt sie immer noch. Irgendwelche Hinweise? Würde es wirklich zu schätzen wissen. Ich habe wirklich versucht –

+0

Können Sie ein praktisches Beispiel auf jsfiddle.net machen? Dann kann ich es mir besser ansehen. –

+0

Hallo. Hier ist ein funktionierendes Beispiel. http://jsfiddle.net/pB8zp/8/ Was ich im Grunde tun möchte, ist die letzten Textelemente ein wenig länger zu pausieren (das ist Text 3 und Text6). Danke! –

1

Queue Ihre Animationen und verwenden .delay() auf eine gemeinsame Warteschlange Objekt (demo):

var text = [ 
     [ 'Text1', 'Text2', 'Text3' ], 
     [ 'Text4', 'Text5', 'Text6' ] 
    ], 
    reset = { 
     opacity: 0, 
     marginLeft: -50 
    }, 
    flyout = { 
     opacity: 1, 
     marginLeft: 0 
    }, 
    flyoutDuration = 1200, 
    changeTextDelay = 5000, 
    q = $({}), // can also be a common element, e.g. $('.flying1') 
    pos = 0; 

function changeText() { 
    $('.flying1 .flying-text').each(function(i) { 
     var div = $(this); 

     // setup text 
     div.css(reset).text(text[pos][i]); 

     // queue 
     q.queue(function(next) { 
      div.animate(flyout, flyoutDuration, next); 
     }); 
    }); 

    q.delay(changeTextDelay).queue(function(next) { 
     pos = (pos + 1) % text.length; 
     changeText(); 
     next(); 
    }); 
} 

changeText(); 

+0

tut dies tatsächlich Provider eine Verzögerung zwischen jedem einzelnen Text-Slideout? Es sieht nicht so aus – Alnitak

+0

@Alnitak Ihre Frage nur nach einer Verzögerung nach "Text3" und "Text6" gefragt. Hier ist eine Version mit Verzögerungen nach jedem Slideout: http://jsfiddle.net/jefferyto/pB8zp/73/ –

+0

eigentlich war es nicht meine Frage, aber die ursprüngliche Frage wollte _extra_ Verzögerung nach jedem dritten Gegenstand - es hatte 3,5 Sekunden zwischen der Start jeder 1.2s Animation. – Alnitak