Korzystam z jQuery i jQuery-ui i chcę animować różne atrybuty na różnych obiektach.
Aby wyjaśnić problem tutaj, uprościłem go do jednego diva, który zmienia kolor z niebieskiego na czerwony, gdy użytkownik na niego najeżdża.
Jestem w stanie uzyskać pożądane przeze mnie zachowanie animate()
, jednak robiąc to, style, które animuję, muszą znajdować się w kodzie animacji, a więc są oddzielne od mojego arkusza stylów. (patrz przykład 1 )
Alternatywą jest użycie addClass()
a removeClass()
, ale nie udało się odtworzyć dokładnie zachowanie, które mogę dostać z animate()
. (patrz przykład 2 )
Przykład 1
Rzućmy okiem na kod, który mam z animate()
:
$('#someDiv')
.mouseover(function(){
$(this).stop().animate( {backgroundColor:'blue'}, {duration:500});
})
.mouseout(function(){
$(this).stop().animate( {backgroundColor:'red'}, {duration:500});
});
wyświetla wszystkie poszukiwane przeze mnie zachowania:
- Animuje płynnie między czerwonym a niebieskim.
- Brak „kolejkowania” animacji, gdy użytkownik szybko porusza myszką do i z div.
- Jeśli użytkownik przesunie mysz do środka / do środka, gdy animacja jest nadal odtwarzana, zostanie ona ułatwiona między obecnym stanem „w połowie” a nowym stanem „celu”.
Ale ponieważ zmiany stylu są zdefiniowane w, animate()
muszę tam zmienić wartości stylu i nie mogę po prostu wskazywać mojego arkusza stylów. To „fragmentaryczne” definiowanie stylów bardzo mnie niepokoi.
Przykład 2
Oto moja bieżąca najlepsza próba użycia addClass()
i removeClass
(zauważ, że do działania animacji potrzebujesz jQuery-ui):
//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});
});
Pokazuje to zarówno właściwość 1., jak i 2. moich pierwotnych wymagań, jednak 3 nie działa.
Rozumiem powód tego:
Podczas animacji addClass()
i removeClass()
jQuery dodaje element do stylu tymczasowego, a następnie zwiększa odpowiednie wartości, dopóki nie osiągną wartości podanej klasy, i dopiero wtedy faktycznie dodaje / usuwa klasę.
Z tego powodu muszę usunąć atrybut stylu, w przeciwnym razie, jeśli animacja zostanie zatrzymana w połowie, atrybut stylu pozostanie i trwale nadpisze wartości klas, ponieważ atrybuty stylu w znaczniku mają większe znaczenie niż style klas.
Jednak po zakończeniu animacji nie dodano jeszcze nowej klasy, więc dzięki temu rozwiązaniu kolor przeskakuje do poprzedniego koloru, gdy użytkownik porusza myszą przed ukończeniem animacji.
Idealnie chcę, aby móc zrobić coś takiego:
$('#someDiv')
.mouseover(function(){
$(this).stop().animate( getClassContent('blue'), {duration:500});
})
.mouseout(function(){
$(this).stop().animate( getClassContent('red'), {duration:500});
});
Gdzie getClassContent
po prostu zwróci zawartość podanej klasy. Kluczową kwestią jest to, że w ten sposób nie muszę przechowywać definicji stylów w dowolnym miejscu, ale mogę przechowywać je w klasach w arkuszu stylów.
getClassContent
to wygląda