StriveLab
Strony internetowe
Usługi
RealizacjeO mnieBlogPorozmawiajmy
PL
EN

Astro

Ultraszybkie projekty, łączące lekkość ze skalowalnością.

Next.js

Elastyczne i wydajne narzędzia dla biznesu, które dotrzymają kroku Twojemu rozwojowi.

React

Połączenie intuicyjności z wydajnością, które zapewnia bezproblemową skalowalność kodu.

SEO & Performance

Audyt techniczny i optymalizacja pod kątem SEO i GEO.

Automatyzacja AI

Bezpieczne automatyzacje procesów i agenci AI w n8n, Make i Claude.

QA & Automation

Testy automatyczne komponentów i E2E w Cypress.

Doradztwo produktowe

Połączenie perspektywy produktu, developera i marketingu w jednym miejscu

StriveLab
Strony internetowe
Usługi
RealizacjeO mnieBlogPorozmawiajmy
PL
EN

Astro

Ultraszybkie projekty, łączące lekkość ze skalowalnością.

Next.js

Elastyczne i wydajne narzędzia dla biznesu, które dotrzymają kroku Twojemu rozwojowi.

React

Połączenie intuicyjności z wydajnością, które zapewnia bezproblemową skalowalność kodu.

SEO & Performance

Audyt techniczny i optymalizacja pod kątem SEO i GEO.

Automatyzacja AI

Bezpieczne automatyzacje procesów i agenci AI w n8n, Make i Claude.

QA & Automation

Testy automatyczne komponentów i E2E w Cypress.

Doradztwo produktowe

Połączenie perspektywy produktu, developera i marketingu w jednym miejscu

Astro

Ultraszybkie projekty, łączące lekkość ze skalowalnością.

Next.js

Elastyczne i wydajne narzędzia dla biznesu, które dotrzymają kroku Twojemu rozwojowi.

React

Połączenie intuicyjności z wydajnością, które zapewnia bezproblemową skalowalność kodu.

SEO & Performance

Audyt techniczny i optymalizacja pod kątem SEO i GEO.

Automatyzacja AI

Bezpieczne automatyzacje procesów i agenci AI w n8n, Make i Claude.

QA & Automation

Testy automatyczne komponentów i E2E w Cypress.

Doradztwo produktowe

Połączenie perspektywy produktu, developera i marketingu w jednym miejscu

RealizacjeO mnieBlog
Porozmawiajmy
PL
EN

Nowoczesne strony internetowe dla firm, które myślą odważnie.

Przewiń do góry

Nazwa

StriveLab Maciej Sala

NIP

6772218995

REGON

524008527

E-mail

contact@strivelab.pl

Usługi główne
  • Tworzenie stron internetowych
  • Strony internetowe Next.js
  • Strony internetowe Astro
  • Strony internetowe React
Inne usługi
  • Usługi
  • SEO & Performance Sprint
  • QA & Stabilizacja
  • Konsultacje Product / Delivery
  • Automatyzacja Procesów AI
  • Aplikacje webowe Next.js
  • Współpraca ciągła
Strony
  • O mnie
  • Usługi
  • Realizacje
  • Blog

© 2026 StriveLab.pl

Polityka prywatności
AstroUX

Astro View Transitions — płynne przejścia między stronami bez budowania SPA

View Transitions API w Astro — jak dodać animowane przejścia między stronami w aplikacji MPA. ClientRouter, named transitions, persistent state i kompatybilność z browserami.

OpublikujLinkedInFacebookWyślij
Autor
Maciej Sala
Opublikowano
24 kwietnia 2026 00:00
Czytanie
7 min czytania
Aktualizacja
31 maja 2026 08:00

SPA od lat wygrywały w jednej kategorii: płynne przejścia. Klik, treść się zmienia, nagłówek zostaje, obraz morfi do nowego widoku. Bez białego błysku, bez reloadu, bez straty kontekstu. Astro View Transitions odbiera SPA ten monopol — jedną linią kodu, bez rezygnowania z wydajności MPA.

