Start · Sprachen · JavaScript · Referenz · NavigateEvent.hasUAVisualTransition

NavigateEvent.hasUAVisualTransition

Eigenschaft

Schreibgeschützter Boolean, der angibt, ob der Browser (User-Agent) für diese Navigation bereits eine eigene visuelle Transition abgespielt hat, bevor das <code>navigate</code>-Ereignis ausgelöst wurde.

seit JavaScript Chromium 123+ (Chrome/Edge/Opera), Firefox und Saf Kategorie: webapi

Signatur

NavigateEvent.hasUAVisualTransition

Beschreibung

Die Eigenschaft hasUAVisualTransition gehört zum NavigateEvent der Navigation API. Sie ist true, wenn der Browser für die aktuelle Navigation schon eine eigene Animation gezeigt hat. Ein typischer Fall ist die Wisch-Geste zum Zurück- oder Vorblättern auf Mobilgeräten oder Touchpads, bei der der Browser den vorherigen Seitenzustand als Vorschau einblendet. Hat der Browser keine solche Transition abgespielt, ist der Wert false.

Wichtig ist das vor allem für Single-Page-Anwendungen, die Navigationen mit event.intercept() abfangen und eigene Übergänge anzeigen, zum Beispiel mit document.startViewTransition() (View Transitions API). Laufen beide Animationen nacheinander ab, sieht der Übergang doppelt aus und wirkt ruckelig: Die Wisch-Animation des Browsers endet, dann startet die Seiten-Animation vom alten Zustand aus noch einmal. Mit hasUAVisualTransition lässt sich die eigene Animation in diesem Fall weglassen und der neue Zustand sofort anzeigen.

Die Eigenschaft ist nur lesbar und steht im navigate-Handler von window.navigation sofort zur Verfügung. Normalerweise fragt man sie direkt vor dem Start einer View Transition ab.

Rückgabewert

Typ
boolean
Beschreibung
true, wenn der Browser vor dem Auslösen des Ereignisses bereits eine visuelle Transition für diese Navigation gezeigt hat, sonst false.

Beispiele

Doppelte Animation bei Wisch-Gesten vermeiden

// SPA-Router mit View Transitions
const renderRoute = async (url) => {
  const { pathname } = new URL(url);
  document.querySelector('main').textContent = `Seite: ${pathname}`;
};

navigation.addEventListener('navigate', (event) => {
  if (!event.canIntercept || event.hashChange || event.downloadRequest) return;

  event.intercept({
    handler: async () => {
      // Browser hat schon animiert (z. B. Zurück-Wischen) → nur DOM aktualisieren
      if (event.hasUAVisualTransition || !document.startViewTransition) {
        await renderRoute(event.destination.url);
        return;
      }
      // Sonst eigene Transition abspielen
      const transition = document.startViewTransition(() =>
        renderRoute(event.destination.url)
      );
      await transition.finished;
    },
  });
});

Wert zu Diagnosezwecken protokollieren

navigation.addEventListener('navigate', (event) => {
  console.log(
    `Navigation (${event.navigationType}) nach ${event.destination.url}`,
    '– UA-Transition:', event.hasUAVisualTransition
  );
});

// Programmatische Navigation: Browser animiert nicht
navigation.navigate('/produkte');
Navigation (push) nach https://example.com/produkte – UA-Transition: false

Feature-Erkennung mit Fallback

const supportsNavigationApi = 'navigation' in window;
const supportsUAFlag =
  supportsNavigationApi &&
  'NavigateEvent' in window &&
  'hasUAVisualTransition' in NavigateEvent.prototype;

console.log({ supportsNavigationApi, supportsUAFlag });

const skipOwnAnimation = (event) =>
  supportsUAFlag ? event.hasUAVisualTransition : false;
{ supportsNavigationApi: true, supportsUAFlag: true } // in aktuellem Chrome

// Wichtig · Fallstricke

  • Browser-Unterstützung: Die Navigation API und diese Eigenschaft sind vor allem in Chromium-Browsern verfügbar (hasUAVisualTransition ab Version 123). In anderen Browsern fehlt window.navigation teils ganz. Prüfe deshalb vorher mit Feature-Erkennung, ob sie vorhanden ist.
  • Der Wert ist in der Praxis fast nur bei Traverse-Navigationen (navigationType === 'traverse') durch Gesten true. Bei navigation.navigate(), Link-Klicks oder Formular-Übermittlungen ist er normalerweise false.
  • Ob und wann der Browser eine eigene Transition zeigt, hängt vom Browser und von der Plattform ab. Verlass dich nicht darauf, dass es sie gibt. Nutze die Eigenschaft nur, um die eigene Animation wegzulassen.
  • Ist der Wert true, zeigt der Browser schon den Zielzustand an. Aktualisiere das DOM dann ohne Verzögerung, sonst ist kurz veralteter Inhalt zu sehen.
  • Die Eigenschaft ist schreibgeschützt. Zuweisungen haben keine Wirkung.