2010-11-12 26 views
2

Débutant complet, donc je manque probablement quelque chose d'évident mais ... Je n'arrive pas à combiner un effet animé (largeur) avec un effet this.hide, je peux faire l'un ou l'autre travailler en commentant l'autre. Voici le code:JQuery - Combinaison de la largeur et des effets de masquage

function showSlidingDiv(column){ 
var maxWidth = 200; 
var smallWidth = 80; 
var myWidth = $(column).width(); 


$("div").each(function(){ 
     $(this).animate({width: smallWidth}); 
     $(this).hide(); 
    }); 

$(column).show(); 
$(column).animate({width: maxWidth}); 
} 

J'utilise ceci sur une grande table d'informations afin que l'utilisateur peut cliquer sur une rubrique e et d'élargir cette colonne d'information tout en réduisant tous les autres. Chaque td a une div à l'intérieur qui est en train d'être étendue ou contractée. Je voudrais aussi cacher, si possible par animation, les divs dans les autres colonnes en même temps. Comme je l'ai dit, cela fonctionnera pour l'un ou pour l'autre, mais pas pour les deux ensemble.

Toute aide appréciée. Merci. Il suffit d'utiliser les fonctions de rappel.

Répondre

4

.hide() est pas une fonction en file d'attente, vous devez soit appeler dans un rappel .animate(), comme ceci:

$("div").animate({width: smallWidth}, function() { 
    $(this).hide(); 
}); 

Ou en faire une fonction mis en attente avec cette astuce:

$("div").animate({width: smallWidth}).hide(0); 

Dans les deux cas, le .each() n'est pas nécessaire car le code ci-dessus s'applique à toutes les correspondances.

+0

Merci pour la réponse :) – Keith

1

Comme:

function showSlidingDiv(column) { 
    var maxWidth = 200; 
    var smallWidth = 80; 
    var myWidth = $(column).width(); 


    $("div").each(function() { 
    $(this).animate({width: smallWidth}, 1000, function() { 
     // this callback is executed when the animation is done 
     $(this).hide(); 
    }); 
    }); 

    $(column).show(); 
    $(column).animate({width: maxWidth}); 
} 
0

La fonction d'animation jQuery peut être utilisée avec une fonction de rappel qui s'exécute une fois l'animation terminée, ce qui devrait accomplir ce que vous essayez de faire.

$("div").each(function(){ 
    $(this).animate({width: smallWidth}, 1000, function() { 
     $(this).hide(); 
    }); 
}); 
+0

Vous n'avez pas besoin une durée ici, ça marche sans ... mais pour garder la durée par défaut, c'est 400ms, ça prendrait beaucoup plus de temps :) –

+0

C'est super, merci pour toutes les réponses. Fonctionne un régal! – Keith

+0

En fait, juste un petit bug. Tout fonctionne, mais quand je clique sur un en-tête pour l'agrandir, tous les div apparaissent pendant la durée de l'animation, puis cachent une fois terminé. Pour une raison quelconque, tout clignote puis passe à l'état correct. Une idée? – Keith

0

Le problème est que seules les méthodes d'animation sont chaînées (les unes après les autres). Pour hide() une méthode d'animation, vous devez spécifier une durée, donc au lieu de

$(this).animate({width: smallWidth}); 
    $(this).hide(); 

écrire

$(this).animate({width: smallWidth}); 
    $(this).hide(0); 

ou moins

$(this).animate({width: smallWidth}).hide(0);