Artykuł w skrócie

  • View Transitions w Astro są opt-in; zwykła strona dalej działa jako klasyczne MPA.
  • ClientRouter daje płynne przejścia i client-side routing, ale wymaga pilnowania skryptów po nawigacji.
  • transition:name, transition:animate i transition:persist pozwalają kontrolować animowane elementy.
  • Dla dostępności trzeba respektować prefers-reduced-motion i dbać o poprawne tytuły stron.

Tradycyjne MPA, czyli Multi-Page Application, to architektura, w której każda podstrona to osobny dokument HTML ładowany od serwera przy nawigacji. — każde kliknięcie to pełny reload. Szybko, przewidywalnie, ale wizualnie szorstko. Astro View Transitions API pozwala przeglądarce animować przejście między dwoma widokami dokumentu zamiast pokazywać gwałtowną podmianę strony. łączy oba światy: animowane przejścia jak w SPA (Single Page Application) to aplikacja webowa, w której cała strona renderuje się i działa po stronie przeglądarki w jednym dokumencie HTML — typowe podejście Reacta, Vue czy Angulara bez SSR., prosta architektura MPA, zero kompromisów wydajnościowych.

Skąd się wziął View Transitions API

View Transitions to natywne API przeglądarki, które pozwala animować przejścia między stanami DOM. Początkowo było zaimplementowane tylko w Chrome (2023), potem dołączyło Safari (17.4+, marzec 2024), a Firefox dodał natywne wsparcie dopiero w wersji 144 (październik 2025) — i to najpierw dla przejść w obrębie jednego dokumentu. Dla przeglądarek bez natywnego API Astro robi Graceful degradation to podejście, w którym aplikacja w razie awarii części funkcji nadal działa w okrojonym, ale użytecznym zakresie — zamiast wywalać się w całości. Tu: gdy pada jedno API, pokazujemy zastępczy komunikat, a reszta strony działa dalej. — zwykły reload strony, bez animacji, ale też bez błędów.

Astro było jednym z pierwszych frameworków, które zintegrowały View Transitions w sposób end-to-end. Do Astro 4 komponent nazywał się <ViewTransitions />. W Astro 5.0 został przemianowany na <ClientRouter />, żeby lepiej odzwierciedlać zakres działania (to klient-side router, który wykorzystuje View Transitions tam, gdzie to możliwe) — stara nazwa działała jeszcze jako alias z ostrzeżeniem o wycofaniu. Astro 6.0 usunęło <ViewTransitions /> całkowicie, więc na bieżących wersjach stosujemy <ClientRouter />.

Setup — trzy linie kodu

Żeby dodać View Transitions do całej strony, dodajesz jedną rzecz w layoucie:

Code
---
// src/layouts/Layout.astro
import { ClientRouter } from 'astro:transitions';
---
 
<html lang="pl">
<head>
  <meta charset="UTF-8" />
  <title><slot name="title">StriveLab</slot></title>
  <ClientRouter />
</head>
<body>
  <slot />
</body>
</html>

Po dodaniu <ClientRouter /> Astro automatycznie przechwytuje kliknięcia w linki wewnętrzne i zamiast pełnego reloadu robi animowane przejście z wykorzystaniem View Transitions API (jeśli przeglądarka wspiera) lub soft-reload (jeśli nie).

To wszystko. Bez zmian w stronach, bez konfiguracji, bez bibliotek zewnętrznych.

Co dokładnie się dzieje pod maską

Kiedy user klika link wewnętrzny:

  1. Astro przechwytuje kliknięcie przez event listener.
  2. Pobiera nową stronę przez fetch().
  3. Uruchamia document.startViewTransition() (lub fallback).
  4. Podmienia <body> na nową treść.
  5. Przeglądarka animuje przejście — domyślnie Cross-fade to płynne przenikanie, w którym stary widok zanika, a nowy jednocześnie się pojawia..

Efekt — user widzi płynne przejście zamiast białego błysku reloadu. Nawigacja wstecz/do przodu w przeglądarce też działa z animacjami.

