view-transition-name CSS property
Baseline 2025>
Neu verfügbar
Seit Oktober 2025 funktioniert diese Funktion auf aktuellen Geräten und in aktuellen Browserversionen. Auf älteren Geräten oder in älteren Browsern funktioniert sie möglicherweise nicht.
Die CSS-Eigenschaft view-transition-name gibt den View-Transition-Snapshot an, an dem ausgewählte Elemente teilnehmen. Dadurch können Sie diese Elemente getrennt vom Rest der Seite animieren, der während eines View-Transitions die standardmäßige Cross-Fade-Animation verwendet. Anschließend können Sie benutzerdefinierte Animationsstile für diese Elemente definieren.
Syntax
/* <custom-ident> value examples */
view-transition-name: header;
view-transition-name: figure-caption;
/* Keyword values */
view-transition-name: none;
view-transition-name: match-element;
/* Global values */
view-transition-name: inherit;
view-transition-name: initial;
view-transition-name: revert;
view-transition-name: revert-layer;
view-transition-name: unset;
Werte
<custom-ident>-
Ein identifizierender Name, der bewirkt, dass das ausgewählte Element an einem separaten Snapshot vom Root-Snapshot teilnimmt. Das
<custom-ident>darf nichtauto,match-element,noneoder ein Wert eines CSS-weiten Schlüsselworts sein. match-element-
Der Browser weist dem ausgewählten Element automatisch einen eindeutigen Namen zu. Dieser Name wird verwendet, um das Element getrennt von allen anderen Elementen auf der Seite als Snapshot zu erfassen. (Dieser Name ist intern und kann nicht aus dem DOM gelesen werden.)
none-
Das ausgewählte Element nimmt nicht an einem separaten Snapshot teil, es sei denn, es hat ein übergeordnetes Element mit festgelegtem
view-transition-name; in diesem Fall wird es als Teil dieses Elements als Snapshot erfasst.
Beschreibung
Wenn ein View-Transition auf eine Web-App angewendet wird, werden standardmäßig alle Änderungen an der Benutzeroberfläche, die während dieses Transitions erfolgen, gemeinsam als Snapshot erfasst und animiert. Dies ist der standardmäßige — oder root — Snapshot (siehe Der Pseudo-Element-Baum für View-Transitions). Standardmäßig ist diese Animation ein sanftes Cross-Fade, das in der View Transitions SPA-Demo zu sehen ist.
Wenn bestimmte Elemente während des View-Transitions anders als der root-Snapshot animiert werden sollen, können Sie ihnen einen anderen view-transition-name geben, zum Beispiel:
figcaption {
view-transition-name: figure-caption;
}
Anschließend können Sie mithilfe der relevanten View-Transition-Pseudo-Elemente — ::view-transition-old() und ::view-transition-new() — festlegen, welche Animationen für die Vorher- und Nachher-Snapshots verwendet werden sollen. Zum Beispiel:
::view-transition-old(figure-caption) {
animation: 0.25s linear both shrink-x;
}
::view-transition-new(figure-caption) {
animation: 0.25s 0.25s linear both grow-x;
}
Wenn ein Element nicht getrennt als Snapshot erfasst werden soll, können Sie den Wert none für view-transition-name angeben:
.dont-animate-me {
view-transition-name: none;
}
Das view-transition-name-<custom-ident> muss für jedes gerenderte Element, das am View-Transition teilnimmt, eindeutig sein. Wenn zwei gerenderte Elemente gleichzeitig denselben view-transition-name haben, wird das Promise ViewTransition.ready abgelehnt und der Transition wird übersprungen.
view-transition-name-Werte automatisch festlegen
Manchmal möchten Sie mehrere UI-Elemente in einem View-Transition getrennt animieren. Dies ist häufig der Fall, wenn Sie eine Liste von Elementen auf einer Seite haben und diese auf irgendeine Weise neu anordnen möchten:
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
<li>Item 4</li>
<!-- ... -->
<li>Item 99</li>
</ul>
Jedem Element einen eindeutigen Namen zu geben, kann unpraktisch sein, insbesondere wenn die Anzahl der Elemente größer wird:
li:nth-child(1) {
view-transition-name: item1;
}
li:nth-child(2) {
view-transition-name: item2;
}
li:nth-child(3) {
view-transition-name: item3;
}
li:nth-child(4) {
view-transition-name: item4;
}
/* ... */
li:nth-child(99) {
view-transition-name: item99;
}
Um dieses Problem zu umgehen, können Sie den Wert match-element verwenden, wodurch der Browser jedem ausgewählten Element einen eindeutigen internen view-transition-name zuweist:
li {
view-transition-name: match-element;
}
Da match-element automatische view-transition-name-Werte anhand der Elementidentität zuweist, kann es nur für Same-Document-View-Transitions verwendet werden. Die automatisch erzeugten internen Bezeichner können nicht zwischen verschiedenen Elementen oder Dokumenten übertragen werden.
Formale Definition
| Anfangswert | none |
|---|---|
| Anwendbar auf | alle Elemente |
| Vererbt | Nein |
| Berechneter Wert | wie angegeben |
| Animationstyp | diskret |
Formale Syntax
view-transition-name =
none |
<custom-ident>
Beispiele
>Grundlegende Verwendung von view-transition-name
Dieses Beispiel stammt aus der View Transitions SPA-Demo, einer einfachen Bildergalerie. Der grundlegende SPA-View-Transition enthält eine ausführlichere Erklärung dazu, wie diese Demo funktioniert.
Die meisten Änderungen an der Benutzeroberfläche werden mithilfe des root-Transition-Snapshots animiert. Dem <figcaption> wird jedoch ein view-transition-name von figure-caption zugewiesen, damit es anders als der Rest der Seite animiert werden kann:
figcaption {
view-transition-name: figure-caption;
}
Der folgende Code wendet eine benutzerdefinierte Animation nur auf <figcaption> an:
@keyframes grow-x {
from {
transform: scaleX(0);
}
to {
transform: scaleX(1);
}
}
@keyframes shrink-x {
from {
transform: scaleX(1);
}
to {
transform: scaleX(0);
}
}
::view-transition-group(figure-caption) {
height: auto;
right: 0;
left: auto;
transform-origin: right center;
}
::view-transition-old(figure-caption) {
animation: 0.25s linear both shrink-x;
}
::view-transition-new(figure-caption) {
animation: 0.25s 0.25s linear both grow-x;
}
Wir erstellen eine benutzerdefinierte CSS-Animation und wenden sie auf die Pseudo-Elemente ::view-transition-old(figure-caption) und ::view-transition-new(figure-caption) an. Außerdem wenden wir weitere Stile an, damit beide an derselben Stelle bleiben und das Standard-Styling unsere benutzerdefinierten Animationen nicht beeinträchtigt.
Verwendung des Werts match-element
Dieses Beispiel enthält eine Liste von Technologien – HTML, CSS, SVG und JS –, die in einer Seitenleiste neben einem Hauptinhaltsbereich angezeigt werden, der zunächst leer ist. Ein Klick auf die Überschrift einer Technologie animiert deren Inhalt in den angrenzenden Inhaltsbereich, der weitere Details anzeigt.
HTML
Das Element <main> enthält eine ungeordnete Liste und ein <article>-Element. Die mehreren untergeordneten <li>-Elemente innerhalb der Liste enthalten jeweils ein <a>-Element innerhalb einer Überschrift.
<main class="match-element-applied">
<ul>
<li>
<h2><a href="#">HTML</a></h2>
<h3>HyperText Markup Language</h3>
<p>
HyperText Markup Language (HTML) is the most basic building block of the
web. It defines the meaning and structure of web content. HTML provides
the fundamental building blocks for structuring web documents and apps.
</p>
</li>
<li>
<h2><a href="#">CSS</a></h2>
<h3>Cascading Style Sheets</h3>
<p>
Cascading Style Sheets (CSS) is a stylesheet language used to describe
the presentation of a document written in HTML or XML (including XML
dialects such as SVG, MathML or XHTML). CSS describes how elements
should be rendered on screen, on paper, in speech, or on other media.
</p>
</li>
<li>
<h2><a href="#">SVG</a></h2>
<h3>Scalable Vector Graphics</h3>
<p>
Scalable Vector Graphics (SVG) is an XML-based markup language for
describing two-dimensional based vector graphics.
</p>
</li>
<li>
<h2><a href="#">JS</a></h2>
<h3>JavaScript</h3>
<p>
JavaScript (JS) is the web's native programming language. JavaScript is
a lightweight, interpreted (or just-in-time compiled) programming
language with first-class functions. While it is most well-known as the
scripting language for web pages, many non-browser environments, such as
Node.js, also use it.
</p>
</li>
</ul>
<article></article>
</main>
CSS
Wir verwenden Flexbox, um <li> und <article> nebeneinander anzuordnen und damit die Listenelemente im ersten Bereich gleich viel Platz einnehmen. Die Liste nimmt 35 % der Breite des Containers ein, während <article> den verbleibenden verfügbaren horizontalen Platz ausfüllt.
main {
container-type: inline-size;
width: 100%;
height: 100%;
display: flex;
gap: 2cqw;
position: relative;
}
ul {
width: 35cqw;
display: flex;
flex-direction: column;
gap: 1cqw;
}
article {
flex: 1;
}
li {
flex: 1;
}
Wir definieren außerdem eine Regel, die Elemente mit der Klasse active-item auswählt. Wenn diese Klasse auf ein Element angewendet wird, bewirkt die Regel, dass es genau über dem <article>-Element positioniert wird. Diese Klasse wird den Listenelementen über JavaScript zugewiesen, wenn auf ihre Links geklickt wird, wodurch ein View-Transition gestartet wird.
.active-item {
position: absolute;
z-index: 1;
translate: 37cqw;
width: calc(100% - 37cqw);
height: 100%;
}
Standardmäßig werden alle Elemente in einem View-Transition gemeinsam in einem einzigen Cross-Fade animiert. In diesem Beispiel möchten wir dies jedoch nicht — wir möchten, dass jedes Listenelement eine eigene Bewegungsanimation hat. Dies lässt sich erreichen, indem view-transition-name: match-element auf jedes Listenelement angewendet wird:
.match-element-applied li {
view-transition-name: match-element;
}
Die Klasse match-element-applied wird standardmäßig auf das <main>-Element angewendet, weshalb das Kontrollkästchen im Ergebnis-Frame anfangs ausgewählt ist. Wenn Sie die Auswahl aufheben, wird die Klasse entfernt und stattdessen tritt die standardmäßige Cross-Fade-Animation in Kraft. Sie können das Kontrollkästchen umschalten, um die Standardanimation mit der Animation zu vergleichen, die bei Verwendung von view-transition-name: match-element angewendet wird.
Als Nächstes passen wir die Animation an, indem wir das Pseudo-Element ::view-transition-group() verwenden, um auf alle View-Transition-Gruppen (gekennzeichnet durch den Bezeichner *) eine animation-duration anzuwenden und allen alten und neuen Snapshots eine height von 100% zu geben. Dadurch werden Unterschiede in den Seitenverhältnissen der alten und neuen Snapshots ausgeglichen, und die Animationen wirken flüssiger:
::view-transition-group(*) {
animation-duration: 0.5s;
}
html::view-transition-old(*),
html::view-transition-new(*) {
height: 100%;
}
JavaScript
In diesem Beispiel wird die Klasse active-item auf die Listenelemente angewendet, wenn auf ihre Links geklickt wird; dies wird durch die Funktion updateActiveItem() erreicht:
const mainElem = document.querySelector("main");
let prevElem;
let checkboxElem = document.querySelector("input");
// View transition code
function updateActiveItem(event) {
// Get the list item that contains the clicked link
const clickedElem = event.target.parentElement.parentElement;
// Set the active-item class on the list item
clickedElem.className = "active-item";
// Keep track of the previous item that was clicked, if any.
// Remove the active-item class from the previous item so that only
// one list item is placed over the <article> at any one time
if (prevElem === clickedElem) {
prevElem.className = "";
prevElem = undefined;
} else if (prevElem) {
prevElem.className = "";
prevElem = clickedElem;
} else {
prevElem = clickedElem;
}
}
mainElem.addEventListener("click", (event) => {
event.preventDefault(); // Prevent iframe from scrolling when clicked
// Do nothing unless a link is clicked inside the <main> element
if (event.target.tagName !== "A") {
return;
}
// Run updateActiveItem() on its own if view transitions are not supported
if (!document.startViewTransition) {
updateActiveItem(event);
} else {
// Run updateActiveItem() via startViewTransition()
const transition = document.startViewTransition(() =>
updateActiveItem(event),
);
}
});
// Toggle the class on <main> to control whether or not match-element is applied
checkboxElem.addEventListener("change", () => {
mainElem.classList.toggle("match-element-applied");
});
Das Ausführen der Funktion updateActiveItem() über die Funktion startViewTransition() animiert die Anzeige der Technologiedetails flüssig.
Ergebnis
Klicken Sie auf eine Technologieüberschrift in der Seitenleiste und beachten Sie den Animationseffekt ihres Inhalts in den Hauptinhaltsbereich.
Es gibt außerdem ein Kontrollkästchen, das standardmäßig ausgewählt ist, sodass view-transition-name: match-element angewendet wird. Heben Sie die Auswahl des Kontrollkästchens auf und klicken Sie erneut auf eine Überschrift, um zu sehen, wie der View-Transition ohne view-transition-name: match-element funktioniert.
Spezifikationen
| Spezifikation |
|---|
| CSS View Transitions Module Level 1> # view-transition-name-prop> |