Siirry pääsisältöön

View Transitions

Avaa ChatGPT:ssä
Java API
25.11 Koe-aloite

Näytön siirtymät tarjoavat animoituja siirtymiä, kun DOM muuttuu, vähentäen visuaalista häiritsevyyttä ja ylläpitäen tilallista kontekstia navigoinnin tai sisällön päivitysten aikana. webforJ integroituu selaimen View Transition API:iin käsitelläkseen animaatioiden koordinoimisen monimutkaisuutta vanhojen ja uusien tilojen välillä.

Näytä koodi

Experimental feature
This feature is experimental and may change or be removed in a future release.

Peruskäyttö

Luodaksesi näkymäsiirtymän, käytä Page.getCurrent().startViewTransition(), joka palauttaa rakentajan siirtymän määrittämiseksi:

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

Siirtymäprosessi tallentaa nykyisen tilan kuvakaappauksen, soveltaa DOM-muutoksiasi onUpdate-kutsussa, ja sitten animoidaan vanhasta kuvasta uuteen sisältöön. Sinun on kutsuttava done.run() merkitäksesi, kun muutoksesi ovat valmiit.

onUpdate-kutsu on pakollinen

Kutsuminen start() ilman päivityskutsun määrittämistä heittää IllegalStateException.

Siirtymien soveltaminen

webforJ tarjoaa ennaltamääriteltyjä siirtymätyyppejä, joita voit soveltaa komponentteihin, jotka tulevat tai poistuvat DOMista:

VakioVaikutus
ViewTransition.NONEEi animaatiota
ViewTransition.FADERistiinhaalistus vanhan ja uuden sisällön välillä
ViewTransition.SLIDE_LEFTSisältö virtaa vasemmalle (kuten eteenpäin navigointi)
ViewTransition.SLIDE_RIGHTSisältö virtaa oikealle (kuten takaisin navigointi)
ViewTransition.SLIDE_UPSisältö virtaa ylöspäin
ViewTransition.SLIDE_DOWNSisältö virtaa alaspäin
ViewTransition.ZOOMVanha sisältö pienenee, uusi sisältö kasvaa
ViewTransition.ZOOM_OUTVanha sisältö kasvaa pois, uusi sisältö pienenee

Käytä enter()-toimintoa animoidaksesi komponentin lisäämisen ja exit()-toimintoa animoidaksesi komponentin poistamisen:

// Animoidaan komponentti, joka tulee DOMiin
Page.getCurrent().startViewTransition()
.enter(chatPanel, ViewTransition.ZOOM)
.onUpdate(done -> {
container.add(chatPanel);
done.run();
})
.start();

// Animoidaan komponentti, joka poistuu DOMista
Page.getCurrent().startViewTransition()
.exit(chatPanel, ViewTransition.FADE)
.onUpdate(done -> {
container.remove(chatPanel);
done.run();
})
.start();

Jako komponenttisiiirtymät

Jaetut komponenttisiiirtymät luovat muuntumistehosteen, jossa komponentti näyttää siirtyvän vanhasta näkymästä uuteen näkymään. Tämä saavutetaan antamalla komponentille sama siirtymän nimi käyttämällä setViewTransitionName()-metodia, joka on saatavilla kaikilla komponenteilla, jotka toteuttavat HasStyle-rajapinnan.

// Korttinäkymässä
image.setViewTransitionName("blog-image");

// Yksityiskohtanäkymässä - sama nimi luo muuntumisen
image.setViewTransitionName("blog-image");

Kun siirrytään näiden näkymien välillä, selain animoi komponentin paikkojen välillä, luoden yhteyden visuaalisen kokemuksen.

Käytä ainutlaatuisia nimiä

Työskennellessäsi listojen tai toistuvien komponenttien kanssa, lisää ainutlaatuinen tunniste siirtymän nimeen. Jokaisella komponentilla on oltava oma erillinen nimensä, jotta se voi muuntua oikein vastaavaan komponenttiin uudessa näkymässä. Samojen nimien käyttäminen useille näkyville komponentille aiheuttaa määrittelemätöntä käyttäytymistä.

Näytä koodi

Listan uudelleenjärjestäminen