Named transitions — precyzyjne animacje dla wybranych elementów

Sam cross-fade jest fajny, ale prawdziwą wartość View Transitions zyskują, kiedy dodajesz named transitions — oznaczone elementy, które mają animować między stronami w skoordynowany sposób.

Weźmy typowy przykład — lista artykułów i strona pojedynczego artykułu. Chcesz, żeby po kliknięciu miniaturka obrazu „powiększyła się" do pełnowymiarowego obrazu hero na nowej stronie.

Code
---
// src/pages/blog/index.astro - lista artykułów
import { getCollection } from 'astro:content';
 
const posts = await getCollection('blog');
---
 
<ul>
  {posts.map((post) => (
    <li>
      <a href={`/blog/${post.id}/`}>
        <img
          src={post.data.image}
          alt={post.data.title}
          transition:name={`hero-${post.id}`}
        />
        <h2 transition:name={`title-${post.id}`}>{post.data.title}</h2>
      </a>
    </li>
  ))}
</ul>
Code
---
// src/pages/blog/[...slug].astro - strona artykułu
const { post } = Astro.props;
---
 
<article>
  <img
    src={post.data.image}
    alt={post.data.title}
    transition:name={`hero-${post.id}`}
  />
  <h1 transition:name={`title-${post.id}`}>{post.data.title}</h1>
</article>

Kluczem do sukcesu jest to samo transition:name na obu stronach. Przeglądarka widzi, że element hero-post-123 istnieje na stronie A i B, i automatycznie animuje przejście między pozycjami i rozmiarami.

Dla bloga ze zdjęciami efekt jest natychmiastowy: tapnąć miniaturkę, płynna ekspansja do pełnego hero artykułu. Wizualnie nieodróżnialne od natywnej aplikacji iOS/Android.

Persistent state — zachowanie stanu przy nawigacji

Kolejny problem nawigacji MPA — tracisz stan elementów pomiędzy stronami. Formularz kontaktowy, audio player, kontrolki video — wszystko resetuje się przy reloadzie.

Astro daje transition:persist:

Code
<!-- src/layouts/Layout.astro -->
<audio controls transition:persist="audio-player">
  <source src="/podcast.mp3" type="audio/mpeg" />
</audio>
 
<slot />

Element oznaczony transition:persist nie jest zniszczony między stronami — zachowuje swój stan (pozycja odtwarzania, focus, wartość inputa). User może słuchać podcastu w headerze i przechodzić między artykułami bez przerywania odtwarzania.

Typowe zastosowania to player audio lub video, formularze wieloetapowe (jeśli nie zmieniają się między stronami), widgety czatu i koszyk w e-commerce — wszędzie tam, gdzie reset stanu przy nawigacji jest prawdziwym problemem użytkownika.

Dyrektywy animacji — dostosowanie efektu

Domyślny cross-fade działa w większości przypadków, ale możesz wybrać inny preset:

Code
<main transition:animate="slide">
  <slot />
</main>

Dostępne presety:

  • fade — cross-fade (domyślny)
  • slide — wsunięcie z prawej/lewej
  • none — brak animacji
  • Custom — własna animacja CSS

Custom animation:

Code
---
import { fade } from 'astro:transitions';
 
const customFade = fade({ duration: '0.4s' });
---
 
<main transition:animate={customFade}>
  <slot />
</main>

Albo całkowicie własna, z keyframe'ami:

Code
@keyframes slideInFromRight {
  from {
    transform: translateX(50px);
    opacity: 0;
  }
  to {
    transform: translateX(0);
    opacity: 1;
  }
}
 
@keyframes slideOutToLeft {
  from {
    transform: translateX(0);
    opacity: 1;
  }
  to {
    transform: translateX(-50px);
    opacity: 0;
  }
}
 
::view-transition-old(root) {
  animation: slideOutToLeft 0.3s ease-in;
}
 
::view-transition-new(root) {
  animation: slideInFromRight 0.3s ease-out;
}

