2012-08-16 22 views
7

Ho una galleria nel mio sito web. La galleria contiene 15 immagini, ciascuna di circa 500 KB (la dimensione totale è di 7,5 MB).Caricamento GIF (Preloader) si blocca solo su Chrome

Poiché la galleria richiede un po 'di tempo per caricare (25 secondi sul mio computer, dura dipende dalla connessione), voglio che il visitatore sappia che la galleria sta caricando, da cui il Ajax loading GIF.

Desidero che il visitatore visualizzi la GIF di caricamento non appena entra nella pagina della galleria, finché le immagini della galleria non sono state scaricate e sono pronte per essere visualizzate.


Al fine di raggiungere il mio obiettivo, questo è quello che ho fatto:

Questo è l'inizio del corpo della pagina HTML galleria:

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

E questa è la parte CSS della galleria:

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

Quindi, in pratica, la GIF di caricamento deve essere scaricata non appena un visitatore accede alla pagina della galleria, poiché è il primo oggetto all'interno dello <body> che verrà scaricato. Tuttavia, non è visibile a causa della classe hiddenPic.

Questo metodo dovrebbe aiutare a rendere il GIF di caricamento pronto e visibile come sfondo della galleria il prima possibile, fino a quando tutte le immagini della galleria sono state scaricate e la galleria è pronta.


Tuttavia, il GIF di carico non funziona correttamente su Google Chrome; funziona perfettamente su Firefox & IE (girando perfettamente) - ma rimane bloccato (non gira correttamente) su Chrome, dal momento in cui appare fino a quando la galleria è pronta.

Aggiornamento: so di poter implementare una galleria migliore (come quelli proposti nei commenti) che richiederebbe meno risorse da parte dell'utente quando si entra in pagina della galleria -, ma non capisco come ciò possa essere la causa del problema quando il caricatore GIF funziona perfettamente su Firefox & IE.

Perché l'Ajax che carica GIF non funziona correttamente su Chrome?

+0

Caricamento del sito Web sembra funzionare come previsto, anche in Chrome (v21.0.1180.77 m). Certamente quando carico la pagina mi viene presentato lo spinner GIF, che in seguito verrà sostituito dalla galleria. Direi che è piuttosto lento, cioè. Non vedo lo spinner "girare" lo vedo solo in 3 o 4 posizioni diverse, ma presumibilmente è il momento di caricare il resto della galleria e il mio PC è un po 'lento. Tuttavia, sto caricando la galleria in circa 5-6 secondi, non i 25 secondi che suggerisci in modo che possano influenzare i risultati. – Chris

+1

Inoltre, mentre penso che dovresti assolutamente avere uno spin GIF, mi chiedo se dovresti caricare subito l'intera galleria, per due motivi: 1) rallenta l'intera pagina e 2) spreca larghezza di banda perché le persone potrebbero non vedere tutto le immagini. Vorrei esplorare un processo di 1) caricando ogni immagine quando è selezionata (quindi gif spinner per ogni immagine) o 2) caricare dire il primo 3. Quindi quando colpiscono 'Next Image' (per mostrare l'immagine 2) caricare l'immagine 4. Non vedranno alcuna differenza ma lo renderanno molto più veloce ed efficiente. – Chris

+0

Quindi il motivo per cui lo spinner è bloccato perché caricare le immagini della galleria richiede la maggior parte delle risorse? Voglio far girare il caricatore - la GIF non è così pesante, quindi non vedo perché rimane bloccata e non riesco a farla girare correttamente, anche (beh, solo) quando le immagini vengono scaricate sul computer. A proposito del tuo suggerimento, sembra un ottimo modo per abbreviare i tempi di attesa e farlo funzionare velocemente. Non sono sicuro di quale sia il modo migliore, ma se userò no'1 devo aggiungere miniature alla mia galleria. – amiregelz

risposta

5

Hai solo bisogno di eliminare questa dichiarazione on line 602:

background-attachment: fixed; 
+1

L'ho modificato (è in diretta sul sito web in questo momento) - ma il caricatore GIF rimane bloccato non appena appare, finché la galleria non viene caricata. – amiregelz

+1

@amiregelz bene allora ho trovato il tuo problema: controlla il mio aggiornamento. – Knu

+1

** Finalmente una soluzione reale! Ora funziona perfettamente:) ** Non sono riuscito a trovare alcuna informazione sul motivo per cui questa dichiarazione compromette il modo in cui la GIF viene mostrata e gira su Google Chrome. Inoltre, dovrei mantenere il nuovo attributo 'hiddenPic'? c'è qualche differenza? – amiregelz

