Mehrere parallele hover()-Animationen vermeiden

Problem

Wir sind alle schon mindestens einmal in diese Falle gelaufen. Sie schreiben so etwas wie:

jQuery('#something').hover(
    function(){
        // coole Animation für jQuery(this)
    },
    function(){
        // coole Animation in Ausgangszustand zurückversetzen
    }
);

So könnten Sie zum Beispiel ein Element immer dann vergrößern, wenn der Mauscursor darüber bewegt wird, und es beim Verlassen mit der Maus wieder zurücksetzen.

Alles klappt wunderbar, bis Sie die Maus schnell herein- und wieder herausbewegen und … was passiert da?

Das Element jQuery('#something') wird plötzlich viele Male hin- und hergeschaltet, bis die Animation schließlich endet.

Lösung

Die Lösung ist wirklich einfach, aber das Problem taucht so häufig auf, dass ich diese Lösung trotzdem als nützlich ansehe.

Um diesen verrückten Effekt zu vermeiden, müssen Sie einfach alle bestehenden Animationen für das Element abbrechen, bevor Sie eine neue erstellen.

Dazu haben Sie die jQuery-Methode stop() zur Verfügung. Sie stoppt (wie der Name schon sagt) die aktuelle Animation und entfernt optional auch die folgenden.

Diskussion

Beispiel

Ich werde Ihnen ein Beispiel einer Animation der CSS-Eigenschaft opacity zeigen, aber die Lösung funktioniert auch für jede andere Eigenschaft:

jQuery('#something').hover(
    function(){
        jQuery(this).stop().animate({opacity:1}, 1000);
    },
    function(){
        jQuery(this).stop().animate({opacity:0.8}, 1000);
    }
 );

Dies funktioniert auch für vorgefertigte jQuery-Animationen wie slideUp(), slideDown(), fadeIn() und so weiter.

Dies ist das vorherige Beispiel, aber mit einem Fade-Effekt:

jQuery('#something').hover(
    function(){
        jQuery(this).stop().fadeTo( 1, 1000 );
    },
    function(){
        jQuery(this).stop().fadeTo( 0.8, 1000 );
    }
 );

Der Rest

Es kann aber immer noch ein Problem entstehen, wenn man sich in Situationen wie der folgenden befindet:

jQuery('#something').hover(
    function(){
        jQuery(this).stop()
            .fadeTo( 1, 1000 )
            .animate( {height:500}, 1000 );
    },
    function(){
        jQuery(this).stop()
            .fadeTo( 0.8, 1000 )
            .animate( {height:200}, 1000 );
    }
 );

Probieren Sie diesen Code aus und bewegen die Maus sehr schnell, dann wird das Element wieder sehr unschön animiert werden – allerdings nur die Höhe, nicht die Opazität.

Der Grund ist einfach – Animationen werden in jQuery standardmäßig in eine Queue gestellt. Fügen Sie also mehrere Animationen hinzu, werden sie nacheinander ausgeführt.

stop() stoppt (und entfernt) standardmäßig nur die aktuelle Animation. In unserem letzten Beispiel wird nur die Animation der Opazität entfernt werden, die Animation der Höhe verbleibt aber in der Queue und ist bereit, sofort ausgeführt zu werden.

Um das zu vermeiden, müssen Sie entweder stop() ein weiteres Mal aufrufen oder als Argument für die Methode true übergeben. Dadurch sorgt stop() dafür, dass auch alle gequeueten Animationen verworfen werden. Unser Hover-Code sollte also so aussehen:

jQuery('#something').hover(
    function(){
        jQuery(this).stop(true)
            .fadeTo( 1, 1000 )
            .animate( {height:500}, 1000 );
    },
    function(){
        jQuery(this).stop(true)
            .fadeTo( 0.8, 1000 )
            .animate( {height:200}, 1000 );
    }
 );
