Estou usando jQuery e jQuery-ui e quero animar vários atributos em vários objetos.
Para explicar o problema aqui, simplifiquei-o para uma div que muda de azul para vermelho quando o usuário passa o mouse sobre ele.
Consigo obter o comportamento que desejo ao usar animate()
, no entanto, ao fazê-lo, os estilos que estou animando devem estar no código de animação e, portanto, são separados da minha folha de estilos. (veja o exemplo 1 )
Uma alternativa é usar addClass()
e removeClass()
mas eu não tenho sido capaz de recriar o comportamento exato que eu possa começar com animate()
. (veja o exemplo 2 )
Exemplo 1
Vamos dar uma olhada no código que tenho com animate()
:
$('#someDiv')
.mouseover(function(){
$(this).stop().animate( {backgroundColor:'blue'}, {duration:500});
})
.mouseout(function(){
$(this).stop().animate( {backgroundColor:'red'}, {duration:500});
});
exibe todos os comportamentos que estou procurando:
- Anima suavemente entre vermelho e azul.
- Nenhuma animação é “superaquecida” quando o usuário move o mouse rapidamente para dentro e para fora da div.
- Se o usuário mover o mouse para fora / para dentro enquanto a animação ainda estiver sendo reproduzida, será facilitada corretamente entre o estado atual 'meio caminho' e o novo estado 'objetivo'.
Mas, como as mudanças de estilo são definidas animate()
, preciso alterar os valores de estilo e não posso apontar apenas para a minha folha de estilo. Essa 'fragmentação' de onde os estilos são definidos é algo que realmente me incomoda.
Exemplo 2
Aqui está minha melhor tentativa atual de usar addClass()
e removeClass
(observe que, para que a animação funcione, você precisa do 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});
});
Isso exibe as propriedades 1. e 2. dos meus requisitos originais, no entanto 3 não funciona.
Eu entendo o motivo disso:
Ao animar addClass()
e o removeClass()
jQuery adiciona um estilo temporário ao elemento e, em seguida, incrementa os valores apropriados até atingirem os valores da classe fornecida, e somente então ele realmente adiciona / remove a classe.
Por isso, tenho que remover o atributo style, caso contrário, se a animação for interrompida até a metade, o atributo style permanecerá e sobrescreverá permanentemente quaisquer valores de classe, pois os atributos de estilo em uma tag têm maior importância do que os estilos de classe.
No entanto, quando a animação está no meio do caminho, ela ainda não adicionou a nova classe; portanto, com esta solução, a cor salta para a cor anterior quando o usuário move o mouse antes da conclusão da animação.
O que eu quero idealmente é ser capaz de fazer algo assim:
$('#someDiv')
.mouseover(function(){
$(this).stop().animate( getClassContent('blue'), {duration:500});
})
.mouseout(function(){
$(this).stop().animate( getClassContent('red'), {duration:500});
});
Onde getClassContent
apenas retornaria o conteúdo da classe fornecida. O ponto principal é que, dessa forma, não preciso manter minhas definições de estilo em todo o lugar, mas posso mantê-las nas classes da minha folha de estilo.
getClassContent
é a aparência?