Witaj w Sali Holograficznej NOVA LAB! Rok 2087 — interfejsy stacji kosmicznej muszą być nie tylko funkcjonalne, ale też elegancko animowane. Gdy Dr. Nova otwiera panel diagnostyczny reaktora, dane nie pojawiają się nagle — płynnie wchodzą na ekran, a po zamknięciu równie gracko znikają. Vue udostępnia wbudowany komponent
<Transition>, który pozwala dodawać właśnie takie płynne animacje wejścia i wyjścia elementów.<Transition>?<Transition> to wbudowany komponent Vue, który automatycznie dodaje i usuwa klasy CSS podczas pojawiania się i znikania elementu. Nie renderuje żadnego dodatkowego elementu DOM — jest "niewidzialnym opakowaniem":1<Transition name="fade">
2 <div v-if="showPanel">Panel statusu stacji</div>
3</Transition>Gdy
showPanel zmieni się z false na true, Vue doda odpowiednie klasy CSS do elementu <div>, uruchamiając animację wejścia. Gdy wartość zmieni się z powrotem na false, Vue uruchomi animację wyjścia, a dopiero po jej zakończeniu usunie element z DOM.Ważne ograniczenie:
<Transition> opakowuje dokładnie jeden element lub komponent. Jeśli potrzebujesz animować listę — użyj <TransitionGroup> (poznasz go w dalszej części modułu).Vue automatycznie dodaje i usuwa 6 klas CSS podczas cyklu życia animacji. To fundament zrozumienia systemu przejść:
Wejście (enter) — gdy element się pojawia:
v-enter-from — stan początkowy wejścia. Dodawana przed wstawieniem elementu, usuwana po jednej klatce.v-enter-active — aktywna przez cały czas trwania wejścia. Tu definiujesz transition lub animation.v-enter-to — stan końcowy wejścia. Dodawana po jednej klatce (gdy -from jest usuwana), usuwana po zakończeniu animacji.Wyjście (leave) — gdy element znika:
v-leave-from — stan początkowy wyjścia. Dodawana natychmiast po wywołaniu wyjścia.v-leave-active — aktywna przez cały czas trwania wyjścia.v-leave-to — stan końcowy wyjścia. Dodawana po jednej klatce, usuwana po zakończeniu animacji.Sekwencja zdarzeń wygląda tak:
1Wejście: enter-from → (1 klatka) → enter-to + enter-active → (koniec animacji) → cleanup
2Wyjście: leave-from → (1 klatka) → leave-to + leave-active → (koniec animacji) → element usuniętyNajprostszy i najczęściej używany efekt — płynne pojawianie się i znikanie:
1.fade-enter-active,
2.fade-leave-active {
3 transition: opacity 0.5s ease;
4}
5
6.fade-enter-from,
7.fade-leave-to {
8 opacity: 0;
9}Klasy
-from i -to definiują stany początkowe i końcowe (w tym przypadku: opacity: 0 dla niewidoczności). Klasy -active definiują czas trwania, typ easingu i które właściwości animować.Animacje mogą łączyć wiele właściwości CSS jednocześnie:
1.slide-enter-active,
2.slide-leave-active {
3 transition: all 0.3s ease;
4}
5
6.slide-enter-from {
7 opacity: 0;
8 transform: translateY(-20px);
9}
10
11.slide-leave-to {
12 opacity: 0;
13 transform: translateY(20px);
14}Element wchodzi przesuwając się z góry, a wychodzi przesuwając się w dół — jak panel alarmowy na stacji NOVA LAB, który spada z góry ekranu.
<Transition> działa zarówno z v-if jak i v-show, ale ich zachowanie jest różne:v-if — element jest fizycznie dodawany i usuwany z DOM. Animacja wyjścia kończy się dopiero przed usunięciem elementu. Lepsze dla elementów, które rzadko się przełączają.v-show — element zawsze jest w DOM, tylko zmienia się display: none. Szybsze przełączanie, lepsze dla elementów które często się pojawiają i znikają (np. panel alertów).1<template>
2 <div class="control-panel">
3 <button @click="showStatus = !showStatus">Toggle Panel</button>
4
5 <!-- v-if: element dodawany/usuwany z DOM -->
6 <Transition name="fade">
7 <div v-if="showStatus" class="status-panel">
8 Reactor status: ONLINE
9 </div>
10 </Transition>
11
12 <!-- v-show: element zawsze w DOM, zmiana display -->
13 <Transition name="fade">
14 <div v-show="showAlert" class="alert-panel">
15 Warning: temperature rising!
16 </div>
17 </Transition>
18 </div>
19</template>
20
21<script setup>
22import { ref } from 'vue'
23
24const showStatus = ref(true)
25const showAlert = ref(false)
26</script>v-if/v-else)