Selektory ::view-transition-old i ::view-transition-new to natywne API przeglądarki — możesz stylować przejścia jak każdy inny element CSS.

Lifecycle events — reagowanie na zmiany strony

ClientRouter emituje eventy, które pozwalają reagować na nawigację:

Code
<script>
  // Przed rozpoczęciem nawigacji
  document.addEventListener('astro:before-preparation', (e) => {
    console.log('Going to', e.to)
  })
 
  // Po załadowaniu nowej strony
  document.addEventListener('astro:page-load', () => {
    console.log('Page loaded')
    // Re-init third-party scripts, analytics etc.
  })
 
  // Po animacji przejścia
  document.addEventListener('astro:after-swap', () => {
    console.log('DOM updated')
  })
</script>

To przydaje się szczególnie przy re-inicjalizacji skryptów analitycznych (GA, Plausible) po nowej stronie, re-aplikowaniu motywu (dark/light) po nawigacji i trackingu konwersji.

Pułapki i ograniczenia

1. Scroll position. Domyślnie Astro resetuje scroll do góry przy nawigacji, ale jeśli chcesz zachować pozycję scrollowania (np. przy kliknięciu w sekcję w tej samej stronie), musisz to obsłużyć ręcznie.

2. Skrypty globalne. Skrypty w <head> ładowane są raz. Jeśli zainicjowałeś coś (np. Intersection Observer) na stronie A, po przejściu na B trzeba to zainicjować ponownie — stąd event astro:page-load.

3. Forms. ClientRouter obsługuje formularze GET i POST, ale przy krytycznych flow (płatność, logowanie, upload pliku) często lepiej dodać data-astro-reload, żeby zachować klasyczne zachowanie przeglądarki.

4. Third-party widgets. Widgety wstrzykujące treść do DOM (np. komentarze Disqus, social embeds) często nie lubią podmiany <body>. Oznacz je transition:persist lub reinicjalizuj na astro:page-load.

5. Przeglądarki bez pełnego wsparcia. Astro ma strategie fallbacku dla przeglądarek bez natywnego View Transitions API. UX pozostaje poprawny, ale animacje nie muszą być identyczne między silnikami.

Dostępność i skrypty po nawigacji

View Transitions wyglądają jak warstwa wizualna, ale technicznie zmieniają sposób, w jaki strona reaguje po kliknięciu linku. Dlatego wdrożenie powinno mieć krótką checklistę dostępności i utrzymania skryptów.

Każda strona musi mieć sensowny <title> i główny <h1>, bo ClientRouter używa ich do ogłaszania zmiany trasy technologiom wspomagającym — bez tego użytkownik czytnika ekranu nie wie, że nawigacja w ogóle nastąpiła. Astro respektuje prefers-reduced-motion to ustawienie systemowe, którym użytkownik sygnalizuje, że chce ograniczyć animacje i ruch w interfejsie., ale własne animacje CSS też muszą mieć wariant ograniczonego ruchu — systemowe preferencje użytkownika powinny wygrywać z estetyką strony. Skrypty inicjalizujące obserwatory, tooltipy, galerie albo analytics uruchamiaj po astro:page-load, a nie tylko przy pierwszym ładowaniu dokumentu. Elementy z dużym stanem (player audio, koszyk) oznaczaj transition:persist tylko wtedy, gdy naprawdę mają przetrwać zmianę strony. Linki do krytycznych procesów, paneli zewnętrznych i formularzy transakcyjnych oznacz data-astro-reload.

Top tip

Najpierw wdrażaj ClientRouter globalnie z domyślnym przejściem, a dopiero potem dodawaj named transitions dla kilku elementów, które realnie poprawiają orientację użytkownika.

SEO — czy View Transitions nie zaszkodzą?

Obawa, która regularnie wraca: „Skoro Astro podmienia <body> przez JS, czy Google widzi wszystko?"

