LÄs opp flytende, app-lignende nettopplevelser. LÊr Ä style dynamiske sideoverganger med CSS View Transition pseudo-elementer via eksempler og beste praksis.
Mestre CSS View Transitions: En dybdeanalyse av styling med pseudo-elementer
I det stadig utviklende landskapet for webutvikling er jakten pĂ„ en sĂžmlĂžs, flytende og engasjerende brukeropplevelse en konstant. I Ă„revis har utviklere strebet etter Ă„ bygge bro over gapet mellom web og native applikasjoner, spesielt nĂ„r det gjelder jevne sideoverganger. Tradisjonell webnavigasjon resulterer ofte i en brĂ„, fullstendig sideinnlasting â en blank hvit skjerm som midlertidig bryter brukerens innlevelse. Enkelsideapplikasjoner (SPA-er) har dempet dette, men Ă„ skape tilpassede, meningsfulle overganger har forblitt en kompleks og ofte skjĂžr oppgave, sterkt avhengig av JavaScript-biblioteker og intrikat tilstandshĂ„ndtering.
Her kommer CSS View Transitions API, en banebrytende teknologi som er klar til Ä revolusjonere hvordan vi hÄndterer UI-endringer pÄ nettet. Dette kraftige API-et gir en enkel, men utrolig fleksibel mekanisme for Ä animere mellom ulike DOM-tilstander, noe som gjÞr det enklere enn noensinne Ä skape de polerte, app-lignende opplevelsene brukere har kommet til Ä forvente. Kjernen i dette API-ets kraft ligger et sett med nye CSS pseudo-elementer. Disse er ikke dine typiske selektorer; de er dynamiske, midlertidige elementer generert av nettleseren for Ä gi deg detaljert kontroll over hver fase av en overgang. Denne guiden vil ta deg med pÄ en dybdeanalyse av dette pseudo-elementtreet, og utforske hvordan du kan style hver komponent for Ä bygge fantastiske, ytelseseffektive og tilgjengelige animasjoner for et globalt publikum.
Anatomien til en View Transition
FÞr vi kan style en overgang, mÄ vi forstÄ hva som skjer under panseret nÄr en utlÞses. NÄr du starter en view transition (for eksempel ved Ä kalle document.startViewTransition()), utfÞrer nettleseren en rekke trinn:
- Fange gammel tilstand: Nettleseren tar et "skjermbilde" av sidens nÄvÊrende tilstand.
- Oppdatere DOM: Koden din gjĂžr deretter endringene i DOM (f.eks. navigerer til en ny visning, legger til eller fjerner elementer).
- Fange ny tilstand: NÄr DOM-oppdateringen er fullfÞrt, tar nettleseren et skjermbilde av den nye tilstanden.
- Bygge pseudo-elementtreet: Nettleseren konstruerer deretter et midlertidig tre av pseudo-elementer i sidens overlegg. Dette treet inneholder de fangede bildene av den gamle og nye tilstanden.
- Animere: CSS-animasjoner brukes pÄ disse pseudo-elementene, noe som skaper en jevn overgang fra den gamle tilstanden til den nye. Standarden er en enkel krysstoning (cross-fade).
- Opprydding: NÄr animasjonene er fullfÞrt, fjernes pseudo-elementtreet, og brukeren kan samhandle med den nye, levende DOM-en.
NÞkkelen til tilpasning er dette midlertidige pseudo-elementtreet. Tenk pÄ det som et sett med lag i et designverktÞy, midlertidig plassert pÄ toppen av siden din. Du har fullstendig CSS-kontroll over disse lagene. Her er strukturen du vil jobbe med:
- ::view-transition
- ::view-transition-group(*)
- ::view-transition-image-pair(*)
- ::view-transition-old(*)
- ::view-transition-new(*)
- ::view-transition-image-pair(*)
- ::view-transition-group(*)
La oss bryte ned hva hvert av disse pseudo-elementene representerer.
Rollesettet av pseudo-elementer
::view-transition: Dette er roten til hele strukturen. Det er et enkelt element som fyller visningsporten og ligger over alt annet sideinnhold. Det fungerer som beholderen for alle overgangsgrupper og er et flott sted Ă„ sette overordnede overgangsegenskaper som varighet eller tidsfunksjon.
::view-transition-group(*): For hvert distinkte overgangselement (identifisert med CSS-egenskapen view-transition-name) opprettes en gruppe. Dette pseudo-elementet er ansvarlig for Ä animere posisjonen og stÞrrelsen pÄ innholdet sitt. Hvis du har et kort som beveger seg fra den ene siden av skjermen til den andre, er det ::view-transition-group som faktisk beveger seg.
::view-transition-image-pair(*): Plassert inne i gruppen, fungerer dette elementet som en beholder og en klippemaske for den gamle og nye visningen. Hovedrollen er Ä opprettholde effekter som border-radius eller transform under animasjonen og Ä hÄndtere den standard krysstoningsanimasjonen.
::view-transition-old(*): Dette representerer "skjermbildet" eller den gjengitte visningen av elementet i sin gamle tilstand (fĂžr DOM-endringen). Som standard animeres det fra opacity: 1 til opacity: 0.
::view-transition-new(*): Dette representerer "skjermbildet" eller den gjengitte visningen av elementet i sin nye tilstand (etter DOM-endringen). Som standard animeres det fra opacity: 0 til opacity: 1.
Roten: Styling av ::view-transition pseudo-elementet
Pseudo-elementet ::view-transition er lerretet som hele animasjonen din males pÄ. Som den Þverste beholderen er det det ideelle stedet Ä definere egenskaper som skal gjelde globalt for overgangen. Som standard tilbyr nettleseren et sett med animasjoner, men du kan enkelt overstyre dem.
For eksempel er standardovergangen en krysstoning som varer i 250 millisekunder. Hvis du vil endre dette for hver overgang pÄ nettstedet ditt, kan du mÄlrette rot-pseudo-elementet:
::view-transition {
animation-duration: 500ms;
animation-timing-function: ease-in-out;
}
Denne enkle regelen gjÞr nÄ at alle standard sideoverganger tar dobbelt sÄ lang tid og bruker en 'ease-in-out'-kurve, noe som gir dem en litt annerledes fÞlelse. Selv om du kan bruke komplekse animasjoner her, er det generelt best brukt til Ä definere universell timing og easing, og la de mer spesifikke pseudo-elementene hÄndtere den detaljerte koreografien.
Gruppering og navngiving: Kraften i `view-transition-name`
Rett ut av boksen, uten ekstra arbeid, gir View Transition API en krysstoning for hele siden. Dette hÄndteres av en enkelt pseudo-elementgruppe for roten. Den virkelige kraften i API-et lÄses opp nÄr du vil lage overganger for spesifikke, individuelle elementer mellom tilstander. For eksempel, Ä fÄ et produktminiatyrbilde pÄ en listeside til Ä sÞmlÞst vokse og flytte seg inn i hovedproduktbildets posisjon pÄ en detaljside.
For Ä fortelle nettleseren at to elementer pÄ tvers av forskjellige DOM-tilstander er konseptuelt det samme, bruker du CSS-egenskapen view-transition-name. Denne egenskapen mÄ brukes pÄ bÄde startelementet og sluttelementet.
/* PĂ„ listesidens CSS */
.product-thumbnail {
view-transition-name: product-image;
}
/* PĂ„ detaljsidens CSS */
.main-product-image {
view-transition-name: product-image;
}
Ved Ä gi begge elementene det samme unike navnet ('product-image' i dette tilfellet), instruerer du nettleseren: "I stedet for Ä bare tone ut den gamle siden og tone inn den nye, lag en spesiell overgang for dette spesifikke elementet." Nettleseren vil nÄ generere en dedikert ::view-transition-group(product-image) for Ä hÄndtere animasjonen separat fra rot-toningen. Dette er det grunnleggende konseptet som muliggjÞr den populÊre "morphing" eller "delt element"-overgangseffekten.
Viktig merknad: For et gitt Þyeblikk under en overgang, mÄ et view-transition-name vÊre unikt. Du kan ikke ha to synlige elementer med samme navn samtidig.
Dybdestyling: Kjerne-pseudo-elementene
Med elementene vÄre navngitt, kan vi nÄ dykke ned i stylingen av de spesifikke pseudo-elementene som nettleseren genererer for dem. Det er her du kan skape virkelig tilpassede og uttrykksfulle animasjoner.
`::view-transition-group(name)`: Bevegeren
Gruppens eneste ansvar er Ä gÄ over fra det gamle elementets stÞrrelse og posisjon til det nye elementets stÞrrelse og posisjon. Den inneholder ikke det faktiske innholdets utseende, bare dets begrensningsboks. Tenk pÄ det som en bevegelig ramme.
Som standard animerer nettleseren dens transform- og width/height-egenskaper. Du kan overstyre dette for Ä skape forskjellige effekter. For eksempel kan du legge til en bue i bevegelsen ved Ä animere den langs en buet bane, eller fÄ den til Ä skalere opp og ned pÄ reisen.
::view-transition-group(product-image) {
animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
}
I dette eksemplet bruker vi en spesifikk easing-funksjon kun pÄ bevegelsen til produktbildet, noe som gjÞr at det fÞles mer dynamisk og fysisk, uten Ä pÄvirke den standard toningen av resten av siden.
`::view-transition-image-pair(name)`: Klipperen og toneren
Plassert inne i den bevegelige gruppen, holder image-pair den gamle og nye visningen. Den fungerer som en klippemaske, sÄ hvis elementet ditt har en border-radius, sikrer image-pair at innholdet forblir klippet med den radien gjennom hele stÞrrelses- og posisjonsanimasjonen. Den andre hovedjobben er Ä orkestrere den standard krysstoningen mellom det gamle og nye innholdet.
Du vil kanskje style dette elementet for Ä sikre visuell konsistens eller for Ä skape mer avanserte effekter. En nÞkkelegenskap Ä vurdere er isolation: isolate. Dette er avgjÞrende hvis du planlegger Ä bruke avanserte mix-blend-mode-effekter pÄ barna (gammelt og nytt), da det skaper en ny stabelkontekst og forhindrer at blandingen pÄvirker elementer utenfor overgangsgruppen.
::view-transition-image-pair(product-image) {
isolation: isolate;
}
`::view-transition-old(name)` og `::view-transition-new(name)`: Showets stjerner
Dette er pseudo-elementene som representerer det visuelle utseendet til elementet ditt fÞr og etter DOM-endringen. Det er her det meste av ditt tilpassede animasjonsarbeid vil skje. Som standard kjÞrer nettleseren en enkel krysstoningsanimasjon pÄ dem ved hjelp av opacity og mix-blend-mode. For Ä lage en tilpasset animasjon, mÄ du fÞrst slÄ av den standard.
::view-transition-old(name),
::view-transition-new(name) {
animation: none;
}
NÄr standardanimasjonen er deaktivert, stÄr du fritt til Ä bruke din egen. La oss utforske noen vanlige mÞnstre.
Tilpasset animasjon: Slide
I stedet for en krysstoning, la oss fÄ innholdet i en beholder til Ä gli inn. For eksempel, nÄr vi navigerer mellom artikler, vil vi at den nye artikkelens tekst skal gli inn fra hÞyre mens den gamle teksten glir ut til venstre.
FĂžrst, definer keyframes:
@keyframes slide-from-right {
from { transform: translateX(100%); }
to { transform: translateX(0); }
}
@keyframes slide-to-left {
from { transform: translateX(0); }
to { transform: translateX(-100%); }
}
Bruk nÄ disse animasjonene pÄ de gamle og nye pseudo-elementene for det navngitte elementet 'article-content'.
::view-transition-old(article-content) {
animation: 300ms ease-out forwards slide-to-left;
}
::view-transition-new(article-content) {
animation: 300ms ease-out forwards slide-from-right;
}
Tilpasset animasjon: 3D-flipp
For en mer dramatisk effekt kan du lage en 3D-kortflipp. Dette krever animering av transform-egenskapen med rotateY og ogsÄ hÄndtering av backface-visibility.
/* Gruppen trenger en 3D-kontekst */
::view-transition-group(card-flipper) {
transform-style: preserve-3d;
}
/* Image-pair mÄ ogsÄ bevare 3D-konteksten */
::view-transition-image-pair(card-flipper) {
transform-style: preserve-3d;
}
/* Den gamle visningen flipper fra 0 til -180 grader */
::view-transition-old(card-flipper) {
animation: 600ms ease-in forwards flip-out;
backface-visibility: hidden;
}
/* Den nye visningen flipper fra 180 til 0 grader */
::view-transition-new(card-flipper) {
animation: 600ms ease-out forwards flip-in;
backface-visibility: hidden;
}
@keyframes flip-out {
from { transform: rotateY(0deg); }
to { transform: rotateY(-180deg); }
}
@keyframes flip-in {
from { transform: rotateY(180deg); }
to { transform: rotateY(0deg); }
}
Praktiske eksempler og avanserte teknikker
Teori er nyttig, men det er gjennom praktisk anvendelse vi virkelig lÊrer. La oss gÄ gjennom noen vanlige scenarier og hvordan vi kan lÞse dem med view transition pseudo-elementer.
Eksempel: Det "morfende" kortminiatyrbildet
Dette er den klassiske overgangen med delt element. Se for deg et galleri med brukerprofiler. Hver profil er et kort med en avatar. NÄr du klikker pÄ et kort, navigerer du til en detaljside der den samme avataren vises fremtredende Þverst.
Steg 1: Tildel navn
PÄ gallerisiden din fÄr avatarbildet et navn. Navnet bÞr vÊre unikt for hvert kort, for eksempel basert pÄ brukerens ID.
/* I gallery-item.css */
.card-avatar { view-transition-name: avatar-user-123; }
PÄ profildetaljsiden fÄr den store header-avataren nÞyaktig samme navn.
/* I profile-page.css */
.profile-header-avatar { view-transition-name: avatar-user-123; }
Steg 2: Tilpass animasjonen
Som standard vil nettleseren flytte og skalere avataren, men den vil ogsÄ krysstone innholdet. Hvis bildet er identisk, er denne toningen unÞdvendig og kan forÄrsake et lett flimmer. Vi kan deaktivere den.
/* Stjernen (*) her er en joker for enhver navngitt gruppe */
::view-transition-image-pair(*) {
/* Deaktiver standardtoningen */
animation-duration: 0s;
}
Vent, hvis vi deaktiverer toningen, hvordan bytter innholdet? For delte elementer der den gamle og nye visningen er identiske, er nettleseren smart nok til Ä bruke bare én visning for hele overgangen. `image-pair` holder i hovedsak bare ett bilde, sÄ Ä deaktivere toningen avslÞrer bare denne optimaliseringen. For elementer der innholdet faktisk endres, trenger du en tilpasset animasjon i stedet for standardtoningen.
HÄndtering av endringer i sideforhold
En vanlig utfordring oppstÄr nÄr et element i overgang endrer sideforhold. For eksempel kan et 16:9 landskapsminiatyrbilde pÄ en listeside gÄ over til en 1:1 kvadratisk avatar pÄ detaljsiden. Nettleserens standardoppfÞrsel er Ä animere bredde og hÞyde uavhengig, noe som resulterer i at bildet ser klemt sammen eller strukket ut under overgangen.
LÞsningen er elegant. Vi lar ::view-transition-group hÄndtere stÞrrelses- og posisjonsendringen, men vi overstyrer stylingen av de gamle og nye bildene inni den.
MÄlet er Ä fÄ de gamle og nye "skjermbildene" til Ä fylle beholderen sin uten Ä forvrenge. Vi kan gjÞre dette ved Ä sette bredden og hÞyden deres til 100% og la nettleserens standard object-fit-egenskap (som arves fra det opprinnelige elementet) hÄndtere skaleringen korrekt.
::view-transition-old(hero-image),
::view-transition-new(hero-image) {
/* Forhindre forvrengning ved Ă„ fylle beholderen */
width: 100%;
height: 100%;
/* Overstyr standard krysstoning for Ă„ se effekten tydelig */
animation: none;
}
Med denne CSS-en vil `image-pair` jevnt animere sideforholdet sitt, og bildene inni vil bli korrekt beskÄret eller fÄ "letterboxing" (avhengig av deres `object-fit`-verdi), akkurat som de ville gjort i en vanlig beholder. Du kan deretter legge til dine egne tilpassede animasjoner, som en krysstoning, oppÄ denne korrigerte geometrien.
Debugging og nettleserstĂžtte
à style elementer som bare eksisterer i en brÞkdel av et sekund kan vÊre vanskelig. Heldigvis gir moderne nettlesere utmerkede utviklerverktÞy for dette. I Chrome eller Edge DevTools kan du gÄ til "Animations"-panelet, og nÄr du utlÞser en view transition, kan du pause den. Med animasjonen pauset, kan du deretter bruke "Elements"-panelet til Ä inspisere hele `::view-transition` pseudo-elementtreet akkurat som enhver annen del av DOM. Du kan se stilene som brukes og til og med endre dem i sanntid for Ä perfeksjonere animasjonene dine.
Per sent 2023 er View Transitions API stÞttet i Chromium-baserte nettlesere (Chrome, Edge, Opera). Implementeringer er i gang for Firefox og Safari. Dette gjÞr det til en perfekt kandidat for progressiv forbedring. Brukere med stÞttede nettlesere fÄr en herlig, forbedret opplevelse, mens brukere pÄ andre nettlesere fÄr den standard, umiddelbare navigasjonen. Du kan sjekke for stÞtte i CSS:
@supports (view-transition: none) {
/* Alle view-transition-stiler gÄr her */
::view-transition-old(my-element) { ... }
}
Beste praksis for et globalt publikum
NÄr man implementerer animasjoner, er det avgjÞrende Ä ta hensyn til det mangfoldige spekteret av brukere og enheter over hele verden.
Ytelse: Animasjoner bÞr vÊre raske og flytende. Hold deg til Ä animere CSS-egenskaper som er billige for nettleseren Ä behandle, primÊrt transform og opacity. à animere egenskaper som width, height eller margin kan utlÞse layout-rekalkuleringer pÄ hver ramme, noe som fÞrer til hakking og en dÄrlig opplevelse, spesielt pÄ mindre kraftige enheter.
Tilgjengelighet: Noen brukere opplever reisesyke eller ubehag fra animasjoner. Alle store operativsystemer tilbyr en brukerpreferanse for Ä redusere bevegelse. Vi mÄ respektere dette. MediespÞrringen prefers-reduced-motion lar deg deaktivere eller forenkle animasjonene dine for disse brukerne.
@media (prefers-reduced-motion: reduce) {
::view-transition-group(*),
::view-transition-old(*),
::view-transition-new(*) {
/* Hopp over alle tilpassede animasjoner og bruk en rask, enkel toning */
animation: none !important;
}
}
Brukeropplevelse (UX): Gode overganger er formÄlsrettede. De skal veilede brukerens oppmerksomhet og gi kontekst om endringen som skjer i brukergrensesnittet. En animasjon som er for treg kan fÄ en applikasjon til Ä fÞles treg, mens en som er for prangende kan vÊre distraherende. Sikt pÄ overgangsvarigheter mellom 200ms og 500ms. MÄlet er at animasjonen skal fÞles mer enn den sees.
Konklusjon: Fremtiden er flytende
CSS View Transitions API, og spesifikt dets kraftige pseudo-elementtre, representerer et monumentalt sprang fremover for web-brukergrensesnitt. Det gir utviklere et native, ytelseseffektivt og hÞyt tilpassbart verktÞysett for Ä skape den typen flytende, tilstandsbevisste overganger som en gang var eksklusivt for native applikasjoner. Ved Ä forstÄ rollene til ::view-transition, ::view-transition-group, og old/new image-parene, kan du bevege deg utover enkle toninger og koreografere intrikate, meningsfulle animasjoner som forbedrer brukervennligheten og gleder brukerne.
Ettersom nettleserstÞtten utvides, vil dette API-et bli en essensiell del av den moderne front-end-utviklerens verktÞykasse. Ved Ä omfavne dets kapabiliteter og fÞlge beste praksis for ytelse og tilgjengelighet, kan vi bygge et web som ikke bare er mer funksjonelt, men ogsÄ vakrere og mer intuitivt for alle, overalt.