2013-02-07 17 views
18

Ho alcune immagini sulla mia pagina. Sto scoprendo che la pagina inizia a renderizzare prima che le immagini siano state caricate (che è buono), ma che l'effetto visivo non è eccezionale. Inizialmente l'utente vede questo:Segnaposto sfondo/immagine mentre si attende il caricamento completo dell'immagine?

--------hr-------- 
text 

Poi un paio di millisecondi dopo la pagina di salti per mostrare questo:

--------hr-------- 
[   ] 
[ image ] 
[   ] 
text 

C'è un modo semplice che posso mostrare un'immagine di sfondo grigio esattamente la larghezza e altezza che l'immagine occuperà, fino a quando l'immagine stessa non viene caricata?

Il fattore di complicazione è che non conosco l'altezza e la larghezza delle immagini in anticipo: sono reattivi e sono impostati su width: 100% del div contenitore. Questo è il codice HTML/CSS:

<div class="thumbnail"> 
<img src="myimage.jpeg" /> 
<div class="caption">caption</div> 
</div> 
img { width: 100% } 

Ecco un JSFiddle per illustrare il problema di fondo: http://jsfiddle.net/X8rTB/3/

Ho guardato in cose come LazyLoad, ma non posso evitare di pensare ci deve essere un semplice, risposta non JS. O è il fatto che non conosca in anticipo l'altezza dell'immagine come un problema insormontabile? Conosco le proporzioni delle immagini.

+0

Fai div vuoto con uno sfondo grigio e impostare le dimensioni, quindi aggiungere l'immagine come sfondo '-image'? – Andy

+0

Provato questo come segue, ma in realtà non sembra fare nulla: 'ul.options li {background: url (/ media/img/cont/filler.png); formato di sfondo: 100% 100%; } ' – Richard

+0

Richard, non utilizzare una voce di elenco, utilizzare un div al posto di' ', quindi assegnargli le dimensioni (' height: 200px; width: 300px; ') e dovrebbe funzionare – Andy

risposta

1

L'unica cosa che posso pensare, per minimizzare l'effetto di salto sul testo, è impostare min-height nel punto in cui apparirà l'immagine, direi - impostarlo sull'immagine "più corta" che si conosce. In questo modo il salto sarà meno evidente e non sarà necessario usare lazyLoad o così ... Tuttavia non risolve completamente il problema.

11

Invece di fare riferimento direttamente l'immagine, incollarla all'interno di un DIV, come il seguente:

<div class="placeholder"> 
    <div class="myimage" style="background-image: url({somedynamicimageurl})"><img /></div> 
</div> 

Poi nel CSS:

.placeholder { 
    width: 300; 
    height: 300; 
    background-repeat: no-repeat; 
    background-size: contain; 
    background-image: url('my_placeholder.png'); 
} 
+0

Questo dipende dall'immagine non segnaposto che non è trasparente, non è vero? – Medinoc

3

C'è una cosa molto semplice da controllare prima di inizia a guardare in pigro-caricamento e altri JS. Assicurati che le immagini JPG che stai caricando siano salvate con l'opzione 'progressiva' abilitata! Ciò causerà loro di caricare l'immagine in modo iterativo, iniziando con un segnaposto a bassa risoluzione e più veloce da scaricare, piuttosto che attendere i dati di più alta risoluzione prima del rendering.

0

Ecco un modo ingenuo di farlo,

img { box-shadow: 0 0 10px 0 rgba (# 000, 0,1); }

È possibile manipolare i valori, ma ciò che fa è si crea un bordo molto luce intorno l'immagine che non spinge i contenuti. Le immagini possono essere caricate in qualsiasi momento e si ottiene una buona esperienza utente.

Speranza che aiuta

+0

Una bella idea, ma in pratica non funziona. Puoi testarlo con un'immagine caricata da src = "http://placehold.it/150x150" poiché tendono a caricarsi abbastanza lentamente (servizio gratuito, ecco perché). Dal momento che il DOM non ha ancora un oggetto con qualsiasi dimensione assegnata, l'ombra della casella viene semplicemente visualizzata come un piccolo punto (poiché non c'è ancora nulla di "ombra") – rmcsharry

Problemi correlati