1

Sono a strong advocate dell'uso di dataURI con base64 - immagini codificate in questa e simili situazioni. Ciò che fa è effettivamente eliminare la necessità di una richiesta http separata per recuperare la gif spinner, il che significa che l'animazione "loading" è immediatamente disponibile per essere renderizzata. Ciò rende il valore del miglioramento UX più prezioso di un paio di kilobyte extra in overhead, specialmente perché il foglio di stile viene scaricato solo una volta e quindi memorizzato nella cache dal client.

This fiddle ha l'animazione incorporato da ajaxload.info, avendo aggiunto letteralmente meno di 1 KB per la finale CSS.

Si noti che questo tipo di incorporamento delle risorse non è supportato affatto su IE7 (ma gli utenti IE7 hanno preoccupazioni molto più grandi per affrontare :)

+0

Quando dovrei usare le immagini codificate con URI di base 64 di dati in generale? Dove eccellono in particolare? – amiregelz

+0

@amiregelz: imo ogni volta che il sovraccarico della codifica è più economico di connessioni separate e viene richiesta un'estrema reattività - "caricare" gfx è un classico esempio in cui non si desidera che l'utente attenda * per * caricare :) Prenderò in considerazione risorse per l'incorporamento in base alla frequenza con cui viene utilizzato attraverso il sito, sarebbe più difficile scriverlo (le icone applicate come sfondi parziali sono particolarmente difficili) e sarebbe preferibile alle dichiarazioni CSS (gradienti/motivi richiedono più spazio per dichiarare, più lì è overhead computazionale nominale rispetto a quando viene utilizzata la grafica pre-renderizzata) –

+0

Il mio codice URI di caricamento del caricatore GIF, quando codificato con base64, è [* dolorosamente lungo *] (http://jsfiddle.net/amiregelz/sx9Q4/). Vale ancora la pena utilizzarlo? Vedo che c'è un ritardo poiché ci vuole tempo per decodificare il codice base64, ma è piuttosto lento a causa della lunghezza del codice. – amiregelz

0

Personalmente per caricatori ho sempre fatto in questo modo, non mi ricordo dove l'ho letto .. Ma la sua sempre lavorato per me ..

 
$(function(){ 

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

ciò che fa, è che ci vuole il div con un id di overlay e su qualsiasi richiesta AJAX che esce, lo rende visibile e una volta che la la richiesta Ajax è completa, la nasconde.

Fammi sapere se hai bisogno di più codice.

Cheers.

+0

Puoi mostrarmi un esempio di questo metodo (ad esempio jsFiddle)? – amiregelz

+0

Qui vai @amiregelz: http://jsfiddle.net/nWDUg/ – Shrayas

3

Ho anche avuto lo stesso problema. Il modo in cui l'ho risolto è stato inserire la gif di caricamento nel proprio elemento (per mantenere pulito il markup, utilizzare uno pseudo elemento).

Ora, invece di utilizzare la regola di background-attachment, è possibile utilizzare position: fixed. Ecco il codice si dovrebbe usare (assumendo che vuoi che loader gif di sedersi proprio nel mezzo dello schermo):

#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 */ 
} 

Spero che questo aiuti!

Problemi correlati