2016-08-21 4 views
0

Ok, ich habe 8 divs und ich muss sie in 1 auf einmal animieren, was bedeutet, dass es eine Verzögerung zwischen dem 1. und 2., 2. und 3. usw. gibt. Zuerst animiere ich sie alle in, dann abhängig von ein dropdwin animiere ich nur ein paar oder paar der divs rein.Jquery - Wie verzögert man nachfolgende Animationen?

Egal, ich brauche meine Animation zu verzögern, bevor ich wieder mit einem anderen Div.

Hier ist meine Animation:

function panelIn(labDiv) 
     { 

      var neww = "100%"; 
    $(labDiv).delay(600).animate({ 
    width: neww 
    }, 500); 

     } 

Zunächst basiert darauf, dass ich versuchte, eine globale Variable Einstellung und Verzögerung zu ändern, und dass für 1. und 2. divs gearbeitet, aber nicht für alle folgenden:

function panelIn(labDiv) 
     { 
      if(wasFirst == true) 
      { 
       wasFirst = !wasFirst; 
      var neww = "100%"; 
    $(labDiv).delay(600).animate({ 
    width: neww 
    }, 500); 
      } 
      else { 
       var neww = "100%"; 
    $(labDiv).delay(1200).animate({ 
    width: neww 
    }, 500); 
      } 
     } 

ich werde so etwas tun:

panelIn(div1); 
panelIn(div2); 
panelIn(div3); 
panelIn(div4); 

vermeiden möchten setzen einige warten zwischen allen. Und das wäre auch schwierig, da ich die erste um 600, die zweite um 12000, die dritte um 1800 und so weiter verzögern müsste. Ich brauche es innerhalb der panelIn Funktion und 1 Verzögerung.

Wie kann ich meine Divs in 1 auf einmal animieren lassen? Kann das gemacht werden?

+0

