2009-02-03 71 views
5

de un CSS como esto:retrasar la carga de una cierta imagen de fondo CSS

... 
#big-menu { 
    background: #fff url(../images/big-menu.jpg) no-repeat; 
} 
#some-menu { 
    background: #fff url(../images/some-menu.jpg) no-repeat; 
} 
#some-other-menu { 
    background: #fff url(../images/some-other-menu.jpg) no-repeat; 
} 
... 

hay una manera de retrasar la carga de la imagen de fondo #big-menu 's de, para que se cargue después de todo lo demás, incluyendo todos de las imágenes en el HTML y en cualquier otro fondo CSS (some-menu y some-other-menu).

La razón es que big-menu.jpg tiene un tamaño muy grande y quiero que se cargue último. Después de todo, solo sirve como un caramelo, y hay otras imágenes de fondo que tienen un mejor uso que eso. (como los que se usan en los botones)

¿El orden de ponerlo en CSS o las apariciones del marcado (#big-menu) en HTML tiene algo que ver con lo que se carga primero? o hay una forma más confiable de controlarlo? javascript (jQuery preferido) está bien.

+0

Hola, andy! – alex

Respuesta

8

El pedido en css no controla qué recursos se cargan primero, pero sí qué estilo existente se sobrescribe o se hereda.

Pruebe el evento JavaScript onload. El evento se ejecuta solo después de que la página termine de cargarse.

function loadBG(){ 
    document.getElementById("big-menu").style.backgroundImage="url(../images/big-menu.jpg)"; 
} 
window.onload=loadBG(); 
+0

¿se acabaron de cargar todas las imágenes y todas las demás imágenes de fondo cuando se llamó a esta función? el evento de carga, AFAIK, se activa cuando el HTML, no las imágenes, termina de cargarse. – andyk

+1

El evento de carga se activa cuando todos los recursos en la página han terminado de cargarse, incluidas las imágenes y los iframes y los archivos css y los archivos javascript. –

+0

@Pim gracias por aclarar. – andyk

0

El control cuando una imagen se carga en CSS no es realmente posible. Podría tratar de ponerlo en la parte inferior de su StyleSheet, pero dudo que vea una mejora.

2

No creo que la ubicación en la hoja de estilo lo afecte, ya que el orden de los elementos a los que se aplica decidirá qué imagen se cargará primero.

Se puede usar jQuery para cargar las imágenes en la secuencia correcta, aunque

$('firstElement').addClass('some-menu'); 
$('secondElement').addClass('some-other-menu'); 
$('lastElement').addClass('big-menu'); 

EDIT: bien, así que entonces tal vez de añadir una clase, una mejor solución sería añadir el fondo -imágenes en tiempo de ejecución.

$('firstElement').css("background-image", "some-menu.jpg"); 
$('secondElement').css("background-image", "some-other-menu.jpg"); 
$('lastElement').css("background-image", "big-menu.jpg"); 
+0

Las imágenes a las que se hace referencia en una hoja de estilo se encontrarán con el cable incluso si no se utilizan en el diseño real. Agregar una clase simplemente demorará cuando se muestren. –

4

esto podría no ser una solución perfecta (ya que es un css-fondo y no una imagen), pero YUI Image loader proporciona una buena forma de imágenes perezoso de carga.

Crear un grupo

var imgGroup = new YAHOO.util.ImageLoader.group(window, 'load', 2); 

vez que el documento se haya cargado, la imagen se cargará 2 segundos después de ella. Consulte Yahoo! Shine o examples para la demostración.

+0

También vea este enlace para un equivalente de jQuery: http://www.appelsiini.net/projects/lazyload –

4

Otra solución es dividir sus activos en diferentes dominios, los navegadores solo solicitarán dos activos al tiempo y luego esperarán que se cargue uno antes de comenzar el siguiente. Puede observar esto con Firebug y YSlow, por lo que coloca algunos recursos en images.example.com e images1.example.com y vea si eso tiene un impacto

+0

buena respuesta. He pensado en eso, pero me pareció bastante engorroso y no es exactamente factible en este momento, dado que solo necesito retrasar esa imagen y no tengo acceso a los subdominios. Sin embargo, +1 :) – andyk

+1

Vale la pena señalar para 2013 que la mayoría de los navegadores modernos cargan muchos más activos a la vez al mismo tiempo. – Ally

0

El orden de descarga no se puede controlar utilizando css. Sin embargo, puedes usar javascript para lograr esto.

Aunque no se relaciona directamente con la pregunta, quizás antes de hacer eso, debe optimizar la imagen usando smush.o su programa de imagen favorito, los jpegs se ven muy bien cuando se guardan con un 85% de calidad. Experimenta y no te olvides de configurar tu servidor web para que guarde en caché las imágenes durante largos periodos y luego el problema será la primera vez que tus usuarios accedan al sitio.

0

El truco de Jason para Javascript funcionó para resolver este problema. Sin embargo, tuve que corregir la sintaxis ligeramente:

function loadBG(){ 
    document.getElementById("big-menu").style.backgroundImage="url(../images/big-menu.jpg)"; 
} 
window.onload=loadBG(); 
+1

Edité su respuesta para contener su sintaxis corregida. – gmeben

Cuestiones relacionadas