Colas de efectos en jQuery

  • Por
Vamos a explicar qué es una cola de efectos, para qué nos sirve y cómo se configuran las colas de efectos en el framework Javascript jQuery.

En el Manual de jQuery hemos tratado ya en diversos artículos de los efectos en jQuery. De hecho, éste ya es el cuarto artículo que destinamos a tratar las distintas maneras de crear efectos en este framework Javascript. Hasta la fecha hemos publicado las claves para la creación de efectos simples, el versátil método animate() para realizar la animación de atributos CSS numéricos, o las funciones de para crear efectos de fundido.

Todos estos métodos tratados anteriormente, y algunos más que no hemos revisado todavía como sliceUp() o sliceDown(), que funcionan de manera similar a los ya vistos métodos fadeIn() o fadeOut(), sirven para realizar efectos variados en páginas web y son tan sencillos de usar como invocarlos sobre el objeto jQuery que contiene al elemento que deseamos animar. Ahora que ya hemos superado este primer paso y ya sabemos hacer toda una gama de efectos simples, vamos a aprender a encadenar varios efectos a ejecutar uno detrás de otro.

Veremos en este artículo y varios que sucederán, que encadenar efectos es tan sencillo como llamar a todos los métodos de efecto que queremos realizar. Todos esos métodos se incluirán automáticamente en una cola y serán ejecutados uno detrás del otro, sin que tengamos que hacer nada por nuestra cuenta, aparte de la propia invocación de los métodos.

Funciones de efectos

Vamos a repetir a lo largo de los siguientes artículos un concepto que quiero explicar para que se sepa a qué nos referimos. Se trata de las "Funciones de efectos" que son aquellas que dispone jQuery para crear efectos especiales en páginas web. Como hemos dicho, en diversos artículos anteriores ya se han explicado y mostrado efectos de diversas de las funciones de efectos disponibles.

Las funciones de efectos son los métodos jQuery que realizan un cambio en los elementos de la página de manera suavizada, es decir, que alteran las propiedades de uno o varios elementos progresivamente, en una animación a lo largo de un tiempo.

Por poner un ejemplo, tenemos el método fadeOut(), que realiza un efecto de opacidad sobre uno o varios elementos, haciendo que éstos desaparezcan de la página con un fundido de opaco a transparente. El complementario método fadeIn() hace un efecto de fundido similar, pero de transparente a opaco. Como éstos, tenemos en jQuery numerosos métodos de efectos adicionales como animate(), sliceUp() y sliceDown(), etc. En la propia documentación del framework, en el apartado Effects de la referencia del API, podremos ver una lista completa de estas funciones de efectos.

En este Manual de jQuery ya hemos visto varios ejemplos sobre estas funciones de efectos y a lo largo de los próximos artículos que publicaremos en desarrolloweb .com veremos diversas otras aplicaciones de muestra donde podremos seguir aprendiendo.

Cola de efectos por defecto

Cuando invocamos varias funciones de efectos de las disponibles en jQuery, éstas se van introduciendo en una cola de efectos predeterminada, llamada "fx". Cada elemento de la página tiene su propia cola de efectos predeterminada y funciona de manera automática. Al invocar los efectos se van metiendo ellos mismos en la cola y se van ejecutando automáticamente, uno detrás de otro, con el orden en el que fueron invocados.

capa = $("#micapa");
capa.fadeOut();
capa.fadeIn();
capa.slideUp();
capa.slideDown();

Las funciones de efectos, una detrás de otra, se invocan en un instante, pero no se ejecutan todas a la vez, sino que se espera que acabe la anterior antes de comenzar la siguiente. Por suerte, jQuery hace todo por su cuenta para gestionar esta cola.

Como decimos, cada elemento de la página tiene su propia cola de efectos y, aunque incluso podríamos crear otras colas de efectos para el mismo elemento, en la mayoría de los casos tendremos suficiente con la cola por defecto ya implementada .

Ejemplo de ejecución de efectos en la cola predeterminada de jQuery

Vamos lanzar varios efectos sobre una capa y veremos como ellos mismos se ejecutan en el orden como los hemos invocado.

Tendremos un elemento DIV, como este:

<div id="micapa">Esta capa que se va a animar, en un bucle infinito...</div>

Ahora podemos ver una función que realiza la invocación a varios efectos jQuery:

function colaEfectos(){
   capa = $("#micapa");
   capa.animate({
      "font-size": "1.5em"
   }, 2000);
   capa.hide(1000);
   capa.show(1000);
   capa.animate({
      "left": "350px",
      "top": "50px"
   },1500);
   capa.animate({
      "font-size": "0.75em"
   }, 2000);
   capa.animate({
      "left": "100px",
      "top": "20px"
   }, 1500, colaEfectos);
}

Habría que fijarse que la última de las funciones de efecto invocadas hace una llamada a esta misma función, por medio de un callback, por lo que, cuando terminen de ejecutarse todos los efectos, se volverá a invocar a la función y se producirá así un bucle infinito, donde se repetirá todo el tiempo la misma secuencia de efectos.

Y ahora podemos poner en marcha esta función cuando la página esté lista:

$(document).ready(function(){
   colaEfectos();
});

El resultado del ejercicio completo se puede ver en una página aparte.

Con esto hemos hecho nuestro primer ejemplo de cola de efectos. Ha sido fácil, no? Pero claro que a partir de aquí la cosa se puede complicar todo lo que deseemos, o necesitemos. En el próximo artículo empezaremos a explicar el modos existentes en jQuery para alterar las colas de efectos, para hacer cosas como detenerlas, analizarlas, cargar funciones de otros tipos para ejecutar en la cola, etc.

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

GERMÁN

16/5/2012
Bien pero algo importante !!!
yo uso la funcion de tiempo para jquery $.timer(1200 function(tempo){
//ejecuto el efecto jquery depues o antes de que otro inicie
tempo.stop();
})

$.timer(800 function(tempo){
//ejecuto el efecto jquery antes de que incie el otro para que no se empalme el objeto
tempo.stop();

Alejandra

08/7/2015
ufff cola parece aleatoria
Se complica bastante cuando haces un efecto que tiene que realizarse en paralelo con otros y además en secuencia con otros. O es que algo no consigo entender. El caso es que a veces hacen comportamientos aleatorios y no sé como depurar los efectos. Qué se os ocurre?