Améliorez le temps de chargement initial en ignorant l'affichage du contenu hors écran.
La
content-visibility
, lancée dans Chromium 85, pourrait être l'une des nouvelles CSS les plus efficaces
permettant d'améliorer le chargement des pages. content-visibility
active le
pour ignorer le travail de rendu d'un élément, y compris la mise en page et la peinture,
jusqu'à ce que cela soit nécessaire. Comme l'affichage est ignoré, si une grande partie
contenu hors écran, l'utilisation de la propriété content-visibility
rend
l'utilisateur initial se charge
beaucoup plus rapidement. Cela permet également d'interagir plus rapidement avec
le contenu à l'écran. Plutôt chouette.
Prise en charge des navigateurs
content-visibility
s'appuie sur des primitives de la spécification de structuration CSS. Bien que content-visibility
ne soit compatible qu'avec Chromium 85 pour le moment (et considéré comme "intéressant à prototyper" pour Firefox), la spécification de structuration est compatible avec la plupart des navigateurs modernes.
Confinement CSS
L'objectif principal et principal du confinement CSS est de permettre l'affichage améliorent les performances du contenu Web grâce à une isolation prévisible une sous-arborescence DOM dans le reste de la page.
En gros, un développeur peut indiquer à un navigateur quelles parties de la page sont encapsulées en tant qu'ensemble de contenu, ce qui permet aux navigateurs de raisonner sur le contenu sans avoir à prendre en compte l'état en dehors du sous-arbre. Savoir quels éléments de contenu (sous-arborescences) contiennent du contenu isolé, ce qui signifie que le navigateur peut effectuer l'optimisation pour l'affichage des pages.
Il existe quatre types de CSS
le confinement,
une valeur potentielle pour la propriété CSS contain
, qui peut être combinée ;
dans une liste de valeurs séparées par des espaces:
size
: la structuration de la taille d'un élément garantit que la zone de l'élément peut être mise en page sans avoir à examiner ses descendants. Cela signifie que nous pouvons vous pouvez ignorer la mise en page des descendants si nous n'avons besoin que de la taille du .layout
: le confinement de la mise en page signifie que les descendants n'affectent pas le mise en page externe des autres zones de la page. Cela nous permet de passer potentiellement des descendants si nous voulons simplement mettre en page d'autres cases.style
: le confinement du style garantit que les propriétés qui peuvent avoir un effet sur plus que ses descendants n'échappent pas à l'élément (par exemple, les compteurs). Ce nous permet d'ignorer potentiellement les calculs de style pour les descendants si tous les est de calculer des styles sur d'autres éléments.paint
: le confinement de la peinture garantit que les descendants de la boîte englobante ne s'affichent pas en dehors de ces limites. Rien ne peut visiblement déborder de l’élément, Si un élément est hors écran ou n'est pas visible, ses descendants ni être visibles. Cela nous permet d'éviter de peindre si l'élément est hors écran.
Omission de l'affichage avec content-visibility
Il peut être difficile de déterminer quelles valeurs de confinement utiliser, car le navigateur
les optimisations ne peuvent s'activer que si un ensemble approprié est spécifié. Vous pouvez
jouer avec les valeurs pour voir ce qui fonctionne
best, ou vous
vous pouvez utiliser une autre propriété CSS appelée content-visibility
pour appliquer les
automatiquement. content-visibility
vous permet d'obtenir la plus grande
le navigateur vous apporte un minimum d'efforts,
développeur.
La propriété "content- visibility" accepte plusieurs valeurs, mais c'est auto
qui est la seule.
qui améliore immédiatement les performances. Un élément qui a
content-visibility: auto
améliore la structuration des layout
, des style
et des paint
. Si
l'élément apparaît en dehors de l'écran (et n'est pas pertinent pour l'utilisateur) ;
sont ceux qui sont sélectionnés dans leur sous-arborescence.
renforce également le confinement de size
(et cesse
peinture
et
tests de positionnement
son contenu).
Qu'est-ce que cela signifie ? En bref, si l'élément est en dehors de l'écran, ses descendants sont n'est pas affichée. Le navigateur détermine la taille de l'élément sans tenir compte et s'arrête là. La majeure partie du rendu, comme le style et la mise en page de la sous-arborescence de l'élément sont ignorées.
Lorsque l'élément s'approche de la fenêtre d'affichage, le navigateur n'ajoute plus size
.
le confinement et commence à peindre et à tester
le contenu de l'élément. Ce
permet d'effectuer le rendu juste à temps pour être vu par l'utilisateur.
Remarque sur l'accessibilité
L'une des fonctionnalités de content-visibility: auto
est que le contenu hors écran reste disponible dans le modèle d'objet de document et, par conséquent, dans l'arborescence d'accessibilité (contrairement à visibility: hidden
). En d'autres termes, il est possible de rechercher ce contenu sur la page et d'y accéder sans attendre qu'il se charge et que les performances d'affichage soient sacrifiées.
En revanche, les éléments repère avec des fonctionnalités de style telles que display: none
ou visibility: hidden
apparaissent également dans l'arborescence d'accessibilité lorsqu'ils sont hors écran, car le navigateur ne les affiche pas tant qu'ils ne sont pas dans le viewport. Pour éviter que ces éléments ne soient visibles dans l'arborescence d'accessibilité et qu'ils ne s'encombrent pas, veillez également à ajouter aria-hidden="true"
.
Exemple: blog de voyages
Un blog de voyage contient généralement des histoires accompagnées de quelques images, un texte descriptif. Voici ce qui se passe dans un navigateur classique lorsqu'il accède à un blog de voyage:
- Une partie de la page est téléchargée à partir du réseau, ainsi que les ressources nécessaires.
- Le navigateur applique un style et met en page tout le contenu de la page, déterminer si le contenu est visible par l'utilisateur.
- Le navigateur revient à l'étape 1 jusqu'à ce que la page et toutes les ressources soient téléchargées.
Lors de l'étape 2, le navigateur traite l'ensemble du contenu à la recherche d'éléments susceptibles ont changé. Il met à jour le style et la mise en page de tout nouvel élément, ainsi que les éléments qui ont pu changer à la suite de nouvelles mises à jour. Il s'agit du rendu travail. Cela prend du temps.
Voyons maintenant ce qui se passe si vous placez content-visibility: auto
sur chacun des
des articles
individuels dans le blog. La boucle générale est la même : le navigateur télécharge et affiche des parties de la page. Toutefois, la différence réside dans le
la quantité de travail
qu’il effectue à l’étape 2.
Avec la visibilité du contenu, elle applique un style et une mise en page à tous les contenus actuellement visibles par l'utilisateur (ils sont à l'écran). Toutefois, lors du traitement qui est entièrement hors écran, le navigateur ignore le rendu et uniquement le style et la mise en page de la zone de l'élément elle-même.
Cette page se chargerait comme si elle s'affichait en plein écran. et des cases vides pour chacune des stories hors écran. Elle est très efficace avec une réduction attendue d'au moins 50% par rapport au coût de rendu chargement en cours. Dans notre exemple, nous observons une amélioration de la durée de rendu de 232 ms à 30 ms. Les performances sont multipliées par sept.
Que devez-vous faire pour en profiter ? Tout d'abord, nous Divisez le contenu en sections:
Ensuite, nous appliquons la règle de style suivante aux sections:
.story {
content-visibility: auto;
contain-intrinsic-size: 1000px; /* Explained in the next section. */
}
Spécifier la taille naturelle d'un élément avec contain-intrinsic-size
Pour profiter des avantages potentiels de content-visibility
, le navigateur
doit appliquer un confinement de la taille pour s'assurer que l'affichage des contenus
n'affecte en aucune façon la taille de l'élément. Cela signifie que l'élément
s'affichera comme s'il était vide. Si aucune hauteur n'est spécifiée pour l'élément
dans une mise en page de blocs standard, sa hauteur est nulle.
Ce n'est peut-être pas idéal, car la taille de la barre de défilement change, qui dépend de chaque histoire ayant une hauteur non nulle.
Heureusement, le CSS fournit une autre propriété, contain-intrinsic-size
, qui
spécifie bien la taille naturelle de l'élément si celui-ci est
affectées par le confinement de la taille. Dans notre exemple, nous le définissons sur 1000px
une estimation de la hauteur
et de la largeur des sections.
Cela signifie qu'il s'affiche comme s'il n'avait qu'un seul enfant de "taille intrinsèque"
et des dimensions spécifiques.
contain-intrinsic-size
sert de taille d'espace réservé au lieu du contenu affiché.
Dans Chromium 98 et les versions ultérieures, un nouveau auto
mot clé pour contain-intrinsic-size
. Si spécifié, le navigateur se souviendra
la dernière taille affichée, le cas échéant, et l'utiliser à la place de l'espace réservé fourni par le développeur
la taille de l'image. Par exemple, si vous avez spécifié contain-intrinsic-size: auto 300px
,
de l'élément commence par une taille intrinsèque de 300px
pour chaque dimension, mais une fois
le contenu de l'élément est affiché, la taille intrinsèque affichée est conservée.
Toute modification ultérieure de la taille de rendu est également mémorisée. En pratique, cela signifie que si vous
faire défiler un élément avec content-visibility: auto
appliqué, puis le faire défiler vers l'arrière
hors écran, la largeur et la hauteur idéales sont automatiquement conservées,
à la taille de l'espace réservé. Cette fonctionnalité est particulièrement
utile pour les utilisateurs de défilement infini,
qui permet désormais d'améliorer automatiquement l'estimation de la taille au fil du temps, à mesure que l'utilisateur
explore la page.
Masquage du contenu avec content-visibility: hidden
Que faire si vous souhaitez conserver le contenu non affiché, que ce soit à l'écran ou non, tout en profitant des avantages de l'état de rendu mis en cache ? Saisissez:
content-visibility: hidden
La propriété content-visibility: hidden
offre les mêmes avantages que
contenu non affiché et l'état d'affichage mis en cache, comme le fait content-visibility: auto
en dehors de l'écran. Cependant, contrairement à auto
, il ne commence pas automatiquement à
s'affiche à l'écran.
Cela vous donne plus de contrôle, vous permettant de masquer le contenu d'un élément et plus tard, les réafficher rapidement.
Comparez ce comportement à d'autres méthodes courantes pour masquer le contenu d'un élément:
display: none
: masque l'élément et détruit son état de rendu. Ce signifie que l'affichage de l'élément coûte autant que le rendu d'un nouvel élément avec même contenu.visibility: hidden
: masque l'élément et conserve son état de rendu. Cette opération ne supprime pas réellement l'élément du document, car il (et son sous-arbre) occupe toujours un espace géométrique sur la page et peut toujours être cliqué. Il met également à jour l'état de rendu à chaque fois que cela est nécessaire, même lorsqu'il est masqué.
En revanche, content-visibility: hidden
masque l'élément
préserver son état de rendu. Ainsi, si des modifications doivent être apportées
se produisent uniquement lorsque l'élément est de nouveau affiché (c'est-à-dire lorsque
content-visibility: hidden
a été supprimée).
content-visibility: hidden
est particulièrement utile pour implémenter des défileurs virtuels avancés et mesurer la mise en page. Ils sont également parfaits pour
applications monopages (SPA). Les vues d'applications inactives peuvent être conservées dans le DOM avec
content-visibility: hidden
a appliqué pour empêcher son affichage, mais conserver son
mis en cache. La vue s'affiche ainsi rapidement lorsqu'elle est réactivée.
Effets sur l'interaction avec le prochain rendu (INP)
INP est une métrique qui évalue la capacité d'une page à répondre de manière fiable aux entrées utilisateur. La réactivité peut être affectée par toute quantité excessive de travail effectuée sur le thread principal, y compris le travail de rendu.
Chaque fois que vous pouvez réduire la charge de travail d'affichage sur une page donnée, vous donnez au thread principal la possibilité de répondre plus rapidement aux entrées utilisateur. Cela inclut le travail de rendu. L'utilisation de la propriété CSS content-visiblity
, le cas échéant, peut réduire le travail de rendu, en particulier au démarrage, lorsque la plupart des tâches de rendu et de mise en page sont effectuées.
La réduction du travail de rendu a un impact direct sur l'INP. Lorsque les utilisateurs tentent d'interagir avec une page qui utilise correctement la propriété content-visibility
pour différer la mise en page et l'affichage des éléments hors écran, vous donnez au thread principal la possibilité de répondre aux tâches essentielles visibles par l'utilisateur. Cela peut améliorer l'INP de votre page dans certains cas.
Conclusion
content-visibility
et la spécification CSS Containment Spec offrent des performances intéressantes
des boosts dans votre fichier CSS. Pour en savoir plus sur ces
consultez les ressources suivantes: