LÄs upp smidiga, app-liknande webbupplevelser. Denna omfattande guide utforskar de kraftfulla pseudo-elementen i CSS View Transition för att styla dynamiska sidövergÄngar, med praktiska exempel och bÀsta praxis.
BemÀstra CSS View Transitions: En djupdykning i styling av pseudo-element
I det stĂ€ndigt förĂ€nderliga landskapet av webbutveckling Ă€r strĂ€van efter en sömlös, flytande och engagerande anvĂ€ndarupplevelse en konstant. I Ă„ratal har utvecklare strĂ€vat efter att överbrygga klyftan mellan webben och native-applikationer, sĂ€rskilt nĂ€r det gĂ€ller smidigheten i sidövergĂ„ngar. Traditionell webbnavigering resulterar ofta i en abrupt, helsidesomladdning â en tom vit skĂ€rm som tillfĂ€lligt bryter anvĂ€ndarens immersion. Single-Page Applications (SPA) har mildrat detta, men att skapa anpassade, meningsfulla övergĂ„ngar har förblivit en komplex och ofta skör uppgift, starkt beroende av JavaScript-bibliotek och invecklad tillstĂ„ndshantering.
HÀr kommer CSS View Transitions API, en banbrytande teknologi redo att revolutionera hur vi hanterar UI-förÀndringar pÄ webben. Detta kraftfulla API tillhandahÄller en enkel men otroligt flexibel mekanism för att animera mellan olika DOM-tillstÄnd, vilket gör det enklare Àn nÄgonsin att skapa de polerade, app-liknande upplevelser som anvÀndare har kommit att förvÀnta sig. KÀrnan i detta API:s kraft ligger i en uppsÀttning nya CSS-pseudo-element. Dessa Àr inte dina typiska selektorer; de Àr dynamiska, temporÀra element som genereras av webblÀsaren för att ge dig detaljerad kontroll över varje fas av en övergÄng. Denna guide kommer att ta dig pÄ en djupdykning i detta pseudo-elementtrÀd och utforska hur du stylar varje komponent för att bygga fantastiska, högpresterande och tillgÀngliga animationer för en global publik.
Anatomin av en View Transition
Innan vi kan styla en övergÄng mÄste vi förstÄ vad som hÀnder under huven nÀr en utlöses. NÀr du initierar en view transition (till exempel genom att anropa document.startViewTransition()), utför webblÀsaren en serie steg:
- FÄnga det gamla tillstÄndet: WebblÀsaren tar en "skÀrmdump" av den nuvarande sidans tillstÄnd.
- Uppdatera DOM: Din kod gör sedan sina Àndringar i DOM (t.ex. navigerar till en ny vy, lÀgger till eller tar bort element).
- FÄnga det nya tillstÄndet: NÀr DOM-uppdateringen Àr klar tar webblÀsaren en skÀrmdump av det nya tillstÄndet.
- Bygg pseudo-elementtrÀdet: WebblÀsaren konstruerar sedan ett temporÀrt trÀd av pseudo-element i sidans överlagring. Detta trÀd innehÄller de fÄngade bilderna av de gamla och nya tillstÄnden.
- Animera: CSS-animationer tillÀmpas pÄ dessa pseudo-element, vilket skapar en smidig övergÄng frÄn det gamla tillstÄndet till det nya. Standard Àr en enkel övertoning (cross-fade).
- StÀda upp: NÀr animationerna Àr klara tas pseudo-elementtrÀdet bort, och anvÀndaren kan interagera med det nya, levande DOM.
Nyckeln till anpassning Àr detta temporÀra pseudo-elementtrÀd. TÀnk pÄ det som en uppsÀttning lager i ett designverktyg, tillfÀlligt placerade ovanpÄ din sida. Du har fullstÀndig CSS-kontroll över dessa lager. HÀr Àr strukturen du kommer att arbeta med:
- ::view-transition
- ::view-transition-group(*)
- ::view-transition-image-pair(*)
- ::view-transition-old(*)
- ::view-transition-new(*)
- ::view-transition-image-pair(*)
- ::view-transition-group(*)
LÄt oss gÄ igenom vad vart och ett av dessa pseudo-element representerar.
En genomgÄng av pseudo-elementen
::view-transition: Detta Àr roten till hela strukturen. Det Àr ett enda element som fyller visningsomrÄdet (viewport) och ligger ovanpÄ allt annat innehÄll pÄ sidan. Det fungerar som behÄllare för alla övergÄngsgrupper och Àr en utmÀrkt plats att stÀlla in övergripande övergÄngsegenskaper som varaktighet eller tidsfunktion.
::view-transition-group(*): För varje distinkt övergÄngselement (identifierat av CSS-egenskapen view-transition-name) skapas en grupp. Detta pseudo-element ansvarar för att animera position och storlek pÄ sitt innehÄll. Om du har ett kort som flyttas frÄn en sida av skÀrmen till en annan, Àr det ::view-transition-group som faktiskt flyttas.
::view-transition-image-pair(*): InbÀddat inuti gruppen fungerar detta element som en behÄllare och en klippmask (clipping mask) för de gamla och nya vyerna. Dess primÀra roll Àr att bibehÄlla effekter som border-radius eller transform under animationen och att hantera standardövergÄngen med övertoning.
::view-transition-old(*): Detta representerar "skÀrmdumpen" eller den renderade vyn av elementet i sitt gamla tillstÄnd (före DOM-Àndringen). Som standard animeras det frÄn opacity: 1 till opacity: 0.
::view-transition-new(*): Detta representerar "skÀrmdumpen" eller den renderade vyn av elementet i sitt nya tillstÄnd (efter DOM-Àndringen). Som standard animeras det frÄn opacity: 0 till opacity: 1.
Roten: Att styla pseudo-elementet ::view-transition
Pseudo-elementet ::view-transition Àr duken pÄ vilken hela din animation mÄlas. Som den översta behÄllaren Àr det den idealiska platsen att definiera egenskaper som ska gÀlla globalt för övergÄngen. Som standard tillhandahÄller webblÀsaren en uppsÀttning animationer, men du kan enkelt ÄsidosÀtta dem.
Till exempel Àr standardövergÄngen en övertoning som varar 250 millisekunder. Om du vill Àndra detta för varje övergÄng pÄ din webbplats kan du rikta in dig pÄ rot-pseudo-elementet:
::view-transition {
animation-duration: 500ms;
animation-timing-function: ease-in-out;
}
Denna enkla regel gör nu att alla standardövergĂ„ngar pĂ„ sidan tar dubbelt sĂ„ lĂ„ng tid och anvĂ€nder en 'ease-in-out'-kurva, vilket ger dem en nĂ„got annorlunda kĂ€nsla. Ăven om du kan tillĂ€mpa komplexa animationer hĂ€r, Ă€r det generellt bĂ€st att anvĂ€nda det för att definiera universell timing och easing, och lĂ„ta de mer specifika pseudo-elementen hantera den detaljerade koreografin.
Gruppering och namngivning: Kraften i `view-transition-name`
Utan extra arbete ger View Transition API en övertoning för hela sidan. Detta hanteras av en enda pseudo-elementgrupp för roten. API:ets verkliga kraft lÄses upp nÀr du vill göra övergÄngar för specifika, enskilda element mellan tillstÄnd. Till exempel att fÄ en produktminiatyr pÄ en listsida att sömlöst vÀxa och flytta sig till huvudproduktbildens position pÄ en detaljsida.
För att berÀtta för webblÀsaren att tvÄ element över olika DOM-tillstÄnd Àr konceptuellt desamma, anvÀnder du CSS-egenskapen view-transition-name. Denna egenskap mÄste tillÀmpas pÄ bÄde startelementet och slutelementet.
/* I CSS för listsidan */
.product-thumbnail {
view-transition-name: product-image;
}
/* I CSS för detaljsidan */
.main-product-image {
view-transition-name: product-image;
}
Genom att ge bÄda elementen samma unika namn ('product-image' i det hÀr fallet), instruerar du webblÀsaren: "IstÀllet för att bara tona ut den gamla sidan och tona in den nya, skapa en speciell övergÄng för just detta element." WebblÀsaren kommer nu att generera en dedikerad ::view-transition-group(product-image) för att hantera dess animation separat frÄn rot-övergÄngen. Detta Àr det grundlÀggande konceptet som möjliggör den populÀra "morfande" eller "shared element"-övergÄngseffekten.
Viktig anmÀrkning: För varje givet ögonblick under en övergÄng mÄste ett view-transition-name vara unikt. Du kan inte ha tvÄ synliga element med samma namn samtidigt.
DjupgÄende styling: KÀrn-pseudo-elementen
Med vÄra element namngivna kan vi nu dyka in i att styla de specifika pseudo-element som webblÀsaren genererar för dem. Det Àr hÀr du kan skapa verkligt anpassade och uttrycksfulla animationer.
`::view-transition-group(name)`: Förflyttaren
Gruppens enda ansvar Àr att övergÄ frÄn det gamla elementets storlek och position till det nya elementets storlek och position. Den innehÄller inte det faktiska innehÄllets utseende, bara dess avgrÀnsningsruta. TÀnk pÄ det som en rörlig ram.
Som standard animerar webblÀsaren dess transform- och width/height-egenskaper. Du kan ÄsidosÀtta detta för att skapa olika effekter. Till exempel kan du lÀgga till en bÄge i dess rörelse genom att animera den lÀngs en böjd bana, eller fÄ den att skala upp och ner under sin resa.
::view-transition-group(product-image) {
animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
}
I detta exempel tillÀmpar vi en specifik easing-funktion bara pÄ produktbildens rörelse, vilket gör att den kÀnns mer dynamisk och fysisk, utan att pÄverka standardövergÄngen för resten av sidan.
`::view-transition-image-pair(name)`: Klipparen och tonaren
InbÀddat i den rörliga gruppen hÄller bildparet (image-pair) de gamla och nya vyerna. Det fungerar som en klippmask, sÄ om ditt element har en border-radius, ser bildparet till att innehÄllet förblir klippt med den radien under hela storleks- och positionsanimationen. Dess andra huvudsakliga uppgift Àr att orkestrera standardövergÄngen mellan det gamla och nya innehÄllet.
Du kanske vill styla detta element för att sÀkerstÀlla visuell konsistens eller för att skapa mer avancerade effekter. En viktig egenskap att övervÀga Àr isolation: isolate. Detta Àr avgörande om du planerar att anvÀnda avancerade mix-blend-mode-effekter pÄ barnen (gamla och nya), eftersom det skapar en ny staplingskontext och förhindrar att blandningen pÄverkar element utanför övergÄngsgruppen.
::view-transition-image-pair(product-image) {
isolation: isolate;
}
`::view-transition-old(name)` och `::view-transition-new(name)`: StjÀrnorna i showen
Dessa Àr de pseudo-element som representerar det visuella utseendet pÄ ditt element före och efter DOM-Àndringen. Det Àr hÀr det mesta av ditt anpassade animationsarbete kommer att ske. Som standard kör webblÀsaren en enkel övertoningsanimation pÄ dem med hjÀlp av opacity och mix-blend-mode. För att skapa en anpassad animation mÄste du först stÀnga av standardanimationen.
::view-transition-old(name),
::view-transition-new(name) {
animation: none;
}
NÀr standardanimationen Àr inaktiverad Àr du fri att tillÀmpa din egen. LÄt oss utforska nÄgra vanliga mönster.
Anpassad animation: Glidning (Slide)
IstÀllet för en övertoning, lÄt oss fÄ innehÄllet i en behÄllare att glida in. Till exempel, nÀr vi navigerar mellan artiklar, vill vi att den nya artikelns text ska glida in frÄn höger medan den gamla texten glider ut till vÀnster.
Först, definiera 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%); }
}
TillÀmpa nu dessa animationer pÄ de gamla och nya pseudo-elementen för det namngivna 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;
}
Anpassad animation: 3D-vÀndning (Flip)
För en mer dramatisk effekt kan du skapa en 3D-kortvÀndning. Detta krÀver animering av transform-egenskapen med rotateY och Àven hantering av backface-visibility.
/* Gruppen behöver en 3D-kontext */
::view-transition-group(card-flipper) {
transform-style: preserve-3d;
}
/* Ăven bildparet behöver bevara 3D-kontexten */
::view-transition-image-pair(card-flipper) {
transform-style: preserve-3d;
}
/* Den gamla vyn vÀnds frÄn 0 till -180 grader */
::view-transition-old(card-flipper) {
animation: 600ms ease-in forwards flip-out;
backface-visibility: hidden;
}
/* Den nya vyn vÀnds frÄn 180 till 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); }
}
Praktiska exempel och avancerade tekniker
Teori Àr anvÀndbart, men det Àr genom praktisk tillÀmpning vi verkligen lÀr oss. LÄt oss gÄ igenom nÄgra vanliga scenarier och hur man löser dem med view transition-pseudo-element.
Exempel: Den "morfande" kortminiatyren
Detta Àr den klassiska "shared element"-övergÄngen. FörestÀll dig ett galleri med anvÀndarprofiler. Varje profil Àr ett kort med en avatar. NÀr du klickar pÄ ett kort navigerar du till en detaljsida dÀr samma avatar visas framtrÀdande högst upp.
Steg 1: Tilldela namn
PÄ din gallerisida fÄr avatarbilden ett namn. Namnet bör vara unikt för varje kort, till exempel baserat pÄ anvÀndarens ID.
/* I gallery-item.css */
.card-avatar { view-transition-name: avatar-user-123; }
PÄ profildetaljsidan fÄr den stora headern-avataren exakt samma namn.
/* I profile-page.css */
.profile-header-avatar { view-transition-name: avatar-user-123; }
Steg 2: Anpassa animationen
Som standard kommer webblÀsaren att flytta och skala avataren, men den kommer ocksÄ att tona över innehÄllet. Om bilden Àr identisk Àr denna toning onödig och kan orsaka ett lÀtt flimmer. Vi kan inaktivera den.
/* StjÀrnan (*) hÀr Àr en jokertecken för alla namngivna grupper */
::view-transition-image-pair(*) {
/* Inaktivera standardtoningen */
animation-duration: 0s;
}
VÀnta, om vi inaktiverar toningen, hur byts innehÄllet? För delade element dÀr de gamla och nya vyerna Àr identiska, Àr webblÀsaren smart nog att anvÀnda bara en vy för hela övergÄngen. `image-pair` hÄller i huvudsak bara en bild, sÄ att inaktivera toningen avslöjar helt enkelt denna optimering. För element dÀr innehÄllet faktiskt Àndras skulle du behöva en anpassad animation istÀllet för standardtoningen.
Hantering av Àndrade bildförhÄllanden
En vanlig utmaning uppstÄr nÀr ett övergÄngselement Àndrar sitt bildförhÄllande. Till exempel kan en 16:9-landskapsminiatyr pÄ en listsida övergÄ till en 1:1-kvadratisk avatar pÄ detaljsidan. WebblÀsarens standardbeteende Àr att animera bredd och höjd oberoende av varandra, vilket resulterar i att bilden ser hopklÀmd eller utstrÀckt ut under övergÄngen.
Lösningen Àr elegant. Vi lÄter ::view-transition-group hantera storleks- och positionsÀndringen, men vi ÄsidosÀtter stylingen av de gamla och nya bilderna inuti den.
MÄlet Àr att fÄ de gamla och nya "skÀrmdumparna" att fylla sin behÄllare utan att förvrÀngas. Vi kan göra detta genom att stÀlla in deras bredd och höjd till 100% och lÄta webblÀsarens standardegenskap object-fit (som Àrvs frÄn det ursprungliga elementet) hantera skalningen korrekt.
::view-transition-old(hero-image),
::view-transition-new(hero-image) {
/* Förhindra förvrÀngning genom att fylla behÄllaren */
width: 100%;
height: 100%;
/* à sidosÀtt standardövergÄngen för att se effekten tydligt */
animation: none;
}
Med denna CSS kommer `image-pair` att smidigt animera sitt bildförhÄllande, och bilderna inuti kommer att beskÀras eller fÄ svarta kanter korrekt (beroende pÄ deras `object-fit`-vÀrde), precis som de skulle i en vanlig behÄllare. Du kan sedan lÀgga till dina egna anpassade animationer, som en övertoning, ovanpÄ denna korrigerade geometri.
Felsökning och webblÀsarstöd
Att styla element som bara existerar under en brÄkdel av en sekund kan vara knepigt. Lyckligtvis tillhandahÄller moderna webblÀsare utmÀrkta utvecklarverktyg för detta. I Chrome eller Edge DevTools kan du gÄ till panelen "Animations", och nÀr du utlöser en view transition kan du pausa den. Med animationen pausad kan du sedan anvÀnda panelen "Elements" för att inspektera hela `::view-transition`-pseudo-elementtrÀdet precis som vilken annan del av DOM som helst. Du kan se stilarna som tillÀmpas och till och med Àndra dem i realtid för att finslipa dina animationer.
I slutet av 2023 stöds View Transitions API i Chromium-baserade webblÀsare (Chrome, Edge, Opera). Implementeringar pÄgÄr för Firefox och Safari. Detta gör det till en perfekt kandidat för progressiv förbÀttring. AnvÀndare med webblÀsare som stöds fÄr en hÀrlig, förbÀttrad upplevelse, medan anvÀndare pÄ andra webblÀsare fÄr standard, omedelbar navigering. Du kan kontrollera för stöd i CSS:
@supports (view-transition: none) {
/* Alla view-transition-stilar hamnar hÀr */
::view-transition-old(my-element) { ... }
}
BÀsta praxis för en global publik
NÀr man implementerar animationer Àr det avgörande att ta hÀnsyn till den mÄngfald av anvÀndare och enheter som finns vÀrlden över.
Prestanda: Animationer ska vara snabba och flytande. HÄll dig till att animera CSS-egenskaper som Àr billiga för webblÀsaren att bearbeta, frÀmst transform och opacity. Att animera egenskaper som width, height eller margin kan utlösa omberÀkningar av layouten pÄ varje bildruta, vilket leder till hackande och en dÄlig upplevelse, sÀrskilt pÄ mindre kraftfulla enheter.
TillgÀnglighet: Vissa anvÀndare upplever Äksjuka eller obehag av animationer. Alla större operativsystem erbjuder en anvÀndarinstÀllning för att minska rörelse. Vi mÄste respektera detta. MediefrÄgan prefers-reduced-motion lÄter dig inaktivera eller förenkla dina animationer för dessa anvÀndare.
@media (prefers-reduced-motion: reduce) {
::view-transition-group(*),
::view-transition-old(*),
::view-transition-new(*) {
/* Hoppa över alla anpassade animationer och anvÀnd en snabb, enkel toning */
animation: none !important;
}
}
AnvÀndarupplevelse (UX): Bra övergÄngar Àr meningsfulla. De ska guida anvÀndarens uppmÀrksamhet och ge kontext om den förÀndring som sker i grÀnssnittet. En animation som Àr för lÄngsam kan fÄ en applikation att kÀnnas trög, medan en som Àr för prÄlig kan vara distraherande. Sikta pÄ övergÄngstider mellan 200 ms och 500 ms. MÄlet Àr att animationen ska kÀnnas mer Àn den ses.
Slutsats: Framtiden Àr flytande
CSS View Transitions API, och specifikt dess kraftfulla pseudo-elementtrÀd, representerar ett monumentalt kliv framÄt för webbens anvÀndargrÀnssnitt. Det ger utvecklare en native, högpresterande och mycket anpassningsbar verktygslÄda för att skapa den typ av flytande, tillstÄndsbaserade övergÄngar som en gÄng var exklusiva för native-applikationer. Genom att förstÄ rollerna för ::view-transition, ::view-transition-group och old/new-bildparen kan du gÄ bortom enkla övertoningar och koreografera invecklade, meningsfulla animationer som förbÀttrar anvÀndbarheten och glÀdjer anvÀndarna.
NÀr webblÀsarstödet expanderar kommer detta API att bli en vÀsentlig del av den moderna frontend-utvecklarens verktygslÄda. Genom att omfamna dess kapabiliteter och följa bÀsta praxis för prestanda och tillgÀnglighet kan vi bygga en webb som inte bara Àr mer funktionell, utan ocksÄ vackrare och mer intuitiv för alla, överallt.