Parenteser

Betraktninger fra Mat-teamets grønne enger

Å animere transisjoner mellom statiske sider

View transition teaser

I etterkant av JavaZone så jeg en lightning-talk om nye features i CSS. Det var særlig én av dem som fanget oppmerksomheten min, nemlig View Transitions (starter 9:03 i videoen).

Jeg har alltid tenkt det ville vært gøy å legge til animasjoner på en side, men har aldri funnet den rette tiden for å lære hvordan.

Da jeg da så han snakke om å animere side-traverseringer tenkte jeg: “Nå har jeg sjansen! Dette er akkurat noe for bloggen min ✨”.

Så hvor begynner man?

Jo, man legger til disse linjene på toppnivå i CSS-en din:

@view-transition {
  navigation: auto;
}

Bare med disse linjene vil det komme en fading effekt når du går fra én side til en annen – helt automatisk.

Dette er bra, men går det ikke an å gjøre det enda finere?

Jo da, det går an 😄. Da har vi nemlig view-transition-name, som vi kan putte på enkelte elementer for å spice dem opp litt når vi innleser den neste siden.

Om jeg f.eks. lager en klasse med view-transition-name:

.logo-transition {
  view-transition-name: logo;
}

og sørger for å legge til klassen på logoen på forsiden og blogg-post-sidene, da får vi en veldig fin glidende overgang rett ut av boksen. Prøv selv ved å gå frem og tilbake mellom forsiden og en bloggpost på bloggen min Mathive Thoughts (du kan trykke på ikonet øverst for å komme til forsiden)

Dette var enkelt! Med bare to enkle tillegg gjør nettleseren så utrolig mye for deg. Her en fin transisjon av logoen fra den ene plassen til den andre.

Dette kan vi også legge til her på siden. Ved å legge til klassenavn på bananene i headeren:

.transition-banan-1 {
    view-transition-name: banan-1;
}

.transition-banan-2 {
    view-transition-name: banan-2;
}

og bytter på klassenavnene på bananene om du er på forsiden eller ikke, da med relativt samme kode vil nettleseren selv kalkulere animasjonen og bytte om på bananene når du går mellom sidene. Genialt om du spør meg! 🤩

🚀 Men det kan bli enda finere! 🚀

For å få til noe mer kontrollert og gi deg absolutt frihet, tilbyr de også pseudo-elementene ::view-transition-old og ::view-transition-new. Med disse kan du granulert legge til akkurat den CSS-en som du kan ønske deg. ::view-transition-old bruker du til å animere siden du forlater mens ::view-transition-new animerer siden du ankommer.

Med kodesnutten under får jeg siden til å zoome ut og deretter zoome inn på neste side.

 :root {
   view-transition-name: root;
 }
 
 @keyframes scale-out {
     0% { transform: scale(1); }
     50% { transform: scale(0); }
     100% { transform: scale(0); }
 }
 @keyframes scale-in {
     0% { transform: scale(0); }
     50% { transform: scale(0); }
     100% { transform: scale(1); }
 }
 
 ::view-transition-old(root) {
   animation: 0.4s ease-out both scale-out;
 }
 
 ::view-transition-new(root) {
   animation: 0.4s ease-in both scale-in;
 }

Du kan se resultatet her. Jeg setter view-transition-name:root og definerer mine zoom animasjoner med scale-funksjonen. Disse legger jeg da til på ::view-transition-old og ::view-transtion-new spesifikt målrettet det definerte navnet root (kunne også ha vært en klasse f.eks.).

Med dette er det da elementært å sette opp side-overganger med uante muligheter.

Til sist kan jeg nevne at det også er et View Transition API som man kan bruke i javascript der det er mulig å gjøre enda mer. Det blir litt for mye for denne artiklen å håndtere.

Oppsummering

  • @view-transition setter opp hele greia.
  • view-transition-name spesifiserer hvilket element overgangen skal påvirke.
  • ::view-transition-old kontrollerer overgangen fra den siden du forlater.
  • ::view-transition-new kontrollerer overgangen til den siden du ankommer.

Ting å merke seg

  • Da jeg satt og fiklet med dette merket jeg at overgangene ofte ikke ble vist når jeg hadde devtools oppe.
  • Featuren støttes i de fleste nettlesere, men ikke firefox.
Mathias

Om Animasjon og CSS