2012-04-11 10 views
3

Das Problem ist ein einfaches, ich weiß, aber ich habe eine Menge Zeit mit dem Versuch, es herauszufinden. Ich habe 8 Divs auf einer Seite, die Bildergalerien enthalten, die versteckt beginnen. Wenn ein Benutzer auf ein Symbol klickt, um eine Galerie anzuzeigen, blendet die erste Galerie, die sie ausgewählt haben, glänzend aus. Aber wenn sie sich für ein anderes entscheiden, beginnt dasjenige, das sie sahen, auszublenden, während das andere darunter verschwindet, und bewegt sich dann in seine korrekte Position, während das erste Div verborgen ist.jQuery - divs verblassen nicht vollständig, bevor das nächste beginnt

Siehe jsfiddle.

Also, meine Frage ist offensichtlich:
Wie bekomme ich die Galerie, die sie angezeigt haben, vollständig ausgeblendet, bevor der nächste in den richtigen Raum verblasst.

Antwort

2

Sie divs auf der jeweils anderen platzieren können mit position:absolute;

Arbeitsbeispiel: http://jsfiddle.net/Ghokun/wnTte/13/

+0

Ich glaube nicht, dass die Platzierung des Div ist kein Problem, wenn er sein Animationsproblem gelöst – Falle1234

+0

Das hat es geschafft. Danke, alle, für das Spielen! Ich musste auch mit einigen Elementen der Galerie herumspielen, aber es ist golden! Das heißt, mein jQuery ist _sehr_ grundlegend und könnte wahrscheinlich aufgeräumt werden, aber ich werde jetzt keinen schlafenden Hund treten. – Adam

+0

@Adam, das verbirgt das Problem, es löst nicht wirklich, was wirklich los ist. Beachten Sie, dass Ihre ursprüngliche Farbe nicht zuerst ausgeblendet wird. Wenn Sie nun eine Überblendung wünschen, ist das ein anderes Problem. –

1

wie etwa

ersetzt
$('#image_one').fadeIn(); 

mit

$('#image_one').delay(500).fadeIn(); 

und wie weise ....

+0

Fein, wenn Sie mit einem div zu tun hat. – Adam

6

Ihr Problem durch diesen Satz in der Dokumentation erklärt (fadeOut):

Wenn mehrere Elemente ani sind mattiert, ist es wichtig zu beachten, dass der Callback einmal pro übereinstimmendes Element ausgeführt wird, nicht einmal für die Animation als Ganzes.

Mit anderen Worten, weil Sie zwei Dinge animieren, wird der Rückruf zweimal aufgerufen. Da eine Ihrer divs bereits ausgeblendet ist, wird die fadeOut sofort * abgeschlossen und ruft sofort zurück.

* Das sofortige Vervollständigen, wenn bereits gezeigt/ausgeblendet ist, ist einzigartig für die Hilfefunktionen zum Anzeigen/Verdecken. Wenn Sie eine eigene Überblendungs-Animation erstellen würden, würde dies unabhängig vom aktuellen Status immer die angegebene Zeit dauern.

Sie können dies auf verschiedene Arten beheben. Am einfachsten ist es, Kette Ihre fadeOut() Anrufe innerhalb von einander, statt einer auf beiden Elemente aufrufen:

$('.icon_one').click(function() { 
    $('#image_two').fadeOut(function() { 
     $('#image_three').fadeOut(function() { 
      $('#image_one').fadeIn(); 
     }); 
    }); 
}); 

Weil man in der Regel bereits versteckt wird, wird es durch sofort fallen, aber der andere wird einige Zeit dauern. Wie auch immer, nur wenn beide abgeschlossen sind, wird das Einblenden stattfinden.

Demo:

<div id="image_one" class="imageBox" style="background-color:red;height:50px;width:50px">&nbsp;</div> 
<div id="image_two" class="imageBox" style="background-color:blue;height:50px;width:50px">&nbsp;</div> 
<div id="image_three" class="imageBox" style="background-color:yellow;height:50px;width:50px">&nbsp;</div> 

<div data-num="one" class="icon_show">Red</div> 
<div data-num="two" class="icon_show">Blue</div> 
<div data-num="three" class="icon_show">Yellow</div> 

Script:

$('.icon_show').click(function() { 
    var showID = '#image_' + $(this).data('num'); 
    $('.imageBox:visible').fadeOut(function() { 
     $(showID).fadeIn(400); 
    }); 
}); 

http://jsfiddle.net/jtbowden/XQnhs/

Natürlich mit einer wenig Änderung Ihrer HTML, Sie alle drei mit einem Click-Handler tun können Demo: http://jsfiddle.net/jtbowden/NAcPW/

Der Schlüssel ist, dass Sie automatisch anhand des Links, auf den Sie klicken, herausfinden, welcher angezeigt werden soll. In diesem Fall mache ich das, indem ich eine Zahl in einem Datenattribut ablege.Sie können auch nur einen Teil der ID verwenden, oder indem Sie den Offset mit index ermitteln und diesen dann in eq eingeben.

Demo: http://jsfiddle.net/jtbowden/NnN58/

Es gibt viele Möglichkeiten, um diesen Code zu vereinfachen.

3

Das war interessant ... Ich mag die Art, wie Sie richten Sie jsfiddle- es einfacher gemacht um zu spielen mit. Sehen Sie, ob das hilft. fadeOuts sind an mehr als nur an Elemente gebunden. Blendet nur den sichtbaren aus. Ich denke, dein Problem ist das Ausblenden von Elementen, die bereits ausgeblendet sind.

hier ist eine leichte Variation auf jsfiddle ..

$(function(){ 
     $('#image_two,#image_three').hide(); 

//1//  

      $('.icon_one').click(function(){     
       $('#image_two:visible,#image_three:visible').fadeOut(
        function(){ 

        $('#image_one').fadeIn(); 
        } 
      ); 
      }); 

//2// 
alert("binding"); 
    $('.icon_two').click(function(){ 
     $('#image_one:visible,#image_three:visible').fadeOut(
      function(){ 
       $('#image_two').fadeIn(); 
      } 
              ); 
    }); 

    //3// 

    $('.icon_three').click(function(){ 
     $('#image_one:visible,#image_two:visible').fadeOut(function(){ 
     $('#image_three').fadeIn(); 
     }); 
    }); 

}); 
+0

Das Problem hier ist, dass die 'icon_ #' Menüelemente sind, und der Benutzer kann auf eines der Elemente klicken, so das '$ ('# ..., # ..., # ... ') fadeOut' deckt alle möglichen sichtbaren Elemente ab. – Adam

+0

hey Adam ... ich glaube wirklich, das Problem sind Dinge, die bereits ausgeblendet sind - aber es gibt wahrscheinlich mehrere Möglichkeiten, um es zum Laufen zu bringen. –

+0

Das Problem bleibt: Welches Objekt ist sichtbar? Wie ermittelt man das? In diesem Sinne blenden Sie alle Elemente aus, um das sichtbare auszublenden. Ich stelle mir vor, dass ein "wenn/dann" -Szenario das erledigt hätte, aber es ist jetzt ein bisschen aus meinem Steuerhaus. – Adam

Verwandte Themen