2012-06-24 19 views
30

que tienen una sección en mi sitio web que cuando un usuario hace clic me gustaría que se expanda, estoy usando para este toggleClass de la jQuery ...ToggleClass animar jQuery?

expandable: function(e) { 
    e.preventDefault(); 
    $(this).closest('article').toggleClass('expanded', 1000); 
} 

Esto está trabajando muy bien, solamente me gustaría para animarlo de alguna manera. En Chrome mi artículo crece lentamente al nuevo tamaño, solo en Firefox se "cambia el tamaño" instantáneamente sin animación, ¿hay alguna forma de tener este animado?

+1

Comprueba jQuery UI. – gdoron

+1

@gdoron hi, nice ... – thecodeparadox

Respuesta

52

jQuery UI extiende el jQuery nativa toggleClass a tomar un segundo parámetro opcional: duration

toggleClass(class, [duration]) 

Docs + DEMO

+0

Entonces, si quiero animar/desvanecer esta acción, ¿tengo que usar toda la biblioteca jQuery UI? ¿Hay alguna otra forma de hacerlo sin jQuery UI? – ed1nh0

+0

@ ed1nh0, puede crear una interfaz jQuery personalizada con solo las piezas que necesite. [Ver aquí] (http://jqueryui.com/download/), debo admitir que no tengo idea de en qué categoría debería estar allí. – gdoron

+3

Para usar toggleClass animado con jQuery UI, debe cargar 'Core' y' Effect Core'. Ver http://jqueryui.com/download/#!themeParams=none&components=1000000000000000000010000000000000 –

16

.toggleClass() no se animará, debe ir por el método slideToggle() o .animate().

+0

Con slideToggle() ¿puedo establecer una altura mínima para que no se oculte por completo? – Liam

4

Debería mirar la función toggle que se encuentra en jQuery. Esto le permitirá especificar un método de aceleración para definir cómo funciona el alternar.

slideToggle solo se deslizará hacia arriba y hacia abajo, no hacia la izquierda/derecha si eso es lo que está buscando.

Si necesita la clase para ser fijada, así que puede deifine que en la función toggle con un:

$(this).closest('article').toggle('slow', function() { 
    $(this).toggleClass('expanded'); 
}); 
+1

Gracias @Brombomb, actualmente estoy usando toggleClass(). No estaba seguro de si puedo agregarle una animación. – Liam

+1

exactamente lo que estaba buscando – srb

+2

Como nota al margen (porque no me di cuenta de esto al principio),.toggle() le permite animar el ocultamiento o mostrar un elemento en el DOM. Al principio pensé que animaría la transición entre estados de clase, que no es el caso. – Matt

1

debería haber comprobado, una vez incluí la Biblioteca de interfaz de usuario jQuery funcionó bien y fue animando. ..

10

simplemente Puede usar transiciones CSS, consulte this fiddle

.on { 
color:#fff; 
transition:all 1s; 
} 

.off{ 
color:#000; 
transition:all 1s; 
} 
+0

La mejor solución. Las animaciones y transiciones de CSS pueden reemplazar una miríada de (ahora) funciones y acciones de JavaScript innecesarias y hacer que el código sea mucho más ligero. Nice one Dario –

5

he tratado de utilizar el método toggleClass a ocultar un elemento en mi sitio (usando la visibilidad: oculto en contraposición a mostrar: ninguno) con una ligera animación, pero por alguna razón la animación no funcionaría (posiblemente debido a una versión anterior de jQuery UI).

La clase se eliminó y se agregó correctamente, pero la duración que agregué no pareció hacer ninguna diferencia: el elemento simplemente se agregó o eliminó sin ningún efecto.

Así que para resolver este utilicé una segunda clase en mi método de palanca y se aplica una transición CSS lugar:

El CSS:

.hidden{ 
    visibility:hidden; 
    opacity: 0; 
    -moz-transition: opacity 1s, visibility 1.3s; 
    -webkit-transition: opacity 1s, visibility 1.3s; 
    -o-transition: opacity 1s, visibility 1.3s; 
    transition: opacity 1s, visibility 1.3s; 
} 
.shown{ 
    visibility:visible; 
    opacity: 1; 
    -moz-transition: opacity 1s, visibility 1.3s; 
    -webkit-transition: opacity 1s, visibility 1.3s; 
    -o-transition: opacity 1s, visibility 1.3s; 
    transition: opacity 1s, visibility 1.3s; 
} 

El JS:

function showOrHide() { 
     $('#element').toggleClass("hidden shown"); 
    } 

Gracias @ tomas.satinsky para la increíble (y súper simple) respuesta en this post.

Cuestiones relacionadas