2009-10-27 13 views
5

Estoy buscando utilizar jQuery para eliminar la necesidad de utilizar un GIF para crear una animación bastante simple.jQuery GIF Animaciones

Lo que quiero es una imagen para tener cuatro etapas. 1) Nada mostrando 2) La primera parte de la imagen 3) Segunda parte de la imagen 4) Tercera parte de la imagen - Empezar de nuevo

Estaba pensando que había necesidad de crear las etapas de imagen luego use la técnica 'reemplazar la imagen actual con la siguiente' con jQuery para crear la animación. Eso podría ser bastante fácil con devoluciones de llamadas.

La siguiente parte es que esta animación aparezca en varios lugares después de que la animación anterior haya terminado de cargarse. Una vez más, podría ser fácil con devoluciones de llamadas.

Estaba buscando algunas ideas sobre esto. ¿Es estúpido no solo usar GIF? ¿O podría hacerse esto con jQuery?

Respuesta

0

primer lugar se puede utilizar el fondo de varias div poner la parte de imagen que necesita

css_background-position

entonces usted tiene que mostrar el div como sea necesario para que se muestre en función del tipo de animación que necesita .

0

Use GIF animados - esto es para lo que están hechos. Estoy seguro de que es posible hackear juntos una solución utilizando JQuery, pero pagaría un costo adicional en tiempo de desarrollo y complejidad.

Además, debe reconocer que, al utilizar una solución JQuery/CSS personalizada, está tomando la decisión de acoplar estrechamente su animación a la página que está activa. ¿Qué pasa si alguien quiere incluir la animación en una página diferente? Tendrían que copiar un montón de código en lugar de un solo archivo GIF. ¿Qué pasa si alguien quiere incluirlo en un correo electrónico o una presentación de Power-point? No se puede hacer ...

+0

Los gifs son feos y son anteriores, sin alfamap, con un sólido mate sobre fondos transparentes. con el posicionamiento bg de los sprites de css puedes lograr mucho más de lo que puedes lograr con los gifs. – Sinan

+0

Si tener un fondo transparente sobre un fondo no sólido es una consideración importante en esta instancia, entonces sí, vaya con la solución de sprite JQuery más poderosa. Pero lo que debes reconocer es que al hacerlo, estás pagando un impuesto con una complejidad adicional. Piensa en el pobre programador de mantenimiento que tiene que entrar en el código para cambiar el gráfico en un par de años. ¿Es justo suponer que tendrán una gran comprensión de los sprites de JQuery y css? Podrían saber eso, pero creo que sería mucho más amable dejarles que agreguen un nuevo GIF y terminen con eso. –

+0

sí, tienes razón, es más intensivo en recursos que los gifs, pero nos dirigimos a 2010, deberían aprenderlo :) – Sinan

0

Si va a ser constante y no orientado a eventos, recomiendo usar gifs.

Si, sin embargo, la animación es en respuesta a algo que sucede en la página, o si solo quiere que comience después de que todo está cargado, entonces jquery es probablemente el camino a seguir.

Solo debe poder cambiar el origen de la imagen (o el desplazamiento de posición si está usando una sola imagen) para cambiar la imagen. Eche un vistazo a some "pause" options en jQuery para retrasar los cambios entre las imágenes.

ejemplo no probado (derivado de la respuesta de Simon en el siguiente enlace):

function chg1() { $('#myimage').attr('src', ''); } 
function chg2() { $('#myimage').attr('src', 'image1src.jpg'); } 
function chg3() { $('#myimage').attr('src', 'image2src.jpg'); } 
function chg4() { $('#myimage').attr('src', 'image3src.jpg'); } 

function StartAnimation() { 
    setTimeout(chg1, 2000); // blank after 2 seconds 
    setTimeout(chg2, 4000); // img 1 after 4 seconds 
    setTimeout(chg3, 6000); // img 2 after 6 seconds 
    setTimeout(chg4, 8000); // img 3 after 8 seconds 
    setTimeout(StartAnimation, 8000); // start again after 8 seconds 
} 

StartAnimation(); // start it off 
+0

parece que las llamadas a 'animate' van a acumularse lo suficientemente bien, pero los cambios en el 'src', ya que no están ocurriendo como una devolución de llamada a tus animaciones, ¿van a disparar instantáneamente una tras otra? – Funka

+0

@Funka - tienes razón, la animación no bloquea. Voy a modificar el código. – Damovisa

+0

Sí, @Funka tiene razón. jQuery es asincrónico, por lo que tendrá que usar devoluciones de llamada para lograr esto en su lugar. –

0

¿Sería posible combinar sus cuatro imágenes en un sprite (1 gráfico real con las cuatro imágenes incluidas & sin superposición)? Desde el punto de vista del rendimiento, el navegador del cliente solo tiene que descargar una sola imagen en lugar de hacer 4 solicitudes para cada una de las cuatro imágenes.

Crear la animación sería tan simple como utilizar la técnica sugerida anteriormente por Damovisa, solo hacerlo usando algún elemento de bloque, configurando esta imagen como fondo y configurando el tamaño del elemento al tamaño de un "mosaico" de la imagen individual, y cambiar la propiedad css de posición de fondo. No estoy completamente seguro de esto (corrígeme si me equivoco), pero parece una operación menos costosa para mover una imagen de fondo en lugar de cambiar cuatro imágenes diferentes.

En cuanto a la portabilidad y reutilización, puede crear un plugin de jQuery para poder usarlo en varios lugares.

3

Esto es mucho más fácil y mantiene cadena-capacidad:

JQuery:

$(document).ready(function(){ 
    //rotator - delay, children 
    $('#slideshow').rotator(50, 'img'); 
}); 

de marcado:

<script type="text/javascript" src="http://code.jquery.com/jquery-1.5.min.js"></script> 
<script type="text/javascript" src="scripts/jquery.rotator.js"></script> 

<style type="text/css"> 
#slideshow { 
    position:absolute; //or whatever you need 
    display:block; 
    top:0px; 
    left:0px; 
} 
#slideshow img { 
    position:absolute; 
    opacity:0; 
} 
</style> 

<!-- SLIDESHOW --> 
<div id="slideshow"> 
    <img src="images/1.png"> 
    <img src="images/2.png"> 
    <img src="images/3.png"> 
</div> 

Plugin:

(function($){ 
    $.fn.rotator = function(delay, child){ 
     //set curImage val 
     var currImg = 0; 
     var currIt = true; 
     //set array of images 
     var ss = $('#slideshow').children(child); 
     var ssize = ss.size(); 
     setInterval(function() { 
      if(currIt){ 
       $(ss[currImg]).css('opacity','1'); 
       currIt = !currIt; 
      }else if (!currIt){ 
       $(ss[currImg]).css('opacity','0'); 
       $(ss[currImg+1]).css('opacity','1'); 
       currIt = !currIt; 
       currImg++; 
      } 
      //reset 
      if(currImg >= ssize){ 
       currImg = 0; 
       $(ss[currImg]).css('opacity','1'); 
      } 
     }, delay); 
     return this; 
    }; 
})(jQuery); 
+0

Esta es una gran solución, estoy trabajando en un proyecto smilar y usé este código, pero me encontré con un problema. Exporté una animación de 9 segundos a través de una secuencia de imágenes y necesito recorrer cíclicamente 300 imágenes. Esto funciona muy bien, sin embargo, la presentación de fotos se retrasa. ¿Hay alguna manera de precargar imágenes para que la presentación se inicie una vez que las imágenes se carguen? – TechyDude

Cuestiones relacionadas