Skip to main content

Presets

Transition Settings

Exit Animation (Old State)

From:
To:

Enter Animation (New State)

From:
To:

Custom Element Transitions

Define separate transitions for specific elements

Preview Transition

Header

Page A

Content with view transition

Card 1
Card 2
Duration: 300msTiming: ease-outState: old

Generated CSS

/* View Transitions CSS */

/* Define the transition name on the element */
.page-content {
  view-transition-name: page-content;
}

/* Animation for the old (exiting) state */
::view-transition-old(page-content) {
  animation: page-content-out 300ms ease-out both;
}

/* Animation for the new (entering) state */
::view-transition-new(page-content) {
  animation: page-content-in 300ms ease-out both;
}

/* Keyframes for exit animation */
@keyframes page-content-out {
  from {
    opacity: 1;
    transform: translateX(0);
  }
  to {
    opacity: 0;
    transform: translateX(-100%);
  }
}

/* Keyframes for enter animation */
@keyframes page-content-in {
  from {
    opacity: 0;
    transform: translateX(100%);
  }
  to {
    opacity: 1;
    transform: translateX(0);
  }
}

/* Root transition (optional - affects entire page) */
::view-transition-group(root) {
  animation-duration: 300ms;
  animation-timing-function: ease-out;
}

/* Custom element transitions */

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

::view-transition-old(header),
::view-transition-new(header) {
  animation-duration: 300ms;
  animation: none;
}

.main-content {
  view-transition-name: main-content;
}

::view-transition-old(main-content),
::view-transition-new(main-content) {
  animation-duration: 300ms;
  
}

/* Cross-fade fallback for unsupported browsers */
@supports not (view-transition-name: none) {
  .page-transition-enter {
    animation: fade-in 300ms ease-out;
  }
  .page-transition-exit {
    animation: fade-out 300ms ease-out;
  }
}

JavaScript Usage

// View Transitions API Usage

// Check for browser support
const supportsViewTransitions = 'startViewTransition' in document;

// Basic navigation with View Transitions
async function navigateWithTransition(url) {
  if (!supportsViewTransitions) {
    // Fallback for unsupported browsers
    window.location.href = url;
    return;
  }

  // Start the view transition
  const transition = document.startViewTransition(async () => {
    // Fetch and update the new content
    const response = await fetch(url);
    const html = await response.text();

    // Parse and update the DOM
    const parser = new DOMParser();
    const doc = parser.parseFromString(html, 'text/html');

    // Update specific elements
    document.querySelector('.page-content').innerHTML =
      doc.querySelector('.page-content').innerHTML;
  });

  // Optional: Wait for transition to complete
  await transition.finished;
}

// For SPA frameworks (React, Vue, etc.)
function startTransition(updateDOM) {
  

  if (!supportsViewTransitions) {
    updateDOM();
    return Promise.resolve();
  }

  return document.startViewTransition(() => {
    updateDOM();
  }).finished;
}

// React Hook example
function useViewTransition() {
  const [isPending, setIsPending] = React.useState(false);

  const startTransition = React.useCallback((callback) => {
    if (!supportsViewTransitions) {
      callback();
      return;
    }

    setIsPending(true);
    document.startViewTransition(() => {
      callback();
    }).finished.finally(() => {
      setIsPending(false);
    });
  }, []);

  return { isPending, startTransition };
}

// Example: Link click handler
document.querySelectorAll('a[data-transition]').forEach(link => {
  link.addEventListener('click', (e) => {
    e.preventDefault();
    navigateWithTransition(link.href);
  });
});

View Transitions API Reference

Basic Usage

// Start a view transition
document.startViewTransition(() => {
  // Update the DOM
  updateDOM();
});

// With async/await
const transition = document
  .startViewTransition(async () => {
    await updateContent();
  });
await transition.finished;

CSS Pseudo-elements

::view-transition
  The root overlay container

::view-transition-group(name)
  Contains old and new snapshots

::view-transition-old(name)
  Screenshot of old state

::view-transition-new(name)
  Live representation of new state

::view-transition-image-pair(name)
  Contains old and new images

CSS Properties

/* Assign transition name */
.element {
  view-transition-name: my-element;
}

/* Exclude from transition */
.no-transition {
  view-transition-name: none;
}

/* Class for transition types */
.view-transition-class: fade;

Browser Support

  • Chrome 111+ (Mar 2023)
  • Edge 111+ (Mar 2023)
  • Safari 18+ (expected)
  • Firefox: In development

Use feature detection for graceful degradation

Rate this tool