Guide
Essentiel
- Installation
- Introduction
- Instance de Vue
- Syntaxe de template
- Propriétés calculées et observateurs
- Liaisons de classes et de styles
- Rendu conditionnel
- Rendu de liste
- Gestion des évènements
- Liaisons sur les champs de formulaire
- Composants
Composants en détail
- Création de composants
- Props
- Évènements personnalisés
- Slots
- Composants dynamiques et asynchrones
- Gérer les cas limites
Transitions & animation
- Transitions d'entrée, de sortie et de liste
- Transitions d'état
Réutilisabilité & composition
- Mixins
- Directives personnalisées
- Fonctions de rendu et JSX
- Plugins
- Filtres
Outils
- Composants monofichiers
- Testing
- Support de TypeScript
- Déploiement en production
Évolutions
- Routage
- Gestion de l'état
- Rendu côté serveur
- Security
Mécanismes
- Réactivité en détail
Migration
- Migration depuis Vue 1.x
- Migration depuis Vue Router 0.7.x
- Migration depuis Vuex 0.6.x à 1.0
Meta
- Comparaison avec les autres frameworks
- Rejoignez la communauté Vue.js !
- Rencontrer l'équipe
You’re browsing the documentation for v2.x and earlier. For v3.x, click here.
Transitions d'entrée, de sortie et de liste
Vue d’ensemble
Vue fournit plusieurs façons d’appliquer des effets de transition lorsque des éléments sont insérés, mis à jour ou supprimés du DOM. Cela inclut des outils pour :
- appliquer automatiquement des classes pour les transitions et les animations CSS
- intégrer des bibliothèques d’animation CSS tierces, comme Animate.css
- utiliser JavaScript pour manipuler directement le DOM durant les hooks de transition
- intégrer des bibliothèques d’animation JavaScript tierces, comme Velocity.js
Sur cette page, nous ne traiterons que des transitions entrantes, sortantes et de liste, mais vous pouvez consulter la section suivante pour la gestion des transitions d’état.
Transition d’éléments/composants simples
Vue fournit un composant conteneur transition
, vous permettant d’ajouter des transitions entrantes/sortantes pour n’importe quel élément ou composant dans les contextes suivants :
- Le rendu conditionnel (en utilisant
v-if
) - L’affichage conditionnel (en utilisant
v-show
) - Les composants dynamiques
- Les nœuds racines de composant
Voilà à quoi ressemble un exemple très simple en action :
|
|
|
bonjour
Quand un élément, encapsulé dans un composant transition
, est inséré ou enlevé, voilà ce qui arrive :
Vue recherchera automatiquement si l’élément cible a des transitions CSS ou des animations appliquées. Si c’est le cas, les classes de transition CSS seront ajoutées/supprimées aux moments appropriés.
Si le composant de transition possède des hooks JavaScript, ces hooks seront appelés aux moments appropriés.
Si aucune transition/animation CSS n’est détectée et qu’aucun hook JavaScript n’est fourni, les opérations du DOM pour l’insertion et/ou la suppression seront exécutées immédiatement à la frame suivante (Remarque : il s’agit d’une frame d’animation du navigateur, différente du concept de
nextTick
).
Classes de transition
Il y a six classes appliquées pour les transitions entrantes/sortantes.
v-enter
: c’est l’état de départ pour enter. Il est ajouté avant que l’élément soit inséré, il est supprimé une fois que l’élément est inséré.v-enter-active
: c’est l’état actif pour enter. Il est appliqué pendant toute la phase enter. Il est ajouté avant que l’élément soit inséré, il est supprimé lorsque la transition/animation est terminée. Cette classe peut être utilisée pour définir la durée, le retard et la courbe d’accélération pour la transition entrante.v-enter-to
: seulement disponible pour les versions 2.1.8+. C’est l’état de fin pour enter. Il est ajouté une fois que l’élément est inséré (au même moment quev-enter
est supprimé), il est supprimé lorsque la transition/animation est terminée.v-leave
: c’est l’état de départ pour leave. Il est ajouté dès qu’une transition sortante est déclenchée, il est supprimé après une frame.v-leave-active
: c’est l’état actif pour leave. Il est appliqué pendant toute la phase leave. Il est ajouté dès qu’une transition sortante est déclenchée, il est supprimé lorsque la transition/animation est terminée. Cette classe peut être utilisée pour définir la durée, le retard et la courbe d’accélération pour la transition de sortie.v-leave-to
: seulement disponible pour les versions 2.1.8+. C’est l’état de fin pour leave. Il est ajouté après que la transition sortante est déclenchée (au même moment quev-leave
est supprimé), il est supprimé lorsque la transition/animation est terminée.
Chacune de ces classes sera préfixée avec le nom de la transition. Ici le préfixe v-
est celui par défaut lorsque vous utilisez l’élément <transition>
sans nom. Si vous utilisez par exemple <transition name="ma-transition">
, alors la classe v-enter
sera nommé ma-transition-enter
.
v-enter-active
et v-leave-active
vous donnent la possibilité de spécifier des courbes d’accélération pour les transitions entrantes/sortantes, ce que nous verrons en exemple dans la section suivante.
Transitions CSS
L’un des types de transition les plus courants utilise les transitions CSS. Voici un exemple simple :
|
|
|
bonjour
CSS Animations
Les animations CSS sont appliquées de la même manière que les transitions CSS, la différence étant que v-enter
n’est pas supprimé immédiatement après l’insertion de l’élément, mais par un évènement animationend
.
Voici un exemple, en supprimant les règles CSS préfixées pour des raisons de concision :
|
|
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris facilisis enim libero, at lacinia diam fermentum id. Pellentesque habitant morbi tristique senectus et netus.
Classes de transition personnalisées
Vous pouvez également spécifier des classes de transition personnalisées en fournissant les attributs suivants :
enter-class
enter-active-class
enter-to-class
(2.1.8+)leave-class
leave-active-class
leave-to-class
(2.1.8+)
Celles-ci remplacent les noms de classes habituelles. C’est surtout utile quand vous voulez combiner le système de transition de Vue avec une bibliothèque d’animation CSS existante, comme Animate.css.
Voici un exemple :
|
|
bonjour
Utilisation simultanée des transitions et animations
Vue a besoin d’attacher des écouteurs d’évènement pour savoir quand une transition est terminée. Cela peut être transitionend
ou animationend
, selon le type de règles CSS appliquées. Si vous utilisez seulement l’une ou l’autre, Vue peut automatiquement déterminer le type correct.
Toutefois, dans certains cas, vous pouvez les avoir tous les deux sur le même élément, par exemple avoir une animation CSS déclenchée par Vue, ainsi qu’un effet de transition CSS lors du survol. Dans ces cas, vous devez explicitement déclarer le type dont vous voulez que Vue se soucie dans un attribut type
, avec une valeur à animation
ou transition
.
Durées de transition explicites
Nouveau dans 2.2.0+
Dans la plupart des cas, Vue peut automatiquement déterminer quand la transition est terminée. Par défaut, Vue attend le premier évènement transitionend
ou animationend
sur l’élément de transition racine. Cependant, cela peut ne pas toujours être souhaité (par exemple, nous pouvons avoir une séquence de transition chorégraphiée où certains éléments internes imbriqués ont une transition retardée ou une durée de transition plus longue que l’élément de transition racine).
Dans ce cas, vous pouvez spécifier une durée de transition explicite (en millisecondes) en utilisant le prop duration
sur le composant <transition>
:
|
Vous pouvez également spécifier des valeurs séparées pour les durées de enter et leave :
|
hooks JavaScript
Vous pouvez définir des hooks JavaScript dans les attributs :
|
|
Ces hooks peuvent être utilisés en combinaison avec des transitions/animations CSS ou sur eux-mêmes.
Lors de l’utilisation de transitions uniquement JavaScript, les fonctions de rappel done
sont obligatoires pour les hooks enter
et leave
. Dans le cas contraire, elles seront appelées de façon synchrone et la transition se terminera immédiatement.
C’est aussi une bonne idée d’ajouter explicitement v-bind:css="false"
pour les transitions uniquement JavaScript afin que Vue puisse ignorer la détection CSS. Cela empêche également les règles CSS d’interférer accidentellement avec la transition.
Maintenant, nous allons plonger dans un exemple. Voici une simple transition JavaScript à l’aide de Velocity.js :
|
|
Démo
Transitions sur le rendu initial
Si vous souhaitez également appliquer une transition sur le rendu initial d’un nœud, vous pouvez ajouter l’attribut appear
:
|
Par défaut, cela utilisera les transitions spécifiées pour l’entrée et la sortie. Si vous le souhaitez, vous pouvez également spécifier des classes CSS personnalisées :
|
et des hooks JavaScript personnalisés :
|
Dans l’exemple ci-dessus, l’attribut appearou le hook
v-on:appear` vont tous deux déclencher une transition d’apparition.
Transition entre éléments
Plus loin, nous parlons de transition entre les composants, mais vous pouvez également faire une transition entre des éléments bruts en utilisant v-if
/v-else
. L’une des transitions les plus courantes sur deux éléments est entre un conteneur de liste et un message décrivant une liste vide :
|
Cela fonctionne bien, mais il y a une mise en garde à connaitre :
Lors de la permutation entre des éléments qui ont le même nom de balise, vous devez indiquer à Vue qu’ils sont des éléments distincts en lui donnant des attributs key
uniques. Sinon, le compilateur de Vue ne remplacera que le contenu de l’élément dans le but d’être efficace. Cependant, même si c’est techniquement inutile, c’est considéré comme une bonne pratique de toujours avoir une clé pour chaque élément dans un composant <transition>
.
Par exemple :
|
Dans ces cas, vous pouvez aussi utiliser l’attribut key
pour effectuer une transition entre différents états du même élément. Au lieu d’utiliser v-if
et v-else
, l’exemple ci-dessus pourrait être réécrit ainsi :
|
Il est effectivement possible de faire une transition entre un nombre indéfini d’éléments, soit en utilisant plusieurs v-if
ou soit en liant un élément unique à une propriété dynamique. Par exemple :
|
Qui pourrait aussi s’écrire ainsi :
|
|
Modes de transition
Cependant, il existe encore un problème. Essayez de cliquer sur le bouton ci-dessous :
Comme c’est une transition entre le bouton « on » et le bouton « off », les deux boutons sont rendus (l’un est en transition sortante pendant que l’autre est en transition entrante). Il s’agit du comportement par défaut de <transition>
(l’entrée et la sortie se font simultanément).
Parfois, cela fonctionne très bien, comme lorsque des éléments de transition sont absolument positionnés l’un sur l’autre :
Et puis cela peut être interprété comme des transitions de diapositives.
Les transitions simultanées d’entrée et de sortie ne sont pas toujours désirées, donc Vue propose des modes de transition alternatifs :
in-out
: La transition entrante du nouvel élément s’effectue en premier, puis une fois terminée, déclenche la transition sortante de l’élément courant.out-in
: La transition sortante de l’élément courant s’effectue en premier, puis une fois terminée, déclenche la transition entrante du nouvel élément.
Maintenant, mettons à jour la transition pour nos boutons on/off avec out-in
:
|
Avec l’ajout d’un simple attribut, nous avons corrigé cette transition originale sans devoir ajouter un style spécial.
Le mode in-out
n’est pas utilisé aussi souvent, mais peut parfois être utile pour un effet de transition un peu différent. Essayons de le combiner avec la transition diapositive sur laquelle nous avons travaillé précédemment.
Assez cool, non ?
Transition entre les composants
Faire une transition entre les composants est encore plus simple (nous n’avons même pas besoin de l’attribut key
). Au lieu de cela, nous les enveloppons simplement d’un composant dynamique :
|
|
|
Transitions de liste
Jusqu’à présent, nous avons réalisé des transitions pour :
- des nœuds individuels
- des nœuds multiples où un seul est rendu à la fois
Alors, qu’en est-il lorsque nous avons une liste complète d’éléments où nous voulons faire un rendu simultané, par exemple avec v-for
? Dans ce cas, nous allons utiliser le composant <transition-group>
. Cependant avant de plonger dans un exemple, il y a quelques éléments importants à connaitre sur ce composant :
- Contrairement à
<transition>
, il rend un élément réel : par défaut un<span>
. Vous pouvez modifier l’élément rendu avec l’attributtag
. - Les modes de transition ne sont pas disponibles car nous ne pouvons plus alterner entre des éléments mutuellement exclusifs.
- Les éléments à l’intérieur doivent toujours avoir un attribut
key
unique. - Les classes de transition CSS seront appliquées sur les éléments internes et non pas sur les groupes/conteneurs eux-mêmes.
Transitions de liste entrantes/sortantes
Maintenant, nous allons nous plonger dans un exemple simple, faire des transitions entrantes et sortantes en utilisant les mêmes classes CSS que celles utilisées précédemment :
|
|
|
Il y a un problème avec cet exemple. Quand vous ajoutez ou enlevez un élément, ceux qui l’entourent se placent instantanément dans leur nouvel emplacement au lieu de se déplacer en douceur. Nous allons régler cela plus tard.
Transitions de déplacement de liste
Le composant <transition-group>
a un autre tour dans son sac. Il peut non seulement animer l’entrée et la sortie, mais aussi faire des changements de position. Le seul nouveau concept que vous devez connaitre pour utiliser cette fonctionnalité, c’est l’addition de la classe v-move
, qui est ajoutée quand les éléments changent de position. Comme les autres classes, son préfixe correspondra à la valeur d’un attribut name
fourni et vous pouvez également spécifier manuellement une classe avec l’attribut move-class
.
Cette classe est surtout utile pour spécifier le temps de la transition et la courbe d’accélération, comme vous pourrez le voir ci-dessous :
|
|
|
Cela peut sembler magique, mais sous le capot, Vue utilise une technique simple d’animation appelée FLIP pour transiter en douceur les éléments de leur ancienne position vers la nouvelle à l’aide de transformations.
Nous pouvons combiner cette technique avec notre implémentation précédente pour animer chaque changement possible dans notre liste !
|
|
|
Un point important est a noter : ces transitions FLIP ne fonctionnent pas si des éléments sont configurés avec display: inline
. Comme alternative, vous pouvez utiliser display: inline-block
où placer des éléments dans un contexte flexible.
Ces animations FLIP ne se limitent pas à un seul axe. Les éléments dans une grille multidimensionnelle peuvent être transitionnés aussi facilement :
Continuez à appuyer sur le bouton Mélanger jusqu'à ce que vous gagnez.
Échelonnage des transitions de liste
En communiquant avec des transitions JavaScript via des attributs de données, il est également possible d’échelonner les transitions dans une liste :
|
|
Transitions réutilisables
Les Transitions peuvent être réutilisées par le biais du système de composant de Vue. Pour créer une transition réutilisable, il suffit de placer un composant <transition>
ou <transition-group>
à la racine, puis passer les enfants dans le composant de transition.
Voici un exemple utilisant un composant template :
|
Et les composants fonctionnels sont particulièrement adaptés à cette tâche :
|
Transitions dynamiques
Oui, même les transitions dans Vue sont pilotées par les données ! Le plus simple des exemples d’une transition dynamique lie l’attribut name
à une propriété dynamique.
|
Cela peut être utile quand vous avez défini des transitions/animations CSS à l’aide des conventions de classes de transition de Vue et que vous souhaitez simplement basculer entre elles.
En vérité, tout attribut de transition peut être dynamiquement lié. Et il ne s’agit pas seulement des attributs. Étant donné que les hooks d’évènements ne sont que des méthodes, ils ont accès à toutes les données dans le contexte. Cela signifie que selon l’état de votre composant, vos transitions JavaScript peuvent se comporter différemment.
|
|
bonjour
Finalement, le meilleur moyen de créer des transitions dynamiques, c’est par le biais de composants qui acceptent des props pour changer la nature des transitions à utiliser. Cela peut sembler mielleux, mais la seule limite est votre imagination.