Mögliche Duplikat [Chaining jQuery Animationen, die verschiedenen Elemente beeinflussen] hier (http://stackoverflow.com/questions/4198091/chaining-jquery-animations-that-affect-different-elements) –

+0

Überprüfen Sie, wie Sie (animationend) verwenden können, damit Sie den nächsten starten können usw. - http://blog.teamtreehouse.com/using-jquery-to-detect-when-css3-animations-and-transitions-end - aber Sie müssen stattdessen CSS3-Animationen verwenden (.animate()) – Tasos

Antwort

2

Es gibt 8 divs

<div class="animateContainer"> 
    <div class="animateThis">Item 1</div> 
    <div class="animateThis">Item 2</div> 
    <div class="animateThis">Item 3</div> 
    <div class="animateThis">Item 4</div> 
    <div class="animateThis">Item 5</div> 
    <div class="animateThis">Item 6</div> 
    <div class="animateThis">Item 7</div> 
    <div class="animateThis">Item 8</div> 
</div> 

und Sie wollen in der Lage sein, jede von ihnen auslösen, aber sie verzögert werden. Die erste ist von 1800 x 600, 2. 1200, 3. verzögert, usw.

var elems = $(".animateThis"); 

function panelIn(divNumber){ 
var neww = "100%"; 
$(elems[divNumber]).delay(600 * (divNumber+1)).animate({ 
    width: neww 
    }, 500); 

} 

panelIn(0); 
panelIn(1); 
panelIn(2); 
panelIn(3); 
panelIn(4); 
panelIn(5); 
panelIn(6); 
panelIn(7); 

Sie diese Lösung https://jsfiddle.net/senordelaflor/h0z87r7f/2/

1

Von meinem Kommentar hier sehen kann animationend und die HML und CSS-Code unter Verwendung von die andere Antwort

CSS

.animate { 
    width:100%; 
    transition: width .5s linear; 
} 

-Code

var i = 1; 
    function animate() { 

    var thisone = $(".animate" + i); 
    thisone.addClass('animate'); 

    thisone.on('webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend', 
     function(e) { 
     i++; 
     if (i < 9) { 
     animate(); 
     } 
     }); 
    }; 

    animate(); 

Demo

2

Obwohl Pablo Martinez Antwort zeigt Ihnen, wie programmatisch die Verzögerung zu ändern, ist die Antwort fehlerhaft: es auf diese Weise zu tun bedeutet, dass wir jede Animation Timing-out sind (jQuery wahrscheinlich verwendet setTimeout intern oder ähnlich), und aufgrund der Art, wie die JavaScript-Engine funktioniert, können sich die Animationen überlappen, weil Timeouts nicht ausgeführt werden genau zur angegebenen Zeit, nur ungefähr. Wenn Sie versuchen, Ereignisse am Ende oder am Anfang jeder Animation auszulösen, werden Sie möglicherweise feststellen, dass die Ereignisse nicht in der erwarteten Reihenfolge ausgelöst werden (dies ist eine Tatsache, aber ich möchte kein Beispiel geben, um dies zu beweisen).

Um zu garantieren, dass Animationen werden nacheinander abgefeuert, Sie durch die .animate Methode auszuführen Animationen in Folge zurück Versprechen verwenden sollten, und dies wird zu 100% garantieren, dass die Animationen überlappen nacheinander und nie ausgeführt wird.

Die folgenden Codes sind nicht getestet, mit Techniken, die kurz erläutern in this answer werden (beachten Sie, diese Antwort auch die falsche Art und Weise unter Verwendung von Verzögerungen zeigt), und ist effektiv die gleiche, aber ohne Verzögerung Timing Annäherung:

const elems = $('.animateThis') 

setTimeout(function() { 
    panelIn(0) 
    .then(() => panelIn(1)) // arrow function syntax 
    .then(() => panelIn(2)) 
    .then(() => panelIn(3)) 
    .then(() => panelIn(4)) 
    .then(() => panelIn(5)) 
    .then(() => panelIn(6)) 
    .then(() => panelIn(7)) 
}, 500) 

function panelIn(divNumber) { 
    const neww = '100%' 

    // return a promise (learn what promises are, they are useful!) 
    return $(elems[divNumber]).delay(100).animate({ 
    width: neww 
    }, 500).promise() 
} 

wenn Sie in einer ES6 JavaScript-Umgebung sind die Asynchron-Funktionen unterstützt, können Sie den Code sauberer machen:

async function sleep() { 
    return new Promise(function(resolve) { 
    return setTimeout(resolve, duration) 
    }) 
} 

function panelIn(divNumber) { 
    const neww = '100%' 

    return $(elems[divNumber]).delay(100).animate({ 
    width: neww 
    }, 500).promise() 
} 

async function animateDivs() { 
    const elems = $('.animateThis') 

    // Fire each animation sequentially. The `await` keyword makes the engine wait for the given promise to be resolved. 
    await sleep(500) 
    await panelIn(0) 
    await panelIn(1) 
    await panelIn(2) 
    await panelIn(3) 
    await panelIn(4) 
    await panelIn(5) 
    await panelIn(6) 
    await panelIn(7) 
} 

animateDivs() 

es weiter Kürzen, Pfeil Funktionen für sleep und eine for-Schleife:

const sleep = duration => new Promise(r => setTimeout(r, duration)) 

function panelIn(divNumber) { 
    const neww = '100%' 

    return $(elems[divNumber]).delay(100).animate({ 
    width: neww 
    }, 500).promise() 
} 

async function animateDivs() { 
    const elems = $('.animateThis') 

    await sleep(500) 
    for (let i=0; i<8; i++) 
    await panelIn(i) 
} 

animateDivs() 

Bonus: wenn Sie etwas nach all den Animationen abgeschlossen sind, schreiben Sie einfach eine andere Asynchron-Funktion tun wollen!

const sleep = duration => new Promise(r => setTimeout(r, duration)) 

function panelIn(divNumber) { 
    const neww = '100%' 

    return $(elems[divNumber]).delay(100).animate({ 
    width: neww 
    }, 500).promise() 
} 

async function animateDivs() { 
    const elems = $('.animateThis') 

    await sleep(500) 
    for (let i=0; i<8; i++) 
    await panelIn(i) 
} 

async function animateDivsThenDoStuff() { 
    await animateDivs() 
    console.log('All animations complete!') 
} 

animateDivsThenDoStuff()