Un tutoriel pour charger une image dès qu'elle entre dans le viewport en utilisant le plugin Intersect du framework AlpineJS.
🌎 La version anglaise de cette publication : AlpineJS: Implementing image lazy loading with the Intersect plugin
AlpineJS est un framework JavaScript léger qui permet de rendre dynamique votre HTML.
Parmi les plugins fournis par AlpineJS, il y a Intersect, un wrapper pour l'API Intersection Observer de JavaScript. Ce plugin permet de réagir dès qu'un élément entre dans le viewport du navigateur.
Le viewport est la zone de la fenêtre dans laquelle le contenu web peut être vu, c'est-à-dire la partie visible de la page au niveau de la barre de défilement.
Dans ce tutoriel, nous allons voir la technique Lazy loading pour charger une image dès qu'elle entre dans le viewport du navigateur. Cela permet d'améliorer les performances d'une page web en réduisant son poids au chargement, car les images, qui peuvent être lourdes, sont chargées uniquement lorsqu'elles sont sur le point d'être visibles dans l'interface utilisateur.
Au moment de la rédaction de cette publication, j'utilise la version 3 d'AlpineJS et du plugin Intersect.
Créons d'abord une structure HTML de base dans laquelle nous intégrerons AlpineJS et le plugin Intersect via CDN. Ensuite, nous ajouterons la logique du lazy loading des images en JavaScript. Un long texte Lorem Ipsum est inséré dans le paragraphe <p>
pour remplir la page, avec une marge (margin-bottom
) de 1000px
en dessous. Cela permet de déplacer l’image hors du viewport et de la charger uniquement lorsqu’elle devient visible.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Lazy loading des images avec AlpineJS et Intersect</title>
</head>
<body>
<h1>Bienvenue sur mon site</h1>
<!-- Contenu long pour faire défiler la page -->
<p style="margin-bottom: 1000px;" >Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat ...</p>
<!-- L'image à charger -->
<img src="https://loremflickr.com/320/240" alt="Image Lazyload" />
</body>
</html>
Installer via CDN
Nous pouvons inclure AlpineJS et le plugin Intersect dans une balise <script>
avant la fermeture de la balise </body>
. Assurez-vous d'ajouter le plugin avant le fichier principal d'AlpineJS.
<!-- Importation de Intersect via CDN -->
<script defer src="https://cdn.jsdelivr.net/npm/@alpinejs/[email protected]/dist/cdn.min.js"></script>
<!-- Importation de AlpineJs via CDN -->
<script defer src="https://cdn.jsdelivr.net/npm/[email protected]/dist/cdn.min.js"></script>
Installer via NPM
Pour installer AlpineJS et le plugin Intersect, utilisez les commandes suivantes :
npm install alpinejs
npm install @alpinejs/intersect
Une fois installés, nous pouvons les initialiser dans notre bundle.
import Alpine from 'alpinejs';
import intersect from '@alpinejs/intersect';
Alpine.plugin(intersect);
Alpine.start();
Une fois les bibliothèques importées, nous allons procéder comme suit pour ajouter la logique du lazy loading des images avec AlpineJS et Intersect :
1. Définir <body>
comme un composant AlpineJS en lui attribuant x-data
:
<body x-data>
...
</body>
2. Pour les images, utiliser une image légère (GIF ou SVG) dans l’attribut src
pour indiquer le chargement, tout en stockant l’URL de l’image réelle dans data-src
puis ajouter la directive x-intersect
pour déclencher la fonction load_image
dès que l’image entre dans le viewport :
<img x-intersect="load_image" data-src="https://loremflickr.com/320/240" src="./images/loader.gif" alt="Image Lazyload" />
Pour charger l'image uniquement la première fois qu'elle entre dans le viewport et non les fois suivantes, ajoutons le modificateur .once
à x-intersect
:
<img x-intersect.once="load_image" ... />
3. Définir la fonction load_image
pour récupérer le chemin de l'image depuis data-src
et mettre à jour l'attribut src
:
function load_image() {
// Récupère l'élément <img> concerné
const image = this.$el;
// Récupère le chemin de l'image depuis "data-src"
const image_src = image.getAttribute("data-src");
// Remplace l'attribut "src" par l'image réelle
image.src = image_src;
}
Voici Le code source complet :
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Lazy loading des images avec AlpineJS et Intersect</title>
</head>
<body x-data >
<h1>Bienvenue sur mon site</h1>
<!-- Contenu long pour faire défiler la page -->
<p style="margin-bottom: 1000px;" >Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat ...</p>
<!-- L'image à charger -->
<img x-intersect.once="load_image" data-src="https://loremflickr.com/320/240" src="./images/loader.gif" alt="Image Lazyload" />
<!-- Importation de Intersect via CDN -->
<script defer src="https://cdn.jsdelivr.net/npm/@alpinejs/[email protected]/dist/cdn.min.js"></script>
<!-- Importation de AlpineJs via CDN -->
<script defer src="https://cdn.jsdelivr.net/npm/[email protected]/dist/cdn.min.js"></script>
<script>
function load_image() {
// Récupère l'élément <img> concerné
const image = this.$el;
// Récupère le chemin de l'image depuis "data-src"
const image_src = image.getAttribute("data-src");
// Remplace l'attribut "src" par l'image réelle
image.src = image_src;
}
</script>
</body>
</html>
Je crois que cette astuce améliorera vos pages web en les rendant plus performantes grâce au lazyload des images.
Portez-vous bien ! 😎
Cette publication vous a plu ?
Partagez-la avec vos ami(e)s sur les réseaux sociaux.
Wilo Ahadi, l'auteur
Passionné de l'informatique, je suis spécialiste en techniques des systèmes et réseaux, développeur web et mobile, infographiste et designer, ... J'aime partager mon expérience en formant sur la plateforme Akili School
Voir profilAutres publications
Voir toutes les publication de Wilo Ahadi
Sélection ebook
10 Laravel tips and techniques for your next PHP project
Développement web
Commentaires