Я використовую jQuery і jQuery-ui і хочу анімувати різні атрибути на різних об'єктах.
Для пояснення цієї проблеми я спростив її до одного діва, який змінюється від синього на червоний, коли користувач переходить на нього.
Я можу отримати поведінку, яку я хочу використовувати animate()
, але при цьому стилі, які я анімую, повинні бути в анімаційному коді і так окремо від моєї таблиці стилів. (див. приклад 1 )
Альтернативою є використання addClass()
і , removeClass()
але я не зміг відтворити точний поведінка , яке я можу отримати з animate()
. (див. приклад 2 )
Приклад 1
Давайте подивимось на код, який у мене є animate()
:
$('#someDiv')
.mouseover(function(){
$(this).stop().animate( {backgroundColor:'blue'}, {duration:500});
})
.mouseout(function(){
$(this).stop().animate( {backgroundColor:'red'}, {duration:500});
});
він відображає всі форми поведінки, які я шукаю:
- Анімально плаває між червоним та синім.
- Немає анімації "перезапис", коли користувач швидко переміщує мишу в діву і виходить з неї.
- Якщо користувач пересуває мишу назовні / в той час, коли анімація все ще грає, вона полегшиться між поточним станом "на півдорозі" та новим станом "цілі".
Але оскільки зміни стилів визначені в animate()
мені, я повинен змінити значення стилів там, і я не можу просто вказати на мій таблицю стилів. Це "фрагментація", де визначено стилі, - це щось, що мене справді хвилює.
Приклад 2
Ось моя поточна найкраща спроба використання addClass()
та removeClass
(зауважте, що для роботи анімації вам потрібен 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});
});
Це демонструє як властивість 1., так і 2. моїх первісних вимог, однак 3 не працює.
Я розумію причину цього:
Під час анімації addClass()
та removeClass()
jQuery додає елемент тимчасового стилю, а потім збільшує відповідні значення, поки вони не досягнуть значень наданого класу, і лише після цього він фактично додає / видаляє клас.
Через це мені доведеться видалити атрибут стилю, інакше, якщо анімація зупиниться на півдорозі, атрибут стилю залишиться і назавжди замінить будь-які значення класу, оскільки атрибути стилів у тегу мають більшу важливість, ніж стилі класу.
Однак, коли анімація завершена на півдорозі, вона ще не додала новий клас, і тому з цим рішенням колір переходить до попереднього кольору, коли користувач переміщає мишу до завершення анімації.
Що в ідеалі я хочу - це зробити щось подібне:
$('#someDiv')
.mouseover(function(){
$(this).stop().animate( getClassContent('blue'), {duration:500});
})
.mouseout(function(){
$(this).stop().animate( getClassContent('red'), {duration:500});
});
Куди getClassContent
б просто повернути вміст наданого класу. Ключовим моментом є те, що в такий спосіб мені не доведеться постійно тримати свої стильові визначення, але я можу зберігати їх у класах на моєму аркуші стилів.
getClassContent
це виглядає?