Odpowiedź: tak, widzi. View Transitions działają po załadowaniu statycznego HTML-a dla docelowej strony. Jeśli Google crawler wchodzi bezpośrednio na /blog/moj-wpis/, dostaje pełny, statyczny HTML — dokładnie tak samo, jakby ClientRouter nie istniał. Animacje są tylko warstwą UX dla użytkownika klikającego linki wewnętrzne.

Więcej o SEO w Astro piszę w osobnym artykule.

Kiedy NIE używać View Transitions

View Transitions to dobre narzędzie, ale nie każde środowisko na nie zasługuje. Jeśli strona to głównie workflow z formularzami wieloetapowymi, ClientRouter komplikuje stan bardziej, niż wart jest efekt wizualny — w takim przypadku lepiej rozważyć czysty SPA (React/Next.js) albo Astro bez ClientRouter. Podobnie gdy wiele komponentów dzieli stan: MPA + View Transitions to antywzorzec, a nie usprawnienie. ClientRouter waży ~4 KB JS, więc dla landing page'a z jednym CTA, gdzie każdy kilobajt jest na wagę złota, można go spokojnie pominąć.

Dla bloga, portfolio, dokumentacji, strony firmowej czy lekkiego e-commerce View Transitions są wygraną bezsporną — i to jedną z tych rzadkich, gdzie dodanie funkcji jednocześnie poprawia wydajność postrzeganą przez użytkownika.

Porównanie z SPA

Pytanie, które dostaję regularnie: „Skoro Astro + View Transitions daje płynne przejścia, to po co w ogóle SPA?"

Odpowiedź zależy od charakteru aplikacji. Jeśli to treść z nawigacją, w której strony są de facto niezależne — Astro z View Transitions jest prostsze, szybsze i wydajniejsze niż Next.js SPA. Jeśli to aplikacja z dużym, współdzielonym state'em, gdzie użytkownik spędza czas w jednej „sesji" — SPA nadal ma przewagę.

Szczegółowe porównanie obu podejść znajdziesz w artykule o Astro vs Next.js.

Werdykt Labu

Wdrożenie View Transitions w Astro to jedno z tych rozwiązań, które daje świetne efekty przy minimalnym wysiłku. Wystarczy dosłownie jedna linijka kodu, żeby podnieść komfort korzystania ze strony (UX) do poziomu aplikacji SPA – bez żadnych kompromisów po stronie wydajności czy SEO. Z kolei funkcje takie jak named transitions i zachowywanie stanu (persistent state) dają możliwości, które jeszcze do niedawna w klasycznych stronach MPA wymagałyby budowania wszystkiego od zera.

Jeśli Twoja strona Astro nie ma jeszcze View Transitions — nie czekaj z tą decyzją — dodaj <ClientRouter />. Jeśli budujesz nową stronę w Astro i chcesz mieć płynne przejścia od pierwszego deployu — odezwij się.

  • Skąd się wziął View Transitions API1 min
  • Setup — trzy linie kodu1 min
  • Co dokładnie się dzieje pod maską1 min
  • Named transitions — precyzyjne animacje dla wybranych elementów1 min
  • Persistent state — zachowanie stanu przy nawigacji1 min
  • Dyrektywy animacji — dostosowanie efektu1 min
  • Lifecycle events — reagowanie na zmiany strony1 min
  • Pułapki i ograniczenia1 min
  • Dostępność i skrypty po nawigacji1 min
  • SEO — czy View Transitions nie zaszkodzą?1 min
  • Kiedy NIE używać View Transitions1 min
  • Porównanie z SPA1 min
  • Werdykt Labu1 min

Często zadawane pytania

Źródła i dokumentacjaZweryfikowano: 25 maja 2026

Materiały wykorzystane do weryfikacji artykułu o View Transitions w Astro:

Astro docs: View Transitions, Astro docs: ClientRouter reference, MDN: View Transitions API, Chrome for Developers: View Transitions, Can I use: View Transitions API.

Seria

