2010-07-10 17 views
0

J'ai un panneau qui fait fondre les images. Cependant, la première image s'estompe complètement avant que la deuxième image n'apparaisse. Je voudrais qu'ils disparaissent en même temps. J'utilise un effet Spry parce que je ne connais pas trop Javascript, mais voici ce que j'ai.Combinaison de plusieurs effets de fondu Javascript

Dans mon HTML:

<script type="text/javascript"> 
var TabbedPanels1 = new Spry.Widget.TabbedPanels("TabbedPanels1", { interval: 3000 }); 
TabbedPanels1.start(); 
</script> 

Et dans mon script d'effets Javascript (il y a aussi les principaux panneaux à onglets js, mais il est pas pertinent):

Spry.Widget.TabbedPanels.prototype.fadeInNextPanel = function() 
{ 
    if (!Spry.Effect || !Spry.Effect.DoFade) 
    { 
     // The fade effect isn't available, so just 
     // show the next panel. 

     this.showNextPanel(); 
     if (this.timerID) 
      this.start(); 
     return; 
    } 

    var curIndex = this.getCurrentTabIndex(); 
    var panels = this.getContentPanels(); 
    var currentPanel = panels[ curIndex ]; 
    var nextPanel = panels[ (curIndex + 1) % this.getTabbedPanelCount() ]; 
    var self = this; 

Spry.Effect.DoFade(currentPanel, {duration: 1000, from: 100, to: 0, toggle: false, finish: function() 
    { 
     nextPanel.style.opacity = '0'; 
     nextPanel.style.filter = 'alpha(opacity=0)'; 

     self.showPanel(nextPanel); 

     currentPanel.style.opacity = ''; 
     currentPanel.style.filter = ''; 
     Spry.Effect.DoFade(nextPanel, {duration: 1000, from: 0, to: 100, toggle: false, finish: function() 
     { 
      if (self.timerID) 
       self.start(); 
     }}); 
    }}); 

je peux voir qu'il est dit quand le fondu se termine, commence le fondu. Mais je ne sais pas comment le changer pour qu'ils se produisent en même temps.

Répondre

0

Merci Galambalazs et Gaby. Avec votre aide, j'ai pu obtenir la solution. Après avoir réglé le conteneur de la position div relative et définissant une hauteur pour elle, je le code suivant pour faire ce que je voulais:

currentPanel.style.zIndex = '0'; 
    currentPanel.style.opacity = ''; 
    currentPanel.style.filter = ''; 
    nextPanel.style.position = 'absolute'; 
    nextPanel.style.top = '9px'; 
    nextPanel.style.zIndex = '1000'; 
    nextPanel.style.opacity = '0'; 
    nextPanel.style.filter = 'alpha(opacity=0)'; 

Spry.Effect.DoFade(currentPanel, {duration: 500, from: 100, to: 0, toggle: false, finish: function() 
{ 
    self.showPanel(nextPanel); 
    currentPanel.style.opacity = '100'; 
    currentPanel.style.filter = 'alpha(opacity=100)'; 
}});  

Spry.Effect.DoFade(nextPanel, {duration: 500, from: 0, to: 100, toggle: false, finish: function() 
{ 
    if (self.timerID) 
    self.start(); 
}}); 
+0

Si quelqu'un est intéressé, j'ai dû ajouter 'currentPanel.style.opacity = '100'; currentPanel.style.filter = 'alpha (opacité = 100)'; ' après' self.showPanel (nextPanel); 'dans la partie supérieure du code. Tout fonctionne bien maintenant. – Beau

0

Essayez quelque chose comme ceci:

nextPanel.style.opacity = '0'; 
nextPanel.style.filter = 'alpha(opacity=0)'; 
self.showPanel(nextPanel); 

Spry.Effect.DoFade(currentPanel, { 
    duration: 1000, 
    from: 100, 
    to: 0, 
    toggle: false, 
    finish: function() { 
     currentPanel.style.opacity = ''; 
     currentPanel.style.filter = ''; 
}});  

Spry.Effect.DoFade(nextPanel, { 
    duration: 1000, 
    from: 0, 
    to: 100, 
    toggle: false, 
    finish: function() { 
     if (self.timerID) 
      self.start(); 
}}); 
+0

Merci, galambalazs. Cela fait ce qu'il devrait faire, mais le problème est que le deuxième panneau est visible sous le premier panneau (parce que c'est comme ça que ça se passe dans le HTML), et non derrière. Ce n'est que quand il finit de disparaître qu'il saute là où il devrait être. – Beau

+0

Eh bien, maintenant que je connais votre mise en page, je peux vous dire que cela ne peut pas être fait. Parce que ce qui est arrivé dans la forme originale, c'est que le second était caché pendant que le premier disparaissait, puis le premier devenait caché et le second affichait et disparaissait. C'est un truc, ils ne sont jamais vraiment l'un l'autre. Vous ne pouvez donc pas réaliser ce que vous voulez avec la disposition actuelle. – galambalazs

+0

Oui, une fois que je l'ai vu avec votre solution, j'ai pensé que ce n'était probablement pas possible, sauf si je l'ai vraiment redessiné. Merci d'avoir essayé. – Beau

0

Vous auriez besoin de mettre leur récipient à position:relative puis dans votre code

currentPanel.style.position= 'absolute'; 
currentPanel.style.zIndex= '10'; 

nextPanel.style.position = 'absolute'; 
nextPanel.style.zIndex= '100'; 
nextPanel.style.opacity = '0'; 
nextPanel.style.top = '0px'; 
nextPanel.style.filter = 'alpha(opacity=0)'; 
self.showPanel(nextPanel); 

Spry.Effect.DoFade(currentPanel, { 
    duration: 1000, 
    from: 100, 
    to: 0, 
    toggle: false, 
    finish: function() { 
     currentPanel.style.opacity = ''; 
     currentPanel.style.filter = ''; 
     currentPanel.style.zIndex = '0'; 
}});  

Spry.Effect.DoFade(nextPanel, { 
    duration: 1000, 
    from: 0, 
    to: 100, 
    toggle: false, 
    finish: function() { 
     if (self.timerID) 
      self.start(); 
}}); 
+0

Merci, Gaby, mais le conteneur ne tient pas sa forme quand son enfant va au positionnement absolu. Ca rétrécit parce qu'il ne pense pas que ça tienne quoi que ce soit. – Beau

+0

En fait, je l'ai pour qu'il rebondisse pour contenir son enfant, mais seulement après qu'il se soit arrêté pendant une seconde sur le fondu. En outre, le positionnement absolu ne respecte pas le rembourrage supérieur (bien qu'il ne soit probablement pas censé le faire), donc il est décalé trop haut. Définir top à 9px ou ajouter un padding 9px dans js provoque d'autres problèmes. – Beau

+0

En outre, le positionnement n'est pas un problème sur la première transition. Ce n'est que sur les suivants que ça se gâte. Mais l'accrochage du conteneur, ainsi qu'un flash du panneau actuel à 100% avant de passer au panneau suivant, est cohérent tout au long. – Beau