Yksi yleisimmistä käyttötapauksista jaetuille komponenttisiiirtymille on listan kohteiden animointi, kun niiden järjestys muuttuu. Antamalla jokaiselle kohteelle ainutlaatuinen view-transition-name, selain animoi komponentit automaattisesti uusiin paikkoihinsa:

// Jokaiselle kortille annetaan ainutlaatuinen siirtymän nimi sen ID:n perusteella
card.setViewTransitionName("card-" + item.id());

// Kun sekoitetaan, päivitetään vain DOM - selain käsittelee animaation
Page.getCurrent().startViewTransition()
.onUpdate(done -> {
renderList();
done.run();
})
.start();
Näytä koodi

Räätälöidyt CSS-animaatiot

Täydelliseen hallintaan animaatioista voit määrittää räätälöityjä CSS-avainkehyksiä. webforJ lisää siirtymän nimiin -enter tai -exit päätteet, joita käytät osoittamaan näkymäsiirtymän pseudo-elementtejä:

/* Määritä avainkehyksiä komponenttien sisäänmenolle */
@keyframes flip-enter {
from {
opacity: 0;
transform: perspective(1000px) rotateX(-90deg);
}
to {
opacity: 1;
transform: perspective(1000px) rotateX(0deg);
}
}

/* Sovelletaan näkymäsiirtymän pseudo-elementtiin */
::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;
}

Viittaat räätälöityyn animaatioosi antamalla sen nimen (ilman päätettä) enter()- tai exit()-kutsussa:

// Käytä "flip-in" - webforJ lisää "-enter" päätteet automaattisesti
Page.getCurrent().startViewTransition()
.enter(notification, "flip-in")
.onUpdate(done -> {
stage.add(notification);
done.run();
})
.start();

// Käytä "blur-out" poistolle - webforJ lisää "-exit" päätteet
Page.getCurrent().startViewTransition()
.exit(notification, "blur-out")
.onUpdate(done -> {
stage.remove(notification);
done.run();
})
.start();
Näytä koodi

CSS-mukautus

Jokainen ennaltamääritelty siirtymätyyppi altistaa CSS-mukautusominaisuudet hienosäätöön:

MuuttujaOletusKuvaus
--vt-fade-duration200msAnimaation kesto
--vt-fade-easingcubic-bezier(0.4, 0, 0.2, 1)Helpotustoiminto
MuuttujaOletusKuvaus
--vt-slide-left-duration200msAnimaation kesto
--vt-slide-left-easingcubic-bezier(0.4, 0, 0.2, 1)Helpotustoiminto
--vt-slide-left-distance30%Liukumatka
MuuttujaOletusKuvaus
--vt-slide-right-duration200msAnimaation kesto
--vt-slide-right-easingcubic-bezier(0.4, 0, 0.2, 1)Helpotustoiminto
--vt-slide-right-distance30%Liukumatka
MuuttujaOletusKuvaus
--vt-slide-up-duration200msAnimaation kesto
--vt-slide-up-easingcubic-bezier(0.4, 0, 0.2, 1)Helpotustoiminto
--vt-slide-up-distance30%Liukumatka
MuuttujaOletusKuvaus
--vt-slide-down-duration200msAnimaation kesto
--vt-slide-down-easingcubic-bezier(0.4, 0, 0.2, 1)Helpotustoiminto
--vt-slide-down-distance30%Liukumatka
MuuttujaOletusKuvaus
--vt-zoom-duration200msAnimaation kesto
--vt-zoom-easingcubic-bezier(0.4, 0, 0.2, 1)Helpotustoiminto
--vt-zoom-scale0.8Skaalakerroin (vanha zoomaa tästä, uusi zoomaa tähän)
MuuttujaOletusKuvaus
--vt-zoom-out-duration200msAnimaation kesto
--vt-zoom-out-easingcubic-bezier(0.4, 0, 0.2, 1)Helpotustoiminto
--vt-zoom-out-scale1.2Skaalakerroin (vanha zoomaa tähän, uusi zoomaa tästä)

Mukauttaaksesi, ylikirjoita nämä muuttujat CSS:ssäsi:

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

Edistyksellistä mukautusta varten, kohdenna näkymäsiirtymän pseudo-elementit suoraan:

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

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