2011-12-27 19 views
8

Hay toneladas de artículos sobre cómo precargar una imagen, sin embargo, parece que no puedo encontrar nada útil sobre la precarga de una imagen de fondo con jquery.Precargar imagen de fondo

Hice un simple maqueta HTML de lo que me gustaría lograr: http://jsfiddle.net/3rfhr/

  • un div carga aparece
  • fondo se carga
  • Cargando div desaparece aparece
  • Antecedentes DIV

Puedo manejar las transiciones div pero no tengo ni idea de cómo Debo precargar un fondo CSS. Gracias por leer mi pregunta :)

Respuesta

7

No se puede, siempre que sea una imagen de fondo. Cargarlo normalmente y luego establecer la imagen de fondo. Algo como esto:

var $img = $('<img src="' + src + '">'); 
$img.bind('load', function(){ 
    $('.yourDiv').css('background-image', 'url(' + src + ')'); 
}); 
if($img[0].width){ $img.trigger('load'); } 

la última línea es necesaria en algún navegador en caso de que la imagen se guarde en caché.

+0

Aha, por lo que el 'src' parte es reparado por la url de la imagen? – pufAmuf

+0

sí, 'src' es la url de la imagen, configúrelo para lo que necesite. La respuesta de Chris Kempen tiene una buena idea en cuanto a que está tomando el src del CSS, aunque no estoy seguro de cuál es la 2da línea para –

+1

. Can not es una palabra fuerte. Puede cargar la imagen usando File Api y establecer el atributo src en "data: image/gif; base64, ... my ... encoded ... image" Ver mi publicación a continuación para una referencia a otra publicación que cubra esta tecnica. –

0

A working example con un simulacro setTimeout para simular el tiempo de carga.

El código relevante jQuery es:

$('#LOADING-SIGN-DIV').fadeOut(); 
$('#DIV-THAT-NEEDS-PRELOADING').fadeIn(); 
+1

'setTimeout' no debe usarse para esto ... –

+0

' setTimeout' solo está ahí para simular el tiempo de carga y por ningún otro motivo. –

2

Para hacer la precarga, por qué no agarrar la URL del atributo css con jQuery? Algo como esto:

var bg_url = jQuery("#DIV-THAT-NEEDS-PRELOADING").css('background-image'); 

// using regex to replace the " url(...) "... 
// apologies for my noobish regex skills... 
bg_url = str.replace(/ /g, '', bg_url); // whitespace... 
bg_url = str.replace(/url\(["']?/g, '', bg_url); // next, the 'url("'... 
bg_url = str.replace(/["']?\)/g, '', bg_url); // finally, the trailing '")'... 

// without regex, using substring if confident about no quotes/whitespace... 
bg_url = bg_url.substring(4, bg_url.length-1); 

// preloading... 
var img = new Image(); 
img.onload = function() 
{ 
    // do transitions here... 
}; 
img.src = bg_url; 
+0

La segunda línea probablemente debería ser una expresión regular, a menos que esté seguro de que se ignora el espacio en blanco en todos los navegadores. (me tomó un minuto darme cuenta de que es para analizar 'url (...)') –

+0

Para quitar el 'url (...)' del atributo css. Sí, definitivamente podría usar regex, y por lo que sé jQuery siempre debería darte un buen valor de cadena;) –

+0

Sí, me di cuenta de que :) Editó mi comentario anterior justo cuando respondiste, preocupado por el espacio en blanco y/o las citas. –

1

Su lógica es casi buena, pero no puede detectar eventos para CSS en jquery.

Debe cargar la imagen de fondo en algún elemento <img>. Captura la carga del evento de ese elemento y cuando se dispara, cambias la imagen de fondo a ese src y haces el resto de tu lógica.

2

Aquí hay un post de la semana pasada que cubría la precarga de imágenes con jQuery: HTML 5 File load image as background-image

Y aquí es la solución que publicar referencia: http://sveinbjorn.org/dataurls_css

+0

Esta podría ser la única solución que utiliza la API de HTML 5, pero con la carga de imágenes regular mediante URL, esta solución fue más lenta que la solución de @cwolves. Las imágenes se cargan más lentamente y la depuración también es más lenta porque el depurador muestra los datos de imagen codificados en base64 grandes. – jbustamovej