Différer le chargement des vidéos
Différez le chargement de vos vidéos selon leur usage : preload, poster et Intersection Observer pour des pages plus légères et plus rapides.
Comme les images, les vidéos peuvent être chargées de manière différée pour ne pas peser sur le chargement initial de la page. Une vidéo téléchargée alors que l’utilisateur ne la regardera peut-être jamais gaspille de la bande passante et retarde l’affichage du contenu visible. Différer son chargement consiste à ne récupérer ses données qu’au moment opportun.
La méthode dépend du cas d’usage, car il n’existe pas une seule solution. Pour le SEO, l’intérêt est clair : en évitant des téléchargements superflus, vous accélérez le rendu initial, vous libérez de la bande passante pour les ressources critiques et vous améliorez les Core Web Vitals. Les vidéos hébergées sur des services tiers comme YouTube relèvent quant à elles du chargement différé des iframes.
Une vidéo qui se télécharge alors que le visiteur ne la lancera peut-être jamais, c’est de la bande passante jetée et un rendu initial ralenti pour rien. Le bon réflexe est de ne récupérer ses données qu’au moment opportun, sachant que la méthode varie selon le cas d’usage. Précharger seulement les métadonnées au survol est souvent le compromis le plus élégant.
Les vidéos qui ne sont pas lues automatiquement
Il est généralement préférable d’éviter la lecture automatique, qui laisse le contrôle à l’utilisateur. Pour ces vidéos, l’attribut preload est le meilleur levier. Réglé sur none, il empêche le navigateur de précharger les données vidéo. L’attribut poster fournit un espace réservé qui occupe la place pendant le chargement.
La valeur none est souvent la plus sûre : par défaut, preload vaut metadata dans la plupart des navigateurs, ce qui télécharge déjà une partie de la vidéo via l’en-tête Content-Range, parfois plus que souhaité. Avec preload= »none », aucune donnée n’est récupérée tant que l’utilisateur ne lance pas la lecture.
<video controls preload="none" poster="placeholder.jpg">
<source src="video.webm" type="video/webm">
<source src="video.mp4" type="video/mp4">
</video>
Précharger les métadonnées au survol
Vous pouvez affiner l’expérience en préchargeant les métadonnées seulement lorsque l’utilisateur survole la vidéo, grâce à un gestionnaire d’événement mouseenter. La vidéo se lance alors plus vite et affiche sa durée dès le démarrage, sans pour autant charger l’intégralité du fichier au chargement de la page.
Si l’image poster est l’élément candidat au LCP, allez plus loin : préchargez-la avec rel=preload et fetchpriority= »high ». Une image se charge plus vite qu’une vidéo, ce qui sécurise un bon Largest Contentful Paint tout en gardant la vidéo différée ; voyez aussi comment précharger l’audio et la vidéo.
Les vidéos de remplacement de GIF
Les vidéos en lecture automatique servent souvent d’alternative aux GIF, bien plus légère ; pour les préparer correctement, voyez comment optimiser les vidéos. Pour reproduire le comportement d’un GIF, l’élément video combine autoplay, muted, loop et playsinline, ce dernier étant nécessaire à la lecture automatique sur iOS. Pour différer ce type de vidéo, on stocke l’URL de chaque source dans un attribut data-src, puis on déclenche le chargement via Intersection Observer.
Le script observe les éléments video marqués, et lorsqu’ils entrent dans le viewport, il recopie data-src dans src pour chaque source, puis appelle la méthode load pour démarrer la lecture. On obtient ainsi une vidéo qui imite le GIF sans en supporter le coût en données, tout en restant chargée de manière différée.
<video class="lazy" autoplay muted loop playsinline width="610" height="254" poster="placeholder.jpg">
<source data-src="animation.webm" type="video/webm">
<source data-src="animation.mp4" type="video/mp4">
</video>
Quelle méthode selon le cas d'usage
Chaque scénario appelle une approche différente. Le tableau ci-dessous récapitule la technique la plus adaptée selon le type de vidéo à différer.
| Cas d'usage | Technique | Points d'attention |
|---|---|---|
Vidéo lancée par l’utilisateur |
preload= »none » + poster |
preload=metadata par défaut télécharge déjà des données |
Vidéo de remplacement de GIF |
data-src + Intersection Observer |
autoplay, muted, loop, playsinline ; appel de load() |
Vidéo hébergée chez un tiers (YouTube) |
Chargement différé de l’iframe |
Voir le tutoriel dédié aux iframes |
Image poster candidate au LCP |
rel=preload + fetchpriority= »high » |
L’image se charge plus vite que la vidéo |
Dans la plupart des navigateurs, preload vaut metadata par défaut : une partie de la vidéo est alors récupérée via l’en-tête Content-Range. Les navigateurs ignorent à quel endroit du fichier sont stockées les métadonnées, qui ne se trouvent pas forcément au début. Pour vraiment éviter de charger la vidéo, spécifiez explicitement preload= »none ».
À faire
- régler preload= »none » pour les vidéos déclenchées par l’utilisateur
- ajouter une image poster
- utiliser Intersection Observer pour les vidéos de type GIF
- préchauffer les métadonnées au survol
À éviter
- laisser preload=metadata charger des données par défaut
- oublier playsinline sur les vidéos autoplay (iOS)
- renvoyer les vidéos tierces vers cette méthode plutôt que vers les iframes
- précharger un poster qui n’est pas le candidat LCP
Points clés à retenir
- Réglez preload="none" pour les vidéos lancées par l'utilisateur
- Ajoutez une image poster comme espace réservé
- Préchargez les métadonnées au survol pour accélérer le démarrage
- Différez les vidéos de type GIF avec data-src et Intersection Observer
- Renvoyez les vidéos tierces vers le chargement différé des iframes
Le chargement différé des vidéos s’adapte à chaque cas d’usage.
Quiz : testez vos connaissances
Quiz : testez vos connaissances
-
Pour une vidéo qui n'est pas lue automatiquement, quel réglage de preload évite de récupérer des données avant le clic ?
- preload="none", car la valeur metadata télécharge déjà une partie de la vidéo par défaut
- preload="metadata", qui empêche tout téléchargement tant que l'utilisateur n'agit pas
- preload="auto", qui laisse le navigateur décider de ne rien charger
Par défaut,
metadatatélécharge déjà une partie de la vidéo. La valeurnonegarantit qu’aucune donnée n’est récupérée tant que l’utilisateur ne lance pas la lecture. -
Comment différer une vidéo qui sert de remplacement à un GIF (autoplay) ?
- En ajoutant l'attribut loading="lazy" directement sur la balise video
- En réglant simplement preload="none" sur l'élément video
- En stockant les sources dans data-src puis en utilisant Intersection Observer pour les charger à l'approche du viewport
On stocke l’URL des sources dans
data-src, puis Intersection Observer recopiedata-srcdanssrcet lance le chargement à l’approche du viewport. -
Quel attribut est indispensable sur une vidéo en lecture automatique pour qu'elle se lise en ligne sur iOS ?
- preload, qui force le chargement complet de la vidéo
- playsinline, qui évite le passage forcé en plein écran
- controls, qui affiche la barre de lecture native
Pour reproduire un GIF, l’élément
videocombineautoplay,muted,loopetplaysinline, ce dernier garantissant la lecture en ligne sur iOS.
Besoin d'un accompagnement SEO ?
Vos vidéos se chargent trop tôt et ralentissent l'affichage de vos pages ?