Chargement différé avec “responsive” images (inconnu hauteur)
Je suis à l'aide d'une grille CSS système qui est basé sur des pourcentages. J'ai une grille avec 4 colonnes, chacune 25% de la largeur totale. J'ai sortie mon image balises à l'intérieur de chaque "25% de cellules", comme ceci:
<img src="foo.jpg" style="max-width:100%" />
Que le navigateur est redimensionnée, les images aussi redimensionner pour remplir à 100% de 25% de cellules. Le navigateur choisit une hauteur, comme si j'avais mis "height:auto" (qui est implicite quand il est omis).
Maintenant, je veux ajouter paresseux capacité de chargement. Le problème est que, avant les images sont chargées, leur hauteur sur la page est inconnue. Le navigateur doit télécharger l'image & observer ses proportions, et de calculer une hauteur. Avant cela, toutes les images ont une hauteur de 1px. Depuis chaque image a une hauteur de 1px, ils sont tous considérés comme "dans la fenêtre d'affichage" et sont immédiatement chargés.
Actuellement, j'ai une preuve de concept avant la sortie de la balise img, je calcule le ratio d'aspect des images sur le serveur, et la sortie de données de l'attribut:
<img src="foo.jpg" style="max-width:100%" data-aspect="1.7742" />
Ensuite, lors de l'événement "document prêt", je boucle sur chaque image et fixe "hauteur" de la valeur en pixels avant le chargement paresseux:
$('img').each(function() {
var img = $(this);
var width = img.width();
var ratio = img.data('aspectratio');
var height = width / ratio;
$(this).css('height', height+'px');
});
Cela semble être au travail, dans le sens où il n'est plus en charge de toutes les images en même temps, mais ne charge que les images que j'ai faites défiler jusqu'.
Cependant, il semble que cela pourrait causer de nouveaux problèmes, comme les images deviennent tendu que l'utilisateur redimensionne le navigateur. Je dois passer à la "hauteur" de retour à "auto" lorsqu'un rappel des incendies pour le chargement paresseux ayant achevé. Qui prendrait soin d'images que l'utilisateur voit - mais les images ci-dessous le pli aurait encore une mauvaise hauteur de la valeur du navigateur est redimensionnée. Chaque fois que le navigateur est redimensionnée, je serais à la parcourir toutes les images qui ont été précédemment en dessous de la fois, de mesurer leur mise à jour de la largeur, de lire leur rapport d'aspect, et de mettre à jour la nouvelle hauteur, puis relancer le chargement paresseux pour gérer tout ce qui est maintenant au-dessus du pli. Si je ne fais pas cela, le chargement peut être déclenché trop tôt ou trop tard en raison de ces images ayant la mauvaise valeur de hauteur.
Ma question est, est-il d'autres moyens de chargement différé des images avec des inconnus hauteurs, d'autres que la méthode que j'ai décrite ici, et ce que ramifications cela aurait-il? Est-il un inconvénient à ma méthode, d'autres que c'est une douleur de programme?
Merci pour le réconfort. J'ai été également envisager une sorte d'approche où il paresseux charge les 4 premières images, puis se bloque jusqu'à ce qu'ils soient terminés, puis évalue les nouvelles positions des autres images. Seul problème, c'est le blocage rendrait les choses plus faible que sans chargement paresseux en premier lieu.
Ok j'ai juste pris conscience de l'padding-bottom truc: thisisthat.co.royaume-uni/ordinateur portable/... andmag.se/2012/10/...
Écrire une réponse à votre propre question.
Êtes-vous capable de mettre en place le code où vous calculer l'aspect le rapport sur le serveur s'il vous plaît? C'est la meilleure solution que j'ai trouvée à ce problème, mais ne trouve pas comment faire
OriginalL'auteur Josh Ribakoff | 2014-05-01
Vous devez vous connecter pour publier un commentaire.
J'ai eu un problème similaire récemment, combinant Isotope avec Lazy Load dans une mise en page responsive. Isotope détermine la mise en page basée sur la largeur et la hauteur des images lorsque la page est chargée, donc, au départ, les articles étaient tous se chevauchent en raison de l'Isotope n'était pas le calcul de la taille correcte.
Assurez-vous que l'espace réservé éléments ont été la sauvegarde de l'espace, j'ai utilisé le padding-bottom truc que vous avez mentionné: http://thisisthat.co.uk/notebook/2013-10-07-lazy-loading-responsive-images (Bien qu'il puisse n'ont pas été exactement la poste.) Voici mon balisage:
C'est probablement plus que vous avez besoin (comme l'ensemble de l' .portefeuille-div texte est une superposition qui a un peu de style). La véritable clé était dans le calcul du remplissage en bas basé sur la largeur et la hauteur de l'image (que j'ai fait dans le modèle avec PHP) et en le définissant comme le rembourrage en bas de l'article que je voulais économiser de l'espace.
OriginalL'auteur jpsingleton
Encore plus propre:
2000px x 1000px
)max-width: 100%
etheight: auto
De crédit pour cette approche va à Github utilisateur dryabove, donné dans cette question Github
Si vous voulez une image d'espace réservé par exemple un fond gris avec spinner (ou vous voulez que votre conception de tenir la bonne structure, avec rien de visible), et l'image n'a pas encore été chargé,
height: auto
ne fonctionnera pas. Il n'y a pas d'informations sur l'image pour calculer le ratio de la hauteur à la largeur...pas de chance pour moi sur Chrome 57. Des Images qui se chevauchent de façon imprévisible à la verticale.
Cela ne fonctionnera pas si les images ne sont pas le même ratio
OriginalL'auteur Isaac Gregson
Voici la solution la plus élégante, à partir des commentaires. Il nécessite encore écrit le ratio d'aspect de côté de serveur, mais avec un wrapper
div
:Puis avec JS je donne le wrapper
div
unpadding-bottom
:Cela donne la
div
exactement les mêmes dimensions que leimg
finira par consommer. J'utilise ensuite la suite à MOINS de charger l'image à l'intérieur de la zone de lapadding
consomme:OriginalL'auteur Josh Ribakoff