Accélérer l’affichage avec content-visibility
Apprenez à utiliser la propriété CSS content-visibility pour ignorer le rendu hors écran et accélérer le chargement initial de vos pages.
Quand un internaute ouvre une page longue (un blog, une liste d’articles, une fiche riche en sections), le navigateur calcule la mise en page et peint l’intégralité du contenu, y compris ce qui se trouve très en dessous de la ligne de flottaison. Ce travail de rendu prend du temps et retarde l’affichage perçu. La propriété CSS content-visibility permet au navigateur d’ignorer le rendu d’un élément (mise en page et peinture) tant qu’il n’est pas nécessaire, c’est-à-dire tant qu’il reste hors écran.
Pour le SEO, l’enjeu est direct. Un rendu initial plus léger améliore la vitesse ressentie et libère le thread principal, deux facteurs qui pèsent sur les Core Web Vitals et sur l’expérience que Google mesure ; pour aller plus loin sur la réactivité, voyez comment optimiser l’INP. Sur la démonstration officielle de web.dev, appliquer content-visibility à des sections fragmentées fait passer le temps de rendu de 232 ms à 30 ms au chargement initial, soit une amélioration des performances d’environ sept fois.
Sur les pages longues, le navigateur s’épuise à calculer et peindre du contenu que personne ne voit encore, et c’est du temps de rendu perdu. La propriété content-visibility lui permet d’ignorer ce qui reste hors écran, ce qui allège franchement le rendu initial. Le seul réflexe à ne pas oublier, c’est de réserver la place avec contain-intrinsic-size, sous peine de provoquer les décalages qu’on cherchait à éviter.
Le confinement CSS, le principe sous-jacent
Content-visibility s’appuie sur le confinement CSS (CSS Containment). L’idée est d’isoler de façon prévisible un sous-arbre du DOM afin que le navigateur puisse raisonner sur une zone sans tenir compte du reste de la page. Plutôt que de choisir manuellement les bonnes valeurs de la propriété contain, content-visibility applique automatiquement le confinement utile, un levier de plus pour fluidifier le rendu des pages.
Un élément doté de content-visibility: auto gagne le confinement de mise en page (layout), de style et de peinture (paint). S’il se trouve hors écran et qu’il n’est pas pertinent pour l’utilisateur, il obtient en plus le confinement de taille (size) : le navigateur détermine alors sa taille sans traiter son contenu, puis s’arrête. La majeure partie du rendu de la sous-arborescence est ainsi ignorée jusqu’à ce que l’élément approche de la fenêtre d’affichage.
Les valeurs de content-visibility
La propriété accepte plusieurs valeurs, mais deux retiennent l’attention en pratique. La valeur auto offre des gains immédiats sur les sections hors écran tout en les rendant automatiquement dès qu’elles s’approchent du viewport. La valeur hidden masque le contenu tout en conservant son état de rendu en cache, ce qui le rend très rapide à réafficher : c’est utile pour les vues inactives d’une application monopage ou pour des défileurs virtuels avancés.
| Valeur | Effet | Cas d'usage typique |
|---|---|---|
auto |
Ignore le rendu hors écran et le déclenche à l’approche du viewport |
Pages longues, listes d’articles, sections empilées |
hidden |
Masque l’élément mais garde son état de rendu en cache |
Vues inactives d’une SPA, contenu réaffiché à la demande |
contain-intrinsic-size |
Réserve une taille estimée pour l’élément confiné |
Stabiliser la hauteur et la barre de défilement |
visible |
Comportement par défaut, aucun confinement appliqué |
Contenu critique au-dessus de la ligne de flottaison |
Réserver la place avec contain-intrinsic-size
Quand le navigateur applique le confinement de taille, l’élément est mis en page comme s’il était vide. Sans hauteur déclarée, il occuperait zéro pixel, ce qui ferait sauter la barre de défilement à mesure que les sections se rendent. La propriété contain-intrinsic-size résout ce point en indiquant une taille naturelle estimée qui sert d’espace réservé.
Avec le mot clé auto, le navigateur mémorise la dernière taille rendue et la réutilise ensuite à la place de l’estimation initiale. C’est précieux pour les défilements infinis, dont l’estimation s’affine automatiquement au fil de la navigation, en complément des techniques pour différer images et iframes. L’exemple ci-dessous applique le motif recommandé à des sections portant la classe story.
.story {
content-visibility: auto;
contain-intrinsic-size: auto 1000px;
}
Le navigateur ne peut ignorer le rendu que si votre code n’appelle pas d’API DOM qui forcent la mise en page (par exemple la lecture de offsetTop ou getBoundingClientRect) sur un sous-arbre confiné. Si vous utilisez content-visibility pour gagner en performance, vérifiez que ces lectures forcées ne se produisent pas. Chromium signale d’ailleurs dans la console les appels problématiques sur un sous-arbre en content-visibility: hidden lorsque la journalisation détaillée est activée.
À faire
- appliquer content-visibility: auto aux sections situées sous la ligne de flottaison
- toujours associer contain-intrinsic-size pour stabiliser la mise en page
- tester l’effet sur le temps de rendu avant et après
À éviter
- appliquer la propriété au contenu critique visible d’emblée
- oublier d’estimer la taille intrinsèque, ce qui provoque des sauts de défilement
- forcer le rendu via des API DOM qui annulent le bénéfice
Points clés à retenir
- Réservez auto aux sections hors écran, pas au contenu critique
- Ajoutez systématiquement contain-intrinsic-size pour éviter les sauts
- Utilisez hidden pour des vues réaffichées rapidement
- Surveillez les API DOM qui forcent la mise en page
- Mesurez l'impact sur la vitesse et sur l'INP après déploiement
Content-visibility allège le rendu initial sans toucher au contenu lui-même.
Quiz : testez vos connaissances
Quiz : testez vos connaissances
-
Que permet la valeur content-visibility: auto sur une page longue ?
- Supprimer définitivement du DOM les sections situées sous la ligne de flottaison
- Alléger le rendu initial en différant le rendu des sections hors écran, qui se rendent à l'approche du viewport
- Compresser automatiquement les images contenues dans la section
La valeur
autooffre des gains immédiats sur les sections hors écran tout en les rendant automatiquement dès qu’elles s’approchent du viewport, sans toucher au contenu lui-même. -
Pourquoi faut-il associer contain-intrinsic-size à content-visibility ?
- Pour améliorer la qualité de compression des médias de la section
- Pour réserver l'espace et éviter les sauts de défilement, car l'élément confiné est mis en page comme s'il était vide
- Pour forcer le navigateur à charger immédiatement tout le contenu
Quand le confinement de taille s’applique, l’élément occuperait zéro pixel sans hauteur déclarée.
contain-intrinsic-sizeestime sa taille et stabilise la mise en page. -
L'usage de content-visibility nuit-il au SEO ou à l'accessibilité ?
- Oui, le contenu masqué est retiré de l'index comme avec display: none
- Oui, les robots d'indexation ne peuvent pas lire un contenu confiné
- Non, le contenu n'est pas supprimé : seul son rendu est différé, et il reste dans le DOM et l'arborescence d'accessibilité
Avec
auto, le contenu hors écran demeure dans le DOM et l’arborescence d’accessibilité. La propriété améliore même la vitesse, un signal positif pour l’expérience utilisateur.
Besoin d'un accompagnement SEO ?
Vous voulez savoir quelles sections de votre site freinent l'affichage et où content-visibility ferait la différence ?