2012-09-10 12 views
9

En un sitio web, estoy experimentando un "flash" de blanco que se produce entre cargas de página. Se ve mal porque estoy usando una imagen de fondo y cuando se carga la página, las imágenes de fondo parpadean antes de aparecer en la pantalla (take a look for yourself). Este problema ocurre en Chrome y IE, pero no en Firefox.Intermitente entre cargas de página

El sitio tiene una forma de precargar cosas. Todos los elementos de la página están en un envoltorio div #website que está inicialmente en display:none, y cada imagen está en un contenedor div #website-images que también está oculto. Luego, el sitio (usando un plugin jquery) verifica si todas las imágenes en #website-images están listas para cargar, una vez que están almacenadas se recuerda que este usuario ya ha cargado las imágenes, por lo que no pasará por el proceso de precarga una vez van a otra página o vuelven a cargar la actual, luego se realiza una llamada al $("#website").show() para mostrar la página web.

Entonces, ¿qué podría estar causando este parpadeo entre las cargas de la página? ¿Es mi forma de precargar imágenes? He agregado doctypes diferentes y he cambiado la metainformación, pero NADA ha funcionado. Estoy realmente perdido aquí, ¿alguien tiene alguna idea o idea?

Respuesta

38

Esto sucede porque el evento DOMLoaded se activa suficientes milisegundos antes de que la página realmente se presente.

En pocas palabras, esto significa que debe optimizar la velocidad de su sitio web. Esto no significa hacer que descargue más rápido, pero significa descargar en el orden correcto, en una forma sin bloqueo.

Paso uno: su margen de beneficio

1) Parece que hay muchas cosas que puede hacer para optimizar su margen de beneficio. En primer lugar, se puede optimizar el orden de las hojas de estilo y JavaScripts. Para garantizar que los archivos CSS se descarguen de manera asincrónica, siempre debe incluir CSS externo antes de los archivos JavaScript externos. style.css se descarga después de algunas/todas sus llamadas de JavaScript.

Hay 1 bloque de script encontrado en el encabezado entre un archivo CSS externo y otro recurso. Para permitir la descarga paralela, mueva la secuencia de comandos en línea antes del archivo CSS externo o después del siguiente recurso.

2) Su archivo JavaScript principal está en línea dentro de su marcado. Esto no solo bloquea la descarga de la página hasta que el script haya terminado de descargarse, sino que al tenerlo antes de, su contenido probablemente esté causando (o agregando) el destello blanco.

Mi método preferido es cargar la secuencia de comandos de forma asincrónica en la cabeza. Luego deberá disparar su script cuando el DOM haya terminado de cargarse, o puede lograr el mismo resultado colocando el script en la parte inferior de la etiqueta del cuerpo.

Segundo paso: Arnés de las capacidades del navegador

1) Mirando a las cabeceras HTTP, hay 28 elementos que se sirven como llamadas HTTP separadas, que no están siendo almacenados en la caché del navegador (incluyendo las páginas HTML, imágenes JPG , hojas de estilo y archivos de JavaScript).

Estos elementos son explícitamente no almacenados en caché, y esto se puede solucionar fácilmente editando la configuración de su servidor web.

2) Habilita la compresión gzip. La mayoría de los navegadores web (sí, incluso IE) admiten la descompresión de gzip, y la mayoría (si no todos) los servidores web admiten la compresión mediante gzip. Incluso podría exagerar y buscar en SPDY, que es un protocolo HTTP alternativo más ligero (compatible con Chrome y Firefox).

Paso tres: Contenido servir

Hay alrededor de 30 elementos individuales que se sirven de su dominio. En primer lugar, considere cómo podría reducir este número de solicitudes. 30 solicitudes HTTP por vista de página es mucho. Puede combatir esto usando los siguientes métodos:

1) Descargas paralelas en varios nombres de host. Los navegadores actualmente limitan el número de conexiones concurrentes a un solo dominio. El servicio de sus imágenes desde un dominio separado (por ejemplo, img.bigtim.ca) puede permitir que se sirvan en paralelo a otro contenido.

2) Combina múltiples elementos en uno solo. Muchos elementos que se descargan son puramente de contenido de estilo, como el logotipo, elementos de menú, etc. Estos se pueden combinar en una sola imagen (se descargan solo una vez) y se dividen usando CSS. Esto se llama CSS spriting. Stack Overflow hace esto: look here.

3) Si no puede reducir la cantidad de elementos que necesitan ser descargados, podría reducir la carga en su servidor (y, a su vez, el navegador del cliente) sirviendo contenido estático de un dominio sin cookies. Stack Overflow lo hace con todo su contenido estático, como imágenes, hojas de estilo y scripts.

Paso cuatro: Optimizar su propio código

Sólo hay tanto que HTTP y la tecnología del navegador puede hacer para ayudar a la velocidad de su sitio web. Este último paso depende de ti.

1) ¿Hay alguna razón por la que elige alojar jquery usted mismo? La página de descarga de Jquery muestra múltiples CDN donde puede apuntar para una descarga de scripts rápida y en caché.

2) Actualmente hay más de 20 reglas de CSS sin usar en sus hojas de estilo (es decir, el 36% de todo el archivo CSS). Reflexiona sobre lo que realmente se necesita.

3) La parte principal de JavaScript (en la parte superior de la etiqueta de su cuerpo) parece ser un truco para intentar acelerar las cosas, pero probablemente no está ayudando nada.

Se está configurando una cookie para especificar si la página se ha desvanecido todavía o no. No solo está usando JavaScript para realizar una transición que felizmente puede realizar CSS, sino que más de la mitad de la secuencia de comandos se utiliza para definir la funcionalidad de lectura y escritura de la cookie.

Viendo cosas como esta: $("body").css ("background-image", "url('images/background.png')"); y $("#website").show(); por lo general me pone despotricar sobre "separación de intereses", pero esta respuesta es el tiempo suficiente ahora así que espero que se puede ver que es una mala práctica de mezclar el estilo y la funcionalidad en el mismo código.

Adición: mirando el código, no hay necesidad de jquery en absoluto para realice lo que está haciendo. Pero, de nuevo, no hay necesidad de realizar lo que está haciendo, por lo que probablemente podría hacer mejor sin ningún JavaScript en absoluto.

+0

¡Guau, gracias esto es increíble! –

4

Mueva su javascript al final del html justo antes de cerrar las etiquetas de cuerpo. A veces ayuda.

Cuestiones relacionadas