2012-08-16 38 views
7

Tengo una galería en mi sitio web. La galería contiene 15 imágenes, cada una de ellas tiene aproximadamente 500 KB (el tamaño total es de 7,5 MB).Cargando GIF (Preloader) se bloquea solo en Chrome

Como la galería demora un poco en cargarse (25 segundos en mi computadora, depende de la conexión), quiero que el visitante sepa que la galería se está cargando, por lo tanto, Ajax loading GIF.

Quiero que el visitante vea el archivo GIF tan pronto como ingrese a la página de la galería, hasta que las imágenes de la galería se hayan descargado y estén listas para su visualización.


Con el fin de lograr mi objetivo, esto es lo que he hecho:

Este es el comienzo del cuerpo de la página de la galería HTML:

<body> 
    <img src="images/ajax-loader.gif" alt="" class="hiddenPic" /> 
    <!-- loading Ajax loading GIF before all the other images --> 

Y esta es la parte CSS de la galería:

#gallery { 
    background: url(images/ajax-loader.gif); 
    background-repeat:no-repeat; 
    background-attachment: fixed; 
    background-position: center; 

Básicamente, el GIF de carga se debe descargar tan pronto como un visitante ingrese a la página de la galería, porque es el primer objeto dentro del <body> que se va a descargar. Sin embargo, no es visible debido a la clase hiddenPic.

Este método debería ayudar a que la carga de GIF esté lista y visible como fondo de la galería lo antes posible, hasta que todas las imágenes de la galería se hayan descargado y la galería esté lista.


Sin embargo, el GIF de carga no funciona correctamente en Google Chrome; funciona perfectamente bien en Firefox & IE (girando sin problemas) - pero se atasca (no gira correctamente) en Chrome, desde el momento en que aparece hasta que la galería está lista.

Actualización: Sé que puedo poner en práctica una mejor galería (como las que se sugieren en los comentarios) que requerirían menos recursos por parte del usuario al entrar en la página de la galería - pero yo no entiendo cómo se puede ser la causa del problema cuando el cargador GIF funciona perfectamente en Firefox & IE.

¿Por qué el AJAX que carga el GIF no funciona correctamente en Chrome?

+0

Cargando su sitio web parece funcionar como se esperaba, incluso en Chrome (v21.0.1180.77 m). Ciertamente, cuando cargo la página me presento con el giradiscos GIF, que luego es reemplazado por la galería. Yo diría que es bastante lento, es decir. No veo el spinner giratorio. Simplemente lo veo en 3 o 4 posiciones diferentes, pero es probable que se deba a cargar el resto de la galería y que mi PC sea un poco lenta. Sin embargo, estoy cargando la galería en aproximadamente 5-6 segundos, no en los 25 segundos que sugieres, lo que puede estar afectando los resultados. – Chris

+1

Además, aunque creo que deberías tener un GIF giratorio, me pregunto si deberías cargar toda la galería de inmediato, por dos razones: 1) ralentiza toda la página y 2) desperdicia ancho de banda ya que las personas no pueden ver todo las fotos. Exploraría un proceso de 1) cargar cada imagen cuando se selecciona (por lo que gif spinner para cada imagen) o 2) cargar decir las primeras 3. Luego, cuando presionen 'Next Image' (para mostrar la imagen 2) cargar la imagen 4. No verán ninguna diferencia, pero la harán mucho más rápida y eficiente. – Chris

+0

Entonces, ¿por qué la ruleta está trabada es porque cargar las imágenes de la galería requiere la mayoría de los recursos? Quiero hacer girar el cargador - el GIF no es tan pesado, así que no veo por qué se atasca y no puedo hacerlo girar correctamente, incluso (bueno, solo) cuando las imágenes se están descargando a la computadora. Acerca de su sugerencia, parece una excelente manera de acortar el tiempo de espera y hacer que funcione rápidamente. No estoy seguro de qué camino es mejor, pero si voy a usar no'1, tengo que agregar miniaturas a mi galería. – amiregelz

Respuesta

5

Sólo tiene que eliminar esta declaración en la línea 602:

background-attachment: fixed; 
+1