JQuery Kochbuch
titlepage.xhtml
part0000.html
part0001.html
part0002_split_000.html
part0002_split_001.html
part0002_split_002.html
part0003_split_000.html
part0003_split_001.html
part0003_split_002.html
part0003_split_003.html
part0003_split_004.html
part0003_split_005.html
part0003_split_006.html
part0003_split_007.html
part0004_split_000.html
part0004_split_001.html
part0004_split_002.html
part0004_split_003.html
part0004_split_004.html
part0004_split_005.html
part0004_split_006.html
part0004_split_007.html
part0004_split_008.html
part0004_split_009.html
part0004_split_010.html
part0004_split_011.html
part0004_split_012.html
part0004_split_013.html
part0004_split_014.html
part0004_split_015.html
part0004_split_016.html
part0004_split_017.html
part0004_split_018.html
part0005_split_000.html
part0005_split_001.html
part0005_split_002.html
part0005_split_003.html
part0005_split_004.html
part0005_split_005.html
part0005_split_006.html
part0005_split_007.html
part0005_split_008.html
part0005_split_009.html
part0005_split_010.html
part0005_split_011.html
part0005_split_012.html
part0005_split_013.html
part0006_split_000.html
part0006_split_001.html
part0006_split_002.html
part0006_split_003.html
part0006_split_004.html
part0006_split_005.html
part0006_split_006.html
part0006_split_007.html
part0006_split_008.html
part0006_split_009.html
part0006_split_010.html
part0007_split_000.html
part0007_split_001.html
part0007_split_002.html
part0007_split_003.html
part0007_split_004.html
part0007_split_005.html
part0007_split_006.html
part0007_split_007.html
part0007_split_008.html
part0007_split_009.html
part0007_split_010.html
part0007_split_011.html
part0008_split_000.html
part0008_split_001.html
part0008_split_002.html
part0008_split_003.html
part0008_split_004.html
part0008_split_005.html
part0008_split_006.html
part0008_split_007.html
part0008_split_008.html
part0008_split_009.html
part0008_split_010.html
part0008_split_011.html
part0008_split_012.html
part0008_split_013.html
part0008_split_014.html
part0008_split_015.html
part0008_split_016.html
part0008_split_017.html
part0008_split_018.html
part0008_split_019.html
part0008_split_020.html
part0008_split_021.html
part0008_split_022.html
part0009_split_000.html
part0009_split_001.html
part0009_split_002.html
part0009_split_003.html
part0009_split_004.html
part0009_split_005.html
part0009_split_006.html
part0009_split_007.html
part0009_split_008.html
part0009_split_009.html
part0009_split_010.html
part0010_split_000.html
part0010_split_001.html
part0010_split_002.html
part0010_split_003.html
part0010_split_004.html
part0010_split_005.html
part0010_split_006.html
part0010_split_007.html
part0010_split_008.html
part0010_split_009.html
part0010_split_010.html
part0010_split_011.html
part0011_split_000.html
part0011_split_001.html
part0011_split_002.html
part0011_split_003.html
part0011_split_004.html
part0011_split_005.html
part0011_split_006.html
part0011_split_007.html
part0011_split_008.html
part0011_split_009.html
part0011_split_010.html
part0011_split_011.html
part0012_split_000.html
part0012_split_001.html
part0012_split_002.html
part0012_split_003.html
part0012_split_004.html
part0012_split_005.html
part0012_split_006.html
part0012_split_007.html
part0012_split_008.html
part0013_split_000.html
part0013_split_001.html
part0013_split_002.html
part0013_split_003.html
part0013_split_004.html
part0013_split_005.html
part0013_split_006.html
part0013_split_007.html
part0013_split_008.html
part0013_split_009.html
part0013_split_010.html
part0013_split_011.html
part0013_split_012.html
part0014_split_000.html
part0014_split_001.html
part0014_split_002.html
part0014_split_003.html
part0014_split_004.html
part0014_split_005.html
part0014_split_006.html
part0014_split_007.html
part0014_split_008.html
part0014_split_009.html
part0014_split_010.html
part0014_split_011.html
part0015_split_000.html
part0015_split_001.html
part0015_split_002.html
part0015_split_003.html
part0015_split_004.html
part0015_split_005.html
part0015_split_006.html
part0015_split_007.html
part0015_split_008.html
part0015_split_009.html
part0015_split_010.html
part0016_split_000.html
part0016_split_001.html
part0016_split_002.html
part0016_split_003.html
part0016_split_004.html
part0016_split_005.html
part0016_split_006.html
part0016_split_007.html
part0016_split_008.html
part0016_split_009.html
part0017_split_000.html
part0017_split_001.html
part0017_split_002.html
part0017_split_003.html
part0017_split_004.html
part0017_split_005.html
part0017_split_006.html
part0017_split_007.html
part0017_split_008.html
part0017_split_009.html
part0017_split_010.html
part0017_split_011.html
part0018_split_000.html
part0018_split_001.html
part0018_split_002.html
part0018_split_003.html
part0018_split_004.html
part0018_split_005.html
part0018_split_006.html
part0019_split_000.html
part0019_split_001.html
part0019_split_002.html
part0019_split_003.html
part0019_split_004.html
part0019_split_005.html
part0019_split_006.html
part0019_split_007.html
part0019_split_008.html
part0019_split_009.html
part0019_split_010.html
part0020_split_000.html
part0020_split_001.html
part0020_split_002.html
part0020_split_003.html
part0020_split_004.html
part0020_split_005.html
part0020_split_006.html
part0020_split_007.html
part0020_split_008.html
part0021_split_000.html
part0021_split_001.html
part0021_split_002.html
part0021_split_003.html
part0021_split_004.html
part0021_split_005.html
part0021_split_006.html
part0021_split_007.html
part0021_split_008.html
part0021_split_009.html
part0022.html
part0023.html
part0024.html
part0025.html