view-transition-name
Baseline
2025
Newly available
Since October 2025, this feature works across the latest devices and browser versions. This feature might not work in older devices or browsers.
Die view-transition-name CSS Eigenschaft gibt das View-Transition Snapshot an, in dem ausgewählte Elemente teilnehmen. Dies ermöglicht es Ihnen, diese Elemente getrennt vom Rest der Seite zu animieren, die die standardmäßige Überblendeanimation während einer View Transition verwendet. Sie können dann benutzerdefinierte Animationsstile für diese Elemente definieren.
Syntax
/* <custom-ident> value examples */
view-transition-name: header;
view-transition-name: figure-caption;
/* Keyword value */
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 in einem separaten Snapshot vom Root-Snapshot teilnimmt. Das
<custom-ident>kann nichtauto,match-element,noneoder ein CSS-weites Schlüsselwort Wert sein. match-element-
Der Browser weist dem ausgewählten Element automatisch einen eindeutigen Namen zu. Dieser Name wird verwendet, um das Element separat von allen anderen Elementen auf der Seite zu snaphsotten. (Dieser Name ist intern und kann nicht aus dem DOM gelesen werden.)
none-
Das ausgewählte Element wird nicht in einem separaten Snapshot teilnehmen, es sei denn, es hat ein Elternelement mit einem gesetzten
view-transition-name, in welchem Fall es als Teil dieses Elements snaphsotted wird.
Beschreibung
Standardmäßig werden, wenn eine View Transition auf eine Web-App angewendet wird, alle Änderungen an der Benutzeroberfläche, die während dieser Transition auftreten, gesnapshotted und zusammen animiert. Dies ist der Standard — oder root — Snapshot (siehe Der View-Transition-Pseudoelement-Baum). Standardmäßig ist diese Animation ein sanftes Überblenden, das in Aktion im View Transitions SPA-Demo zu sehen ist.
Wenn Sie möchten, dass bestimmte Elemente anders als der root Snapshot während der View Transition animiert werden, können Sie dies tun, indem Sie ihnen einen anderen view-transition-name geben, zum Beispiel:
figcaption {
view-transition-name: figure-caption;
}
Sie können dann festlegen, welche Animationen Sie für die vorherigen und nachherigen Snapshots mit den entsprechenden View-Transition-Pseudoelementen wünschen — ::view-transition-old() und ::view-transition-new(). 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 Sie nicht möchten, dass ein Element separat gesnapshotted wird, können Sie einen view-transition-name Wert von none angeben:
.dont-animate-me {
view-transition-name: none;
}
Das view-transition-name <custom-ident> muss für jedes gerenderte Element, das an der View Transition teilnimmt, eindeutig sein. Wenn zwei gerenderte Elemente zur gleichen Zeit den gleichen view-transition-name haben, wird der ViewTransition.ready Promise abgelehnt und die Transition wird übersprungen.
Automatische Vergabe von view-transition-name Werten
Manchmal möchten Sie mehrere UI-Elemente separat in einer View Transition animieren. Dies ist oft der Fall, wenn Sie eine Liste von Elementen auf einer Seite haben und diese in irgendeiner 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 einen eindeutigen Namen zu geben kann umständlich 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 lösen, können Sie den Wert match-element verwenden, der bewirkt, dass 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 basierend auf der Elementidentität zuweist, kann es nur für gleichseitige Dokument-View-Transitions verwendet werden. Die automatisch generierten internen Bezeichner können nicht auf verschiedene Elemente oder Dokumente ü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 Nutzung von view-transition-name
Dieses Beispiel stammt aus dem View Transitions SPA-Demo, das eine grundlegende Bildergalerie ist. Die Grundlegende SPA-View-Transition bietet eine detailliertere Erklärung, wie dieses Demo funktioniert.
Die meisten Änderungen in der Benutzeroberfläche werden mit dem root Transition Snapshot animiert. Das <figcaption> erhält jedoch einen view-transition-name von figure-caption, um es anders als den Rest der Seite zu animieren:
figcaption {
view-transition-name: figure-caption;
}
Der folgende Code wendet eine benutzerdefinierte Animation nur auf das <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 ::view-transition-old(figure-caption) und ::view-transition-new(figure-caption) Pseudoelemente an. Wir wenden auch andere Stile an, um sie an derselben Stelle zu halten und das Standardstyling daran zu hindern, mit unseren benutzerdefinierten Animationen zu interferieren.
Verwendung des match-element Werts
Dieses Beispiel enthält eine Liste von Technologien – HTML, CSS, SVG und JS – die in einer Seitenleiste neben einem Hauptinhaltsbereich angezeigt werden, der anfänglich leer ist. Durch Klicken auf die Überschrift einer Technologie wird deren Inhalt in den angrenzenden Inhaltsbereich animiert, der mehr Details zeigt.
HTML
Das <main> Element enthält eine ungeordnete Liste und ein <article> Element. Die mehrfachen Kind-<li> Elemente innerhalb der Liste enthalten jeweils ein <a> Element innerhalb eines Ü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 die <li> und das <article> nebeneinander zu layouten und die Listenelemente gleichmäßig im ersten Spaltenbereich zu verteilen. Die Liste nimmt 35 % der Breite des Containers ein, während das <article> den verbleibenden horizontalen Platz fü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 auch eine Regel, die Elemente mit der active-item Klasse auswählt. Wenn diese Klasse auf ein Element angewendet wird, wird das Element genau über dem <article> Element positioniert. Diese Klasse wird den Listenelementen per JavaScript zugewiesen, wenn deren Links angeklickt werden, wodurch eine View Transition eingeleitet wird.
.active-item {
position: absolute;
z-index: 1;
translate: 37cqw;
width: calc(100% - 37cqw);
height: 100%;
}
Standardmäßig wird bei einer View Transition alles animiert zusammen in einer einzigen Überblende. In diesem Beispiel möchten wir dies jedoch nicht — wir möchten, dass jedes Listenelement seine eigene Bewegungsanimation hat. Dies können wir erreichen, indem wir view-transition-name: match-element auf jedes Listenelement anwenden:
.match-element-applied li {
view-transition-name: match-element;
}
Die match-element-applied Klasse wird standardmäßig auf das <main> Element angewendet, weshalb das Kontrollkästchen im Ergebnismodus anfänglich ausgewählt ist. Wenn Sie es abwählen, wird die Klasse entfernt und die Standard-Überblendanimation tritt stattdessen in Kraft. Sie können das Kontrollkästchen ein- und ausschalten, um die Standardanimation mit der zu vergleichen, die angewendet wird, wenn view-transition-name: match-element verwendet wird.
Als Nächstes passen wir die Animation an, indem wir das ::view-transition-group() Pseudoelement verwenden, um eine animation-duration auf alle View-Transition-Gruppen (gekennzeichnet durch den * Identifikator) anzuwenden und allen alten und neuen Snapshots eine height von 100% zu geben. Dies umgeht Unterschiede in den Seitenverhältnissen der alten und neuen Snapshots und lässt die Animationen glatter aussehen:
::view-transition-group(*) {
animation-duration: 0.5s;
}
html::view-transition-old(*),
html::view-transition-new(*) {
height: 100%;
}
JavaScript
In diesem Beispiel wird die active-item Klasse auf die Listenelemente angewendet, wenn ihre Links angeklickt werden; dies wird durch die updateActiveItem() Funktion 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 updateActiveItem() Funktion über die startViewTransition() Funktion animiert die Anzeige von Technologiedetails reibungslos.
Ergebnis
Klicken Sie auf eine Technologieüberschrift in der Seitenleiste und beachten Sie den Animationseffekt ihres Inhalts im Hauptinhaltsbereich.
Es gibt auch ein Kontrollkästchen, das standardmäßig ausgewählt ist, sodass view-transition-name: match-element angewendet wird. Heben Sie das Kontrollkästchen auf und klicken Sie erneut auf eine Überschrift, um zu sehen, wie die View-Transition ohne view-transition-name: match-element funktioniert.
Spezifikationen
| Specification |
|---|
| CSS View Transitions Module Level 1> # view-transition-name-prop> |
Browser-Kompatibilität
Loading…