Lo cambié (está en vivo en el sitio web en este momento), pero el cargador GIF aún se atasca tan pronto como aparece, hasta que se carga la galería. – amiregelz

+1

@amiregelz bien, entonces encontré tu problema: mira mi actualización. – Knu

+1

** ¡Finalmente, una solución real! Funciona impecablemente ahora:) ** No pude encontrar ninguna información sobre por qué esta declaración confunde la forma en que el GIF se muestra y gira en Google Chrome. Además, ¿debería conservar el nuevo atributo 'hiddenPic'? ¿Hay alguna diferencia? – amiregelz

1

Estoy a strong advocate de usar dataURI con base64 -imágenes codificadas en esta y situaciones similares. Lo que hace es, de hecho, elimina la necesidad de una solicitud http por separado para recuperar el gif spinner, lo que significa que la animación de "carga" está inmediatamente disponible para ser renderizada. Esto hace que el valor de la mejora de UX sea más valioso que un par de kilobytes adicionales en gastos generales, especialmente debido a que la hoja de estilos solo se descargaría una vez y el cliente la almacenaría en la memoria caché.

This fiddle ha la animación incrustado desde ajaxload.info, después de haber añadido literalmente menos de 1 KB a la CSS final.

Tenga en cuenta que este tipo de incrustación de recursos no es compatible en todo el Internet Explorer 7 (IE7 pero los usuarios tienen preocupaciones mucho más importantes para abordar :)

+0

¿Cuándo debería usar las imágenes codificadas URI base64 de datos en general? ¿Dónde se destaca particularmente? – amiregelz

+0

@amiregelz: siempre que la sobrecarga de la codificación sea más económica que las conexiones separadas y se exige una capacidad de respuesta extrema - "cargar" gfx es un ejemplo clásico en el que no se desea que el usuario espere * que * cargue :) También considero recursos para incrustación basados ​​en la frecuencia con que se usa en todo el sitio, sería más difícil (los íconos aplicados como fondos parciales son particularmente difíciles) y sería preferible css declaraciones (gradientes/patrones toman más espacio para declarar, además de es una sobrecarga computacional nominal en comparación con cuando se utilizan gráficos pretratados) –

+0

El código URI de mi cargador GIF, cuando está codificado con base64, es [* dolorosamente largo *] (http://jsfiddle.net/amiregelz/sx9Q4/). ¿Todavía vale la pena usarlo? Veo que hay un retraso, ya que lleva tiempo decodificar el código base64, pero es bastante lento debido a la longitud del código. – amiregelz

0

personalmente para cargadores que siempre he hecho de esta manera, no me acuerdo donde lo leí .. Pero su siempre trabajé para mí ..

 
$(function(){ 

$('#overlay') 
    .hide() 
    .ajaxStart(function() { 
     $(this).css("display","inline"); 
     }) 
    .ajaxStop(function() { 
     $(this).hide(); 
     }); 
}); 

lo que hace, es que se necesita el div con un id de overlay y sobre cualquier petición AJAX que sale, lo hace visible y una vez que el la solicitud de ajax está completa, la oculta.

Avíseme si necesita más código.

Saludos.

+0

¿Podría mostrarme un ejemplo de este método (por ejemplo, jsFiddle)? – amiregelz

+0

Aquí tienes @amiregelz: http://jsfiddle.net/nWDUg/ – Shrayas

3

También tuve el mismo problema. La forma en que lo arreglé fue poner el gif de carga en su propio elemento (para mantener el marcado limpio, use un pseudo elemento).

Ahora, en lugar de usar la regla de conexión de fondo, puede usar position: fixed. Aquí está el código que debe utilizar (suponiendo que desea gif cargador para sentarse justo en el centro de la pantalla):

#gallery:after { 
    content: ""; 
    background: url(images/ajax-loader.gif); 
    position: fixed; 
    top: 50%; 
    left: 50%; 
    width: 50px; /*change to the width of your image*/ 
    height: 50px; /*change to the height of your image*/ 
    margin-left: -25px; /*Make this 1/2 the width of your image */ 
    margin-top: -25px; /*Make this 1/2 the height of your image */ 
} 

Espero que esto ayude!