Ihr Problem wird durch diesen Satz in der Dokumentation erklärt ( fadeOut ):
Wenn mehrere Elemente animiert werden, ist es wichtig zu beachten, dass der Callback einmal pro angepasstem Element ausgeführt wird, nicht einmal für die Animation als Ganzes.
Mit anderen Worten: Da Sie zwei Dinge animieren, wird der Callback zweimal aufgerufen. Da eines Ihrer Divs bereits ausgeblendet ist, wird der fadeOut
ist sofort fertig* und ruft sofort zurück.
* Das sofortige Abschließen, wenn es bereits angezeigt/ausgeblendet ist, ist nur bei den Hilfsfunktionen des Typs Anzeigen/Ausblenden möglich. Wenn Sie Ihre eigene Einblendungsanimation konstruieren, würde diese immer die angegebene Zeitspanne benötigen, unabhängig vom aktuellen Zustand.
Sie können dies auf verschiedene Weise beheben. Die einfachste ist die Verkettung Ihrer fadeOut()
Aufrufe ineinander, anstatt einen Aufruf für beide Elemente:
$('.icon_one').click(function() {
$('#image_two').fadeOut(function() {
$('#image_three').fadeOut(function() {
$('#image_one').fadeIn();
});
});
});
Da das eine in der Regel bereits ausgeblendet ist, wird es sofort durchfallen, das andere wird aber Zeit brauchen. In jedem Fall wird die Einblendung erst dann erfolgen, wenn beide vollständig sind.
Demo: http://jsfiddle.net/jtbowden/XQnhs/
Natürlich können Sie mit einer kleinen Änderung an Ihrem HTML-Code alle drei Funktionen mit un Klick-Handler:
<div id="image_one" class="imageBox" style="background-color:red;height:50px;width:50px"> </div>
<div id="image_two" class="imageBox" style="background-color:blue;height:50px;width:50px"> </div>
<div id="image_three" class="imageBox" style="background-color:yellow;height:50px;width:50px"> </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>
Drehbuch:
$('.icon_show').click(function() {
var showID = '#image_' + $(this).data('num');
$('.imageBox:visible').fadeOut(function() {
$(showID).fadeIn(400);
});
});
Demo: http://jsfiddle.net/jtbowden/NAcPW/
Der Schlüssel dazu ist, dass Sie anhand des Links, den Sie anklicken, automatisch herausfinden, welcher angezeigt werden soll. In diesem Fall tue ich das, indem ich eine Zahl in einem Datenattribut speichere. Sie könnten auch nur einen Teil der ID verwenden oder den Offset mit index
und diese dann in eq
.
Demo: http://jsfiddle.net/jtbowden/NnN58/
Es gibt viele Möglichkeiten, diesen Code zu vereinfachen.