Ich verwende jQuery und jQuery-ui und möchte verschiedene Attribute für verschiedene Objekte animieren.
Um das Problem hier zu erklären, habe ich es zu einem Div vereinfacht, der von blau nach rot wechselt, wenn der Benutzer darüber fährt.
Ich kann das gewünschte Verhalten bei der Verwendung animate()
erzielen. Dabei müssen sich die zu animierenden Stile jedoch im Animationscode befinden und sind daher von meinem Stylesheet getrennt. (siehe Beispiel 1 )
Eine Alternative ist die Verwendung von addClass()
und removeClass()
ich konnte das genaue Verhalten, mit dem ich arbeiten kann, nicht wiederherstellen animate()
. (siehe Beispiel 2 )
Beispiel 1
Werfen wir einen Blick auf den Code, den ich habe animate()
:
$('#someDiv')
.mouseover(function(){
$(this).stop().animate( {backgroundColor:'blue'}, {duration:500});
})
.mouseout(function(){
$(this).stop().animate( {backgroundColor:'red'}, {duration:500});
});
Es zeigt alle Verhaltensweisen an, nach denen ich suche:
- Animiert reibungslos zwischen Rot und Blau.
- Keine Animation "Überreihen", wenn der Benutzer seine Maus schnell in das Div hinein und aus dem Div heraus bewegt.
- Wenn der Benutzer seine Maus während der Wiedergabe der Animation nach außen / innen bewegt, wird zwischen dem aktuellen Status "auf halbem Weg" und dem neuen Status "Ziel" korrekt verschoben.
Da die animate()
Stiländerungen jedoch in definiert sind, muss ich die Stilwerte dort ändern und kann nicht einfach auf mein Stylesheet verweisen. Diese "Fragmentierung" der Definition von Stilen stört mich wirklich.
Beispiel 2
Hier ist mein derzeit bester Versuch mit addClass()
und removeClass
(Beachten Sie, dass Sie jQuery-ui benötigen, damit die Animation funktioniert):
//assume classes 'red' and 'blue' are defined
$('#someDiv')
.addClass('blue')
.mouseover(function(){
$(this).stop(true,false).removeAttr('style').addClass('red', {duration:500});
})
.mouseout(function(){
$(this).stop(true,false).removeAttr('style').removeClass('red', {duration:500});
});
Dies zeigt sowohl die Eigenschaft 1. als auch die 2. meiner ursprünglichen Anforderungen, jedoch funktioniert 3 nicht.
Ich verstehe den Grund dafür:
Wenn Animieren addClass()
und removeClass()
fügt jQuery einen temporären Stil auf das Element, und erhöht dann die entsprechenden Werte , bis sie die Werte der bereitgestellten Klasse erreichen, und erst dann wird es die Klasse tatsächlich hinzufügen / entfernen.
Aus diesem Grund muss ich das Stilattribut entfernen. Andernfalls bleibt das Stilattribut erhalten und überschreibt permanent alle Klassenwerte, wenn die Animation auf halber Strecke gestoppt wird, da Stilattribute in einem Tag eine höhere Bedeutung haben als Klassenstile.
Wenn die Animation jedoch zur Hälfte fertig ist, wurde die neue Klasse noch nicht hinzugefügt. Bei dieser Lösung springt die Farbe zur vorherigen Farbe, wenn der Benutzer die Maus bewegt, bevor die Animation abgeschlossen ist.
Idealerweise möchte ich in der Lage sein, so etwas zu tun:
$('#someDiv')
.mouseover(function(){
$(this).stop().animate( getClassContent('blue'), {duration:500});
})
.mouseout(function(){
$(this).stop().animate( getClassContent('red'), {duration:500});
});
Wo getClassContent
würde nur der Inhalt der bereitgestellten Klasse zurückgeben. Der entscheidende Punkt ist, dass ich auf diese Weise meine Stildefinitionen nicht überall aufbewahren muss, sondern sie in Klassen in meinem Stylesheet aufbewahren kann.
getClassContent
sieht es aus?