Overslaan naar hoofdinhoud

View Transitions

Openen in ChatGPT
Java API
25.11 Experimenteel

View-transities bieden geanimeerde overgangen wanneer de DOM verandert, waardoor visuele verstoringen worden verminderd en de ruimtelijke context tijdens navigatie of contentupdates behouden blijft. webforJ integreert met de View Transition API van de browser om de complexiteit van het coördineren van animaties tussen oude en nieuwe toestanden te beheren.

Toon Code

Experimentele functie
Deze functie is experimenteel en kan in een toekomstige release veranderen of verwijderd worden.

Basisgebruik

Om een view-transitie te creëren, gebruik je Page.getCurrent().startViewTransition(), wat een builder retourneert voor het configureren van de transitie:

Page.getCurrent().startViewTransition()
.onUpdate(done -> {
container.remove(oldView);
container.add(newView);
done.run();
})
.start();

Het transitieproces legt een momentopname van de huidige staat vast, past je DOM-wijzigingen toe in de onUpdate callback en animeert vervolgens van de oude momentopname naar de nieuwe inhoud. Je moet done.run() aanroepen om aan te geven wanneer je wijzigingen voltooid zijn.

De onUpdate callback is vereist

Aanroepen van start() zonder het instellen van een update callback werpt een IllegalStateException.

Toepassen van transities

webforJ biedt gedefinieerde transietypes die je kunt toepassen op componenten die de DOM binnenkomen of verlaten:

ConstanteEffect
ViewTransition.NONEGeen animatie
ViewTransition.FADECrossfade tussen oude en nieuwe inhoud
ViewTransition.SLIDE_LEFTInhoud stroomt naar links (zoals voorwaartse navigatie)
ViewTransition.SLIDE_RIGHTInhoud stroomt naar rechts (zoals terug navigatie)
ViewTransition.SLIDE_UPInhoud stroomt omhoog
ViewTransition.SLIDE_DOWNInhoud stroomt omlaag
ViewTransition.ZOOMOude inhoud krimpt weg, nieuwe inhoud groeit in
ViewTransition.ZOOM_OUTOude inhoud groeit weg, nieuwe inhoud krimpt in

Gebruik enter() om een component die wordt toegevoegd te animeren en exit() om een component die wordt verwijderd te animeren:

// Animeer een component die de DOM binnenkomt
Page.getCurrent().startViewTransition()
.enter(chatPanel, ViewTransition.ZOOM)
.onUpdate(done -> {
container.add(chatPanel);
done.run();
})
.start();

// Animeer een component die de DOM verlaat
Page.getCurrent().startViewTransition()
.exit(chatPanel, ViewTransition.FADE)
.onUpdate(done -> {
container.remove(chatPanel);
done.run();
})
.start();

Gedeelde componenttransities

Gedeelde componenttransities creëren een morfingseffect waarbij een component lijkt te transformeren van zijn positie in de oude weergave naar zijn positie in de nieuwe weergave. Dit wordt bereikt door componenten dezelfde transitie naam te geven met behulp van de setViewTransitionName() methode, die beschikbaar is op elk component dat de HasStyle interface implementeert.

// In de kaartweergave
image.setViewTransitionName("blog-image");

// In de detailweergave - dezelfde naam creëert de morf
image.setViewTransitionName("blog-image");

Bij het overgaan tussen deze weergaven animeert de browser de component tussen posities, waardoor een verbonden visuele ervaring ontstaat.

Gebruik unieke namen

Bij het werken met lijsten of herhaalde componenten, neem een unieke identificatie op in de transitie naam. Elke component heeft zijn eigen unieke naam nodig om correct te morfen naar de overeenkomstige component in de nieuwe weergave. Het gebruik van dezelfde naam voor meerdere zichtbare componenten veroorzaakt ongedefinieerd gedrag.

Toon Code

Lijst herschikken

Een veelvoorkomend gebruik van gedeelde componenttransities is het animeren van lijstitems wanneer hun volgorde verandert. Door elke item een unieke view-transition-name toe te wijzen, animeert de browser de componenten automatisch naar hun nieuwe posities:

// Elke kaart krijgt een unieke transitie naam op basis van zijn ID
card.setViewTransitionName("card-" + item.id());

// Bij het schudden, update gewoon de DOM - de browser verzorgt de animatie
Page.getCurrent().startViewTransition()
.onUpdate(done -> {
renderList();
done.run();
})
.start();
Toon Code

Aangepaste CSS-animaties

Voor volledige controle over animaties kun je aangepaste CSS-keyframes definiëren. webforJ voegt -enter of -exit achtervoegsels toe aan je transitienamen, die je gebruikt om de pseudo-elementen van de view-transitie te targeten:

/* Definieer keyframes voor binnenkomende componenten */
@keyframes flip-enter {
from {
opacity: 0;
transform: perspective(1000px) rotateX(-90deg);
}
to {
opacity: 1;
transform: perspective(1000px) rotateX(0deg);
}
}

/* Toepassen op het pseudo-element van de view-transitie */
::view-transition-new(flip-in-enter) {
animation: flip-enter 450ms cubic-bezier(0.34, 1.56, 0.64, 1);
transform-origin: top center;
}

::view-transition-old(flip-in-enter) {
display: none;
}

Verwijs naar je aangepaste animatie door de naam (zonder het achtervoegsel) door te geven aan enter() of exit():

// Gebruik "flip-in" - webforJ voegt automatisch het "-enter" achtervoegsel toe
Page.getCurrent().startViewTransition()
.enter(notification, "flip-in")
.onUpdate(done -> {
stage.add(notification);
done.run();
})
.start();

// Gebruik "blur-out" voor exit - webforJ voegt "-exit" achtervoegsel toe
Page.getCurrent().startViewTransition()
.exit(notification, "blur-out")
.onUpdate(done -> {
stage.remove(notification);
done.run();
})
.start();
Toon Code

CSS-aanpassing

Elke gedefinieerde transitie type exposeert CSS aangepaste eigenschappen voor verdere verfijning:

VariabeleStandaardBeschrijving
--vt-fade-duration200msAnimatieduur
--vt-fade-easingcubic-bezier(0.4, 0, 0.2, 1)Easing-functie
VariabeleStandaardBeschrijving
--vt-slide-left-duration200msAnimatieduur
--vt-slide-left-easingcubic-bezier(0.4, 0, 0.2, 1)Easing-functie
--vt-slide-left-distance30%Slide-afstand
VariabeleStandaardBeschrijving
--vt-slide-right-duration200msAnimatieduur
--vt-slide-right-easingcubic-bezier(0.4, 0, 0.2, 1)Easing-functie
--vt-slide-right-distance30%Slide-afstand
VariabeleStandaardBeschrijving
--vt-slide-up-duration200msAnimatieduur
--vt-slide-up-easingcubic-bezier(0.4, 0, 0.2, 1)Easing-functie
--vt-slide-up-distance30%Slide-afstand
VariabeleStandaardBeschrijving
--vt-slide-down-duration200msAnimatieduur
--vt-slide-down-easingcubic-bezier(0.4, 0, 0.2, 1)Easing-functie
--vt-slide-down-distance30%Slide-afstand
VariabeleStandaardBeschrijving
--vt-zoom-duration200msAnimatieduur
--vt-zoom-easingcubic-bezier(0.4, 0, 0.2, 1)Easing-functie
--vt-zoom-scale0.8Schaalfactor (oude zoomt naar deze, nieuwe zoomt in vanuit deze)
VariabeleStandaardBeschrijving
--vt-zoom-out-duration200msAnimatieduur
--vt-zoom-out-easingcubic-bezier(0.4, 0, 0.2, 1)Easing-functie
--vt-zoom-out-scale1.2Schaalfactor (oude zoomt in naar deze, nieuwe zoomt uit van deze)

Om aan te passen, overschrijf je deze variabelen in je CSS:

:root {
--vt-fade-duration: 300ms;
--vt-slide-left-distance: 50%;
}

Voor geavanceerde aanpassing, richt je je direct op de pseudo-elementen van de view-transitie:

::view-transition-old(vt-slide-left-exit) {
animation-duration: 400ms;
}

::view-transition-new(vt-slide-left-enter) {
animation-timing-function: ease-out;
}