2009-11-17 4 views
0

Je voudrais fondu dans plusieurs boîtes alignées horizontalement l'une après l'autre. Dites que chaque boîte appartient à la classe fadeable et possède un ID. Addtionally, je voudrais effacer les cases de l'extérieur. Par exemple:plusieurs animations de fadein dans jquery

_ _ _ _ _ _ _ _ _ 
+_ _ _ _ _ _ _ _ 
+_ _ _ _ _ _ _ + 
+ + _ _ _ _ _ _ + 
+ + _ _ _ _ _ + + 
+ + + _ _ _ _ + + 

et ainsi de suite. Quelle est la meilleure façon de comprendre cela en utilisant jQuery?

Voici ce que j'ai maintenant (en gros) - donner à chaque boîte div une méta-données auto-incrémentée id boxid et préforme les suivantes:

max = $(".fadeable:last").attr('boxid'); 
for(i=0;i<max;i++) 
{ 
    $("[boxid=" + i + "]").fadeIn('fast'); 
    $("[boxid=" + (max-i) + "]").fadeIn('fast'); 
} 

est-il un moyen de mieux/plus lisse de le faire? (avec animer, ou en faisant la queue?) En outre, quelle est la meilleure façon d'organiser les éléments en CSS?

Merci!

Répondre

0
$(".fadeable").each(function() { 
    $(this).fadeIn('fast'); 
}); 
+0

oui, mais cela va-t-il disparaître dans l'ordre que je voulais? – rashcroft22

+0

Non, il va tous les faire disparaître en même temps, vous devez ajouter un délai. – SimonDever

2

avoir un jeu autour avec ceci:

<html> 
    <head> 
     <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> 
     <script type="text/javascript"> 

      function createThem() 
      { 
       for(var id = 0; id < 15; id++) 
       { 
        var el = document.createElement('div'); 
        $(el).attr('rel', id); 
        $(el).attr('class', 'fadeable'); 
        $(el).css('opacity', '0.0'); 
        $(el).css('display', 'inline'); 
        $(el).css('background', 'green'); 
        $(el).css('float', 'left'); 
        $(el).css('margin-right', '5px'); 
        $(el).text(id); 
        document.getElementById('container').appendChild(el); 
       } 
      } 

      function fadeThem() 
      { 
       var max = $(".fadeable:last").attr('rel'); 
       var timer = 0; 
       var command = ""; 
       for(i=0;i<max;i++) 
       { 
        command = "$('.fadeable[rel=" + i + "]').fadeTo('slow', 1.0);"; 
        command += "$('.fadeable[rel=" + (max-i) + "]').fadeTo('slow', 1.0);"; 
        window.setTimeout(command, timer); 
        timer += 1000; 
       } 
      } 
     </script> 
    </head> 
    <body>       
     <button onclick="createThem()" value="Create Them">Create Them</button> 
     <button onclick="fadeThem()" value="Fade Them">Fade Them</button> 
     <div id="container" style="background:blue;height:200px;width:300px"> 
      <!--div rel="1" class="fadeable" style="opacity:0.0;display:inline;background:green;float:left;margin-right:5px;">1</div> 
      <div rel="2" class="fadeable" style="opacity:0.0;display:inline;background:green;float:left;margin-right:5px;">2</div> 
      <div rel="3" class="fadeable" style="opacity:0.0;display:inline;background:green;float:left;margin-right:5px;">3</div> 
      <div rel="4" class="fadeable" style="opacity:0.0;display:inline;background:green;float:left;margin-right:5px;">4</div> 
      <div rel="5" class="fadeable" style="opacity:0.0;display:inline;background:green;float:left;margin-right:5px;">5</div> 
      <div rel="6" class="fadeable" style="opacity:0.0;display:inline;background:green;float:left;margin-right:5px;">6</div> 
      <div rel="7" class="fadeable" style="opacity:0.0;display:inline;background:green;float:left;margin-right:5px;">7</div> 
      <div rel="8" class="fadeable" style="opacity:0.0;display:inline;background:green;float:left;margin-right:5px;">8</div> 
      <div rel="9" class="fadeable" style="opacity:0.0;display:inline;background:green;float:left;margin-right:5px;">9</div> 
      <div rel="10" class="fadeable" style="opacity:0.0;display:inline;background:green;float:left;margin-right:5px;">10</div--> 
     </div> 
    </body> 
</html> 
+0

Vous pouvez supprimer la méthode createThem() et le bouton et décommenter les divs dans le conteneur si vous le souhaitez, ne fait aucune différence de quelle façon vous le faites, je viens de jouer avec la création dynamique. – SimonDever

2

Eh bien, il semblait que votre question a suscité beaucoup de recherches! Voici ce que j'ai trouvé. Je l'ai fait plus d'un style plugin jQuery, donc il y a du code supplémentaire à cause de cela, mais il peut être facilement réutilisé tout au long de votre projet. De plus, vous pouvez définir fadeIn-false et il disparaîtra dans le même schéma:

<!DOCTYPE html > 
<html> 
<head> 
<style type="text/css" media="screen"> 
    #items { height:50px; text-align: center; line-height: 50px; } 
    #items div { 
    width: 50px; height: 50px; 
    float: left; position: relative; 
    background: red; 
    opacity: 0.0; -moz-opacity: 0.0; filter:alpha(opacity=0); 
    } 
</style> 

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> 
<script type="text/javascript" charset="utf-8"> 
    $.fn.fadeFromOutside = function(opts){ 
    if(this.size() > 0){ 
     var options = options = $.extend({}, $.fn.fadeFromOutside.defaults, opts), 
     size = this.size(), 
     steps = Math.ceil(size/2), // Always round up 
     fade_in = options.fadeIn, 
     time = options.length, 
     wait = Math.floor(time/steps), // Delay between fades 
     items = this.css({opacity: (fade_in ? 0.0 : 1.0)}), 
     fade_to = (fade_in ? 1.0 : 0.0); // Decide what the final opacity should be. 

     // We are using a private internal function to handle 
     // the processing and delayed fadeIn. 
     var fade_action = function(one, two, count_left, delay){ 
     /* If a callback is present, and this is the last iteration 
      then this sets it up to be called */ 
     var callback = null; 
     if(options.complete && count_left == (steps - 1)) 
      callback = options.complete; 

     /* Always animate 'one' */ 
     $(one).animate({opacity: fade_to}, {duration: time, complete: callback}); 
     /* Animate two if its not the same as one. 
      two will equal one on the last step of odd numbered sets */ 
     if(one != two) 
      $(two).animate({opacity: fade_to}, time); 

     if(count_left < steps){ 
      window.setTimeout(function(){ 
      fade_action(
       items.get(count_left), 
       items.get(size - 1 - count_left), 
       count_left + 1, 
       delay); 
      }, delay); 
     } 
     } 

     // Start the fade 
     fade_action(items.get(0), items.get(size - 1), 1, wait); 

    } 
    return this; // Don't break the chain 
    } 

    $.fn.fadeFromOutside.defaults = { 
    fadeIn: true, 
    length: 1000 
    } 

    /* DOM Ready */ 
    $(function(){ 
    $("#items > div").fadeFromOutside({ 
     fadeIn: true, // Set to false to fade out 
     length: 2000, // Take two seconds 
     complete: function(){ 
     alert('done!'); // Alert when finished 
     } 
    }); 
    }); 
</script> 

</head> 

<body> 
<div id="items"> 
    <div>1</div> 
    <div>2</div> 
    <div>3</div> 
    <div>4</div> 
    <div>5</div> 
    <div>6</div> 
    <div>7</div> 
    <div>8</div> 
    <div>9</div> 
    <div>10</div> 
</div> 
</body> 
</html> 

Si les éléments commencent comme display:none ou dont ils ont besoin pour fadeOut et fin comme display:none puis utilisez plutôt la commande suivante pour lancer le plugin :

// fadeIn: Assumes the div's start as display:none 
$("#items > div") 
    .css({display: block, opacity: 0.0}) 
    .fadeFromOutside(); 

// fadeOut: Will hide all divs at the end 
$("#items > div") 
    .fadeFromOutside({ 
    complete: function(){ $("#items > div").hide() } 
    }); 
}); 
0

en fonction de votre code d'origine, il suffit de faire un petit ajustement:

max = $(".fadeable:last").attr('boxid'); 
    for(i=0;i<max;i++) 
    { 
     $("[boxid=" + i + "]").fadeIn('fast', function(){ 
      $("[boxid=" + (max-i) + "]").fadeIn('fast'); 
     }); 

    } 

Thi s peut ne pas être le comportement exact dont vous avez besoin, mais l'idée est d'enchaîner les évanouissements afin que l'élément suivant ne commence pas à animer tant que le dernier élément n'est pas terminé.

Ceci est réalisé via le paramètre callback dans la fonction fadeIn

+0

Il n'y a toujours pas de retard. De plus, la boucle ne tient pas compte du fait qu'il veut qu'il se fane des deux extrémités. Votre code va faire disparaître tous les éléments presque simultanément, et exécuter un ensemble supplémentaire de fadeIn à la fin sans aucun effet. Vous avez raison de vouloir utiliser une forme de nidification. –