Amélioration des performances comment charger des images à l'aide de in-view.js

Dans ce tutoriel, je vais vous montrer comment améliorer les performances de vos pages Web en utilisant in-view.js. Cette bibliothèque JavaScript signale que quelque chose a défilé dans la fenêtre et nous aidera à charger dynamiquement nos images selon leurs besoins..

La performance, ça compte

Les performances Web sont importantes, en particulier si votre site Web cible des pays en développement où les connexions sont lentes et les forfaits de données coûteux. Quelques tâches de base que nous entreprenons couramment pour améliorer les performances de nos sites Web incluent la minimisation des fichiers JavaScript et des feuilles de style, le «gzipping» des ressources, la compression de la taille des images, après quoi tout est prêt. Mais sommes nous?

Temps de chargement des pages et chronologie de l'inspecteur du navigateur

L'exemple d'inspecteur ci-dessus montre une seule page chargeant 24 images dans une fenêtre de taille mobile à une vitesse 3G normale. Et comme on peut le constater, le chargement de la page est terminé en 11 secondes environ! C'est très lent, car nous avons affaire à une page simple ne contenant que quelques images et une feuille de style. La page n'est pas encore polluée par des annonces, ni des scripts de suivi qui ajoutent généralement un lest supplémentaire à la page.. 

Il ne faut pas oublier non plus qu’il s’agit simplement d’une émulation. Il ne prend même pas en compte la configuration du serveur, la latence et d’autres obstacles techniques. La performance pourrait être encore pire en réalité.

Alors, comment pouvons-nous améliorer les performances de chargement de page?

Goulot

Tout d'abord, nous avons un certain nombre d'images. La raison pour laquelle notre page se charge lentement est parce que toutes les images s’inondent lors du chargement initial de la page. Si vous regardez de plus près l'image précédente, vous verrez que cela ne se produit pas en parallèle: quelques images ne commencent à se charger qu'une fois que d'autres sont en cours de rendu, ce qui enlève la page dans son ensemble..

Si nous avons un grand nombre d’images sur une seule page, nous pouvons envisager de charger ces images. asynchrone et seulement lorsque l'utilisateur en a besoin. Cela permet au navigateur de terminer le chargement de la page visualisable sans avoir à attendre que toutes les images soient rendues, ce qui économise finalement la bande passante de l'utilisateur..

Commencer

Pour suivre, récupérez le fichier index-starter.html du référentiel. Il existe également un fichier css / styles-starter.css que vous pouvez également utiliser..

Pour commencer, nous devons remplacer les sources d’image par une très petite image, de préférence codée en base64, afin d’éviter toute requête HTTP supplémentaire. Nous utilisons cette image comme espace réservé avant de servir l'image réelle. Cela étant dit, nous devons également stocker la source de l'image réelle dans un attribut personnalisé nommé données-src.

Une fois que vous avez fait cela et actualisé la page, vous devriez trouver les images sont actuellement vides et leurs dimensions ne correspondent pas nécessairement à celles de vos images finales..

Alors corrigeons les styles.

Conserver le rapport d'image

Les images que nous souhaitons utiliser sont définies sur 800 x 550 pixels. Nous allons diviser la hauteur de l'image (800px) par la largeur de l'image (500px) et multipliez-le par 100%. Utilisez le résultat pour définir le rembourrage du pseudo-élément du conteneur d'image. Enfin, nous devons définir la position de l’image sur absolu et réglez la hauteur maximale sur 100%, donc ça ne va pas augmenter la hauteur.

figure position: relative;  figure img top: 0; gauche: 0; position: absolue; hauteur maximale: 100%;  figure: before padding-top: 69,25%; // (554/800) * 100%

À ce stade, les dimensions de l'image doivent être correctes. Cependant, la source d'images réelle réside toujours dans un attribut personnalisé, de sorte que le navigateur ne peut pas encore récupérer d'images..

L'image est à son rapport approprié, mais l'image est encore chargée.

Notre prochaine étape consistera à ajouter du JavaScript qui chargera l’image..

Obtenir l'image chargée

Tout d'abord, nous devons charger in-view.js sur la page. Comme mentionné, cette bibliothèque légère (qui ne dépend pas de jQuery ou d'une bibliothèque principale telle que Waypoints) détecte si un élément est à l'intérieur ou à l'extérieur de la fenêtre du navigateur.. 

Créez maintenant un nouveau fichier JavaScript dans lequel nous allons écrire notre code JavaScript et le charger après in-view.js, comme suit:

 

Méthodes et fonctions

La bibliothèque in-view.js expose les en vue() fonction qui prend un sélecteur comme argument. Dans ce cas, nous allons passer le figure élément; l'élément qui enveloppe les images. La raison pour laquelle nous avons sélectionné l'élément wrapper est que nous allons ajouter quelques classes pour effectuer des transitions de style. Cette opération est plus facile lorsque la classe est sur l'élément wrapper plutôt que sur l'image elle-même. Par conséquent:

inView ('figure')

Ensuite, nous utilisons le .sur() méthode pour lier l'élément avec le entrer event pour vérifier si l'élément est dans la fenêtre. En outre, in-view.js expose également le sortie événement qui fait le contraire; cela détecte quand l'élément est sorti de la fenêtre.

inView ('figure') .on ('enter', fonction (figure) var img = figure.querySelector ('img'); // 1 if ('non défini'! == typeof img.dataset.src) / / 2 figure.classList.add ('is-loading'); // 3 // 4 newImg = new Image (); newImg.src = img.dataset.src; newImg.addEventListener ('load', function ()  figure.innerHTML = "; // 5 figure.appendChild (this); // 6 setTimeout (function () figure.classList.remove ('is-loading'); figure.classList.add ('est-chargé') ;, 300);););

le entrer event déclenchera une fonction qui aura les effets suivants:

  1. Sélectionnez l'image dans la figure.
  2. Assurez-vous qu'il a le données-src attribut.
  3. Ajouter est en cours de chargement à l'emballage, figure, élément.
  4. Charger une nouvelle image avec la source extraite de la données-src attribut.
  5. Une fois chargé ajoutez l'image au conteneur.
  6. Et enfin, remplacez le est en cours de chargement classe avec le est chargé classe.

Nous voulons être chargés

Comme vous pouvez le voir dans le code ci-dessus, nous avons introduit deux nouvelles classes est en cours de chargement, et est chargé. Nous utilisons le est en cours de chargement classe pour ajouter une animation spinner pendant le chargement de l’image. Nous utilisons ensuite le est chargé classe, comme son nom l'indique, pour ajouter l'effet de transition à l'image lorsque celle-ci est complètement chargée.

figure.is-chargé img animation: fadeIn 0,38s linéaire 1s en avant;  figure.is-loading position: relative;  figure.is-loading: after contenu: "; display: bloc; couleur: #ddd; taille de la police: 30px; text-indent: -9999em; débordement: masqué; largeur: 1em; hauteur: 1em; border-radius : 50%; marge: auto; position: absolue; haut: 50%; gauche: 50%; marge gauche: -0.5em; marge supérieure: -0.5em; transformation: translateZ (0); animation: chargement de 1.7s facilité infinie; @ images clés chargement 0% transformation: pivoter (0deg); box-shadow: 0 -0.83em 0 -0.4em, 0 -0.83em 0 -0.42em, 0 -0.83em 0 -0.44em, 0 -0,83em 0 -0,46em, 0 -0,83em 0 -0,477em; 5%, 95% box-shadow: 0 -0,83em 0 -0,43em, 0 -0,83em 0 -0,42em, 0 -0,83em 0 -0.44em, 0 -0.83em 0 -0.46em, 0 -0.83em 0 -0.477em; 10%, 59% box-shadow: 0 -0.83em 0 -0.487em -0.087em -0.825em 0 -0,42em, -0,173em -0,812em 0 -0,44em, -0,256em -0,789em 0 -0,46em, -0,297em -0,775em 0 -0,477em; 20% box-shadow: 0 -0,83em 0 -0,4em, -0,338em -0,758em 0 -0,42em, -0,555em -0,617em 0 -0,44em, -0,671em -0,488em 0 -0,46em, -0,749em -0,34em 0 -0,477em; 38 % box-shadow: 0 -0.83em 0 -0.4em, -0.377em -0. 74em 0 -0,42em, -0,645em -0,522em 0 -0,44em, -0,775em -0,297em 0 -0,46em, -0,82em -0,09em 0 -0,477em;  100% transformer: rotate (360deg); box-shadow: 0 -0,83em 0 -0,4em, 0 -0,83em 0 -0,42em, 0 -0,83em 0 -0,44em, 0 -0,83em 0 -0,46em, 0 -0,83em 0 -0,477em;  @keyframes fadeIn 0% opacity: 0;  100% opacité: 1; 

Se retirer

Espérer le meilleur, mais prévoir le pire. Donc, juste au cas où JavaScript est désactivé (cas rare, mais parfaitement possible), nous devons nous assurer que l'image sera toujours affichée. Utilisez le 

Nous sommes tous ensemble! Actualisez la page et si nous inspectons la chronologie du réseau dans DevTools, nous constatons que la vitesse de la page a été considérablement améliorée, car nous ne chargeons que ce qui est visible pour les utilisateurs..

plus rapide!

Le chargement de la page est maintenant terminé en 1,95 seulement à la vitesse 3G normale; plus de 500% d'amélioration de la vitesse!

Emballer

Dans ce didacticiel, nous avons étudié comment améliorer le chargement de page en rendant les images uniquement lorsque l'utilisateur les voit. Cette méthode est communément appelée «chargement paresseux» et peut considérablement améliorer les performances de votre site Web.. 

Il existe de nombreuses bibliothèques JavaScript et plugins jQuery qui le font, alors pourquoi opter pour in-view.js? Personnellement, in-view.js est le genre de script que je recherche depuis le moment où il n’essaie pas d’en faire trop. Il ne gère qu'une chose et le fait bien. Ce type de bibliothèque donne plus de contrôle et une plus grande flexibilité.

Par exemple, nous pouvons non seulement utiliser in-view.js pour effectuer un chargement différé, mais également pour effectuer des opérations telles que le défilement infini, par exemple en affichant un formulaire de souscription flottant lorsque l'utilisateur atteint la fin de la page (take jetez un coup d’œil à la démo pour voir cela en action), ou créez un plan de montage vertical sans avoir à insérer une autre bibliothèque JavaScript. Dites-nous comment vous l'utilisez!

Formulaire d'abonnement flottant, animé lorsque l'utilisateur atteint la fin de la page

Ressources supplémentaires

  • Le référentiel officiel in-view.js et sa documentation
  • Inspiration pour la conception Web: Scrollin ', Scrollin', Scrollin '
  • Création de ratios intrinsèques pour la vidéo
  • Spinners CSS à élément unique
  • Petit conseil: n'oubliez pas l'élément «noscript»