Overslaan naar hoofdinhoud

View Transitions

Openen in ChatGPT
Java API
25.11 Experimenteel

Weergave-overgangen bieden geanimeerde overgangen wanneer de DOM verandert, waardoor visuele schokken worden verminderd en de ruimtelijke context tijdens navigatie of inhoudsupdates 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 staten te beheren.

Toon Code

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

Basisgebruik

Om een weergave-overgang te creëren, gebruikt u Page.getCurrent().startViewTransition(), dat een builder retourneert voor het configureren van de overgang:

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

Het overgangsproces legt een momentopname van de huidige toestand vast, past uw DOM-wijzigingen toe in de onUpdate callback en animeert vervolgens van de oude momentopname naar de nieuwe inhoud. U moet done.run() aanroepen om te signaleren wanneer uw wijzigingen zijn voltooid.

De onUpdate callback is vereist

Het aanroepen van start() zonder het instellen van een update callback gooit een IllegalStateException.

Overgangen toepassen

webforJ biedt vooraf gedefinieerde overgangstypen die u kunt toepassen op componenten die de DOM binnenkomen of verlaten:

ConstantEffect
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 achterwaartse navigatie)
ViewTransition.SLIDE_UPInhoud stroomt naar boven
ViewTransition.SLIDE_DOWNInhoud stroomt naar beneden
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 componentovergangen

Gedeelde componentovergangen creëren een vervormings effect 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 overgangsnaam 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 morph
image.setViewTransitionName("blog-image");

Wanneer u tussen deze weergaven overgaat, animeert de browser de component tussen de posities, waardoor een verbonden visuele ervaring ontstaat.

Gebruik unieke namen

Wanneer u werkt met lijsten of herhaalde componenten, voeg een unieke identifier toe aan de overgangsnaam. Elke component heeft een unieke naam nodig om correct naar de bijbehorende component in de nieuwe weergave te morph. Het gebruik van dezelfde naam voor meerdere zichtbare componenten veroorzaakt onvoorspelbaar gedrag.

Toon Code

Lijst opnieuw ordenen

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

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

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

Aangepaste CSS-animaties

Voor volledige controle over animaties kunt u aangepaste CSS-keyframes definiëren. webforJ voegt -enter of -exit suffixen toe aan uw overgangsnaam, die u gebruikt om de pseudo-elementen van de weergave-overgang 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 weergave-overgang */
::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 uw aangepaste animatie door de naam (zonder het suffix) door te geven aan enter() of exit():

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

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

CSS-aanpassing

Elk vooraf gedefinieerd overgangstype stelt CSS-aangepaste eigenschappen bloot voor verdere afstemming:

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

Om aan te passen, overschrijft u deze variabelen in uw CSS:

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

Voor geavanceerde aanpassing, target de pseudo-elementen van de weergave-overgang direct:

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

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