Astro w praktyce 2026
Część 5 / 8
  1. 1Astro 6 — przewodnik po nowościach: Cloudflare Workers, Live Content Collections, Fonts API i CSP
  2. 2Architektura wysp w Astro — czym są wyspy i dlaczego zero JS domyślnie zmienia zasady gry
  3. 3Client directives w Astro — client:load, client:idle, client:visible, client:media, client:only w praktyce
  4. 4Server Islands w Astro — dynamiczne fragmenty na statycznej stronie
  5. Astro View Transitions — płynne przejścia między stronami bez budowania SPA
  6. 6SEO w Astro — Core Web Vitals, dane uporządkowane i techniczny fundament rankingu w 2026
  7. 7Migracja bloga z WordPress na Astro — eksport treści, przekierowania 301 i zachowanie pozycji w Google
  8. 8Lighthouse 100/100 w Astro — case study optymalizacji strony usługowej
Maciej Sala

O autorze

Maciej Sala

Maciej Sala — Product Manager i Frontend Developer z bogatym doświadczeniem w marketingu internetowym oraz SEO. Na co dzień pracuje z Reactem, Next.js i TypeScriptem, a ostatnio także z Astro i narzędziami do automatyzacji procesów AI. Sprawnie łączy perspektywę produktową z praktycznym podejściem do kodu. Przez kilka lat był związany z branżą gier wideo jako project manager i game designer. Absolwent historii na Uniwersytecie Jagiellońskim oraz studiów podyplomowych z marketingu internetowego na AGH w Krakowie. Po godzinach trenuje na siłowni, maluje figurki i rozwija własne projekty side-projecty.

Moje artykułyWięcej o mnie

Pomagam przekładać takie tematy na konkretne wdrożenia w frontendzie, SEO, analityce i procesie produktowym.

Skontaktuj się ze mną

Biblioteka wiedzy

Czytaj dalej

Zobacz więcej wpisów
Astro.js vs Next.js w 2026 — kompleksowe porównanie frameworków
Astro.js vs Next.js w 2026 — kompleksowe porównanie frameworków

Porównanie Astro 6 i Next.js 16 z perspektywy wdrożeń: architektura, JavaScript po stronie klienta, SEO, DX, hosting i konkretne przypadki użycia.

Maciej Sala

Maciej Sala

Founder Strivelab

15 kwietnia 2026
Architektura wysp w Astro — czym są wyspy i dlaczego zero JS domyślnie zmienia zasady gry
Architektura wysp w Astro — czym są wyspy i dlaczego zero JS domyślnie zmienia zasady gry

Architektura wysp to fundament Astro. Wyjaśniam, czym są wyspy, jak działa selektywna hydratacja, kiedy daje realną przewagę i gdzie jest jej granica — z przykładami kodu i benchmarkami.

Maciej Sala

Maciej Sala

Founder Strivelab

24 kwietnia 2026
Astro 6 — przewodnik po nowościach: Cloudflare Workers, Live Content Collections, Fonts API i CSP
Astro 6 — przewodnik po nowościach: Cloudflare Workers, Live Content Collections, Fonts API i CSP

Co nowego w Astro 6: workerd jako środowisko uruchomieniowe w trybie programistycznym, Live Content Collections, wbudowane Fonts API, Content Security Policy i nowy kompilator Rust.

Maciej Sala

Maciej Sala

Founder Strivelab

24 kwietnia 2026
Poprzedni wpisArchitektura wysp w Astro — czym są wyspy i dlaczego zero JS domyślnie zmienia zasady gryArchitektura wysp to fundament Astro. Wyjaśniam, czym są wyspy, jak działa selektywna hydratacja, kiedy daje realną przewagę i gdzie jest jej granica — z przykładami kodu i benchmarkami.
Maciej Sala

Maciej Sala

Founder Strivelab

24 kwietnia 2026
Następny wpisServer Islands w Astro — dynamiczne fragmenty na statycznej stronieServer Islands w Astro pozwalają łączyć szybkość SSG z dynamiką SSR. Jak działa server:defer, kiedy używać, jakie są ograniczenia i jak zaimplementować personalizację bez utraty wydajności.
Maciej Sala

Maciej Sala

Founder Strivelab

24 kwietnia 2026