Nouveautés concernant les transitions de vue (mise à jour 2025)

Date de publication : 8 octobre 2025

Beaucoup de choses ont changé depuis que nous avons lancé les transitions de vue dans le même document en 2023.

En 2024, nous avons lancé les transitions de vue entre documents, ajouté des améliorations telles que view-transition-class et les types de transitions de vue, et nous avons également accueilli Safari qui a ajouté la prise en charge des transitions de vue.

Cet article vous présente les modifications apportées aux transitions de vue en 2025.

Meilleure compatibilité avec les navigateurs et les frameworks

Les transitions de vue dans le même document sont sur le point de devenir "Baseline Newly available"

Browser Support

  • Chrome: 111.
  • Edge: 111.
  • Firefox Technology Preview: supported.
  • Safari: 18.

Source

L'API View Transitions est l'un des principaux domaines d'intérêt d'Interop 2025, en particulier les transitions de vue dans le même document avec document.startViewTransition(updateCallback), view-transition-class, le nommage automatique avec view-transition-name: match-element et le sélecteur CSS :active-view-transition.

Firefox prévoit d'inclure ces fonctionnalités dans la prochaine version 144 de Firefox, qui deviendra stable le 14 octobre 2025. Ces fonctionnalités seront alors disponibles dans la version de référence.

La prise en charge de l'API View Transitions est désormais intégrée à React

Tout au long de l'année, l'équipe React a travaillé à l'ajout de transitions de vue au cœur de React. Ils ont annoncé react@experimental la prise en charge en avril et, cette semaine, lors de la conférence React, ils ont déplacé la prise en charge vers react@canary, ce qui signifie que la conception est presque définitive.

function Child() {
  return (
    <ViewTransition>
      <div>Hi</div>
    </ViewTransition>
  );
}

function Parent() {
  const [show, setShow] = useState();
  if (show) {
    return <Child />;
  }
  return null;
}

Pour en savoir plus, consultez la documentation <ViewTransition> de React ou regardez cette présentation d'Aurora Scharff pour une bonne introduction sur le sujet.

Fonctionnalités récemment déployées

Nommer automatiquement les éléments avec view-transition-name: match-element

Browser Support

  • Chrome: 137.
  • Edge: 137.
  • Firefox Technology Preview: supported.
  • Safari: not supported.

Pour marquer un élément à inclure dans un instantané dans le cadre d'une transition de vue, vous lui attribuez un view-transition-name. C'est essentiel pour les transitions de vue, car cela permet d'utiliser des fonctionnalités telles que la transition entre deux éléments différents. Chaque élément a la même valeur view-transition-name de chaque côté de la transition, et les transitions de vue s'occupent du reste.

Toutefois, nommer les éléments de manière unique peut devenir fastidieux lors de la transition de nombreux éléments qui ne changent pas vraiment. Si vous avez 100 éléments qui se déplacent dans une liste, vous devez trouver 100 noms uniques.

Grâce à match-element, vous n'avez pas besoin de faire tout cela. Lorsque vous utilisez cette valeur pour view-transition-name, le navigateur génère un view-transition-name interne pour chaque élément correspondant en fonction de l'identité de l'élément.

Cette approche est utilisée dans la démonstration suivante. Chaque fiche de la ligne reçoit un view-transition-name généré automatiquement.

.card {
  view-transition-name: match-element;
  view-transition-class: card;
}

#targeted-card {
  view-transition-name: targeted-card;
  view-transition-class: none;
}

La carte qui entre ou sort reçoit un nom explicite. Ce nom est utilisé dans le CSS pour associer des animations spécifiques à cet instantané. Les instantanés de toutes les autres cartes sont stylisés à l'aide de view-transition-class qui leur est associé.

/* Style all pseudos with the class .card */
::view-transition-group(*.card) {
  animation-timing-function: var(--bounce-easing);
  animation-duration: 0.5s;
}

/* Style only the targeted-card's pseudos */
::view-transition-old(targeted-card):only-child {
  animation: animate-out ease-out 0.5s forwards;
}
::view-transition-new(targeted-card):only-child {
  animation: animate-in ease-in 0.25s forwards;
}

Les outils de développement affichent désormais les règles ciblant les pseudos qui utilisent un view-transition-class.

Pour déboguer les transitions de vue, vous pouvez utiliser le panneau "Animations" des outils de développement pour mettre en pause toutes les animations. Vous avez ainsi le temps d'inspecter les pseudo-éléments sans avoir à vous soucier de l'état final de la transition de vue. Vous pouvez même faire défiler manuellement les timelines de l'animation pour voir comment se déroulent les transitions.

Déboguer les transitions d'affichage avec les outils pour les développeurs Chrome.

Auparavant, lorsque vous inspectiez l'un des pseudo-éléments ::view-transition-*, les outils pour les développeurs Chrome n'exposaient pas les règles ciblant les pseudos à l'aide de leur view-transition-class défini. Cette fonctionnalité a été ajoutée dans Chrome 139.

Illustration : Capture d'écran des outils pour les développeurs Chrome inspectant un pseudo-élément view-transition-group dans la démonstration des cartes. L'onglet "Styles" affiche les règles qui affectent ce pseudo-élément, y compris la règle qui utilise le sélecteur view-transition-group(*.card).

Les groupes de transition de vue imbriqués sont disponibles à partir de Chrome 140.

Browser Support

  • Chrome: 140.
  • Edge: not supported.
  • Firefox: not supported.
  • Safari: not supported.

Lorsqu'une transition de vue s'exécute, elle affiche les éléments instantanés dans une arborescence de pseudo-éléments. Par défaut, l'arborescence générée est "plate". Cela signifie que la hiérarchie d'origine dans le DOM est perdue et que tous les groupes de transition de vue capturés sont des frères et sœurs sous un seul pseudo-élément ::view-transition.

Cette approche d'arborescence plate est suffisante pour de nombreux cas d'utilisation, mais devient problématique lorsque des effets visuels tels que le clipping ou les transformations 3D sont utilisés. Celles-ci nécessitent une certaine hiérarchie dans l'arborescence.

Enregistrement d'une démonstration avec et sans groupes de transition de vue imbriqués activés. Lorsque des groupes de transitions de vue imbriqués sont utilisés, le contenu textuel peut rester coupé par la carte et le texte peut également pivoter en 3D avec cette carte.

Grâce à la fonctionnalité Groupes de transitions de vue imbriqués, vous pouvez désormais imbriquer des pseudo-éléments ::view-transition-group les uns dans les autres. Lorsque les groupes de transition de vue sont imbriqués, il est possible de restaurer des effets tels que le clipping pendant la transition.

Découvrez comment utiliser les groupes de transition de vue.

Les pseudo-éléments héritent désormais de davantage de propriétés d'animation

Lorsque vous définissez l'une des propriétés détaillées animation-* sur un pseudo-élément ::view-transition-group(…), les éléments ::view-transition-image-pair(…), ::view-transition-old(…) et ::view-transition-new(…) contenus héritent également de cette propriété. C'est pratique, car cela permet de synchroniser automatiquement le fondu enchaîné entre ::view-transition-new(…) et ::view-transition-old(…) avec ::view-transition-group(…).

::view-transition-group(.card) {
  animation-duration: 0.5s;
}

Initialement, cet héritage était limité à animation-duration et animation-fill-mode (et plus tard à animation-delay), mais il a été étendu pour hériter de plus de propriétés d'animation.

Les navigateurs compatibles avec les transitions d'affichage devraient désormais contenir les éléments suivants dans leur feuille de style user-agent :

:root::view-transition-image-pair(*),
:root::view-transition-old(*),
:root::view-transition-new(*) {
  animation-duration: inherit;
  animation-fill-mode: inherit;
  animation-delay: inherit;
  animation-timing-function: inherit;
  animation-iteration-count: inherit;
  animation-direction: inherit;
  animation-play-state: inherit;
}

Les pseudo-éléments héritant de plus de propriétés ont été déployés dans Chrome 140.

L'exécution du rappel de promesse finished n'attend plus de frame.

Lorsque vous utilisez la promesse finished pour exécuter un rappel, Chrome attendait qu'un frame soit produit avant d'exécuter cette logique. Cela peut entraîner un scintillement à la fin de l'animation lorsque le script déplace certains styles pour tenter de préserver un état visuellement similaire.

 document.startViewTransition(() => {
  if (from) {
    dfrom.classList.remove("shadow");
    dto.appendChild(target);
  } else {
    dto.classList.remove("shadow");
    dfrom.appendChild(target);
  }
}).finished.then(() => {
  if (from) {
    dto.classList.add("shadow");
  } else {
    dfrom.classList.add("shadow");
  }
  from = 1 - from;
});
Enregistrement de l'ancien code en action, enregistré dans Chrome 139 qui n'inclut pas la correction du timing. Vous pouvez voir un problème lorsque l'ombre de la boîte est ajoutée une fois la transition terminée.

Ce changement de timing corrige la situation en déplaçant les étapes de nettoyage de la transition de vue pour qu'elles s'exécutent de manière asynchrone une fois le cycle de vie terminé. Cela garantit que le cadre visuel produit lors de la résolution de la promesse finished conserve la structure de la transition de vue, évitant ainsi le scintillement.

Cette modification du timing a été déployée dans Chrome 140.

Fonctionnalités à venir

L'année n'est pas encore terminée, il reste donc encore du temps pour déployer d'autres fonctionnalités.

Les transitions de vue à portée limitée sont prêtes à être testées dans Chrome 140

Les transitions de vue à portée limitée sont une extension proposée à l'API View Transitions. Elles vous permettent de démarrer une transition de vue sur un sous-arbre du DOM en appelant element.startViewTransition() (au lieu de document.startViewTransition()) sur n'importe quel HTMLElement.

Les transitions à portée limitée permettent d'exécuter plusieurs transitions de vue en même temps (à condition qu'elles aient des racines de transition différentes). Les événements de pointeur sont empêchés uniquement sur ce sous-arbre (que vous pouvez réactiver), et non sur l'ensemble du document. De plus, ils permettent de peindre les éléments en dehors de la racine de la transition au-dessus de la transition de vue à portée.

Dans la démo suivante, vous pouvez déplacer un point dans son conteneur en cliquant sur l'un des boutons. Vous pouvez le faire avec des transitions de vue à portée de document ou à portée d'élément, ce qui vous permet de voir comment elles se comportent différemment.

Cette fonctionnalité est prête à être testée à partir de Chrome 140, avec le flag "Experimental Web Platform features" activé dans chrome://flags. Nous sommes très attentifs aux commentaires des développeurs.

La position de ::view-transition passera de fixed à absolute dans Chrome 142

Le pseudo ::view-transition est actuellement positionné à l'aide de position: fixed. Suite à une résolution du groupe de travail CSS, cette valeur sera remplacée par position: absolute.

Cette modification de la valeur position de fixed à absolute, qui sera disponible dans Chrome 142, n'est pas visible, car le bloc de contenu du pseudo-élément ::view-transition est de toute façon le bloc de contenu de l'instantané. Le seul effet observable est une valeur position différente lors d'une getComputedStyle.

document.activeViewTransition arrive dans Chrome 142

Lorsqu'une transition de vue est lancée, une instance ViewTransition est créée. Cet objet contient plusieurs promesses et fonctionnalités permettant de suivre la progression de la transition, ainsi que d'effectuer des manipulations telles que l'ignorer ou modifier ses types.

Au lieu de vous demander de suivre manuellement cette instance, Chrome fournit désormais une propriété document.activeViewTransition qui représente cet objet. Si aucune transition n'est en cours, sa valeur est null.

Pour les transitions de vue dans le même document, la valeur est définie lorsque vous appelez document.startViewTransition. Pour les transitions de vue entre documents, vous pouvez accéder à cette instance ViewTransition dans les événements pageswap et pagereveal.

La prise en charge de document.activeViewTransition sera bientôt disponible dans Chrome 142.

Empêcher une transition de vue de se terminer automatiquement avec ViewTransition.waitUntil

Une transition de vue atteint automatiquement son état finished lorsque toutes ses animations sont terminées. Pour éviter cette finalisation automatique, vous pourrez bientôt utiliser ViewTranistion.waitUntil. Lorsque vous transmettez une promesse, le ViewTransition n'atteint son état finished que lorsque cette promesse transmise est également résolue.

const t = document.startViewTransition();
t.waitUntil(async () => {
  await fetch();
});

Cette modification sera disponible plus tard dans l'année et permettra, par exemple, d'attendre un fetch ou de faciliter l'implémentation d'une transition de vue basée sur le défilement.

Étape suivante

Comme vous pouvez le voir, nous ne sommes pas restés les bras croisés depuis le lancement initial des transitions de vue en 2023. Nous avons hâte de proposer des transitions de vue limitées à l'avenir et, comme toujours, nous sommes ouverts à vos commentaires.

Si vous avez des questions sur les transitions de vue, contactez-nous sur les réseaux sociaux. Les demandes de fonctionnalités pour les transitions de vue peuvent être envoyées au CSS WG. Si vous rencontrez un bug, signalez-le dans Chromium pour nous en informer.