view-transition-name
Limited availability
This feature is not Baseline because it does not work in some of the most widely-used browsers.
Die view-transition-name
CSS Eigenschaft gibt den Ansichtstransition Snapshot an, an dem ausgewählte Elemente beteiligt sein werden. Dies ermöglicht es Ihnen, diese Elemente separat vom Rest der Seite zu animieren, die während einer Ansichtstransition die Standard-Crossfade-Animation 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 an einem separaten Snapshot vom Root-Snapshot teilnimmt. Die
<custom-ident>
kann nichtauto
,match-element
,none
oder ein CSS-weites Schlüsselwort 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 schnappen. (Dieser Name ist intern und kann nicht aus dem DOM gelesen werden.)
none
-
Das ausgewählte Element wird nicht an 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 gesnappt wird.
Beschreibung
Standardmäßig, wenn eine Ansichtstransition auf eine Web-App angewendet wird, werden alle Änderungen an der Benutzeroberfläche, die während dieser Transition auftreten, zusammen gesnappt und animiert. Dies ist der Standard- oder root
-Snapshot (siehe Der view transition Pseudo-Element-Baum). Standardmäßig ist diese Animation ein sanfter Crossfade, zu sehen in der View Transitions SPA Demo.
Wenn Sie möchten, dass bestimmte Elemente anders als der root
-Snapshot während der Ansichtstransition animiert werden, können Sie ihnen einen anderen view-transition-name
geben, zum Beispiel:
figcaption {
view-transition-name: figure-caption;
}
Sie können dann angeben, welche Animationen Sie für die Vorher- und Nachher-Snapshots möchten, indem Sie die entsprechenden Ansichtstransition Pseudo-Elemente verwenden — ::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 gesnappt 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 Ansichtstransition teilnimmt, eindeutig sein. Wenn zwei gerenderte Elemente zur gleichen Zeit den gleichen view-transition-name
haben, wird die ViewTransition.ready
Promise
zurückgewiesen und die Transition wird übersprungen.
Automatisches Angeben von view-transition-name
Werten
Manchmal möchten Sie mehrere Benutzeroberflächenelemente in einer Ansichtstransition separat animieren. Dies ist oft der Fall, wenn Sie eine Liste von Elementen auf einer Seite haben und diese irgendwie 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 unbequem sein, besonders 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 match-element
Wert verwenden, der bewirkt, dass der Browser jedem ausgewählten Element einen eindeutigen internen view-transition-name
gibt:
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 Same-Document-Ansichtstransitionen verwendet werden. Die automatisch generierten internen Identifikatoren sind nicht übertragbar über verschiedene Elemente oder Dokumente hinweg.
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. Die Grundlegende SPA Ansichtstransition bietet eine detailliertere Erklärung, wie diese Demo funktioniert.
Die meisten Änderungen 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)
Pseudo-Elemente an. Wir wenden auch andere Stile an, um sie beide am gleichen Ort zu halten und zu verhindern, dass die Standardformatierung unsere benutzerdefinierten Animationen stört.
Verwendung des match-element
Werts
Dieses Beispiel enthält eine Liste von Technologien – HTML, CSS, SVG und JS –, die in einer Seitenleiste neben einem Hauptinhaltbereich angezeigt werden, der zunächst leer ist. Durch Klicken auf eine Technologieüberschrift 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 Headings.
<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 gestalten und die Listenelemente im ersten Spalte gleichmäßig viel Platz teilen zu lassen. Die Liste nimmt 35% der Breite des Containers ein, während das <article>
den restlichen verfügbaren horizontalen Raum 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, bewirkt die Regel, dass es genau über dem <article>
Element positioniert wird. Diese Klasse wird über JavaScript auf die Listenelemente angewendet, wenn deren Links angeklickt werden, was eine Ansichtstransition initiiert.
.active-item {
position: absolute;
z-index: 1;
translate: 37cqw;
width: calc(100% - 37cqw);
height: 100%;
}
Standardmäßig werden alle Elemente in einer Ansichtstransition zusammen in einem einzigen Crossfade animiert. In diesem Beispiel wollen wir dies jedoch nicht. Wir möchten, dass jedes Listenelement seine eigene Bewegungsanimation hat. Wir können dies 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 Ergebnisfenster anfänglich ausgewählt ist. Wenn Sie es abwählen, wird die Klasse entfernt und die Standard-Crossfade-Animation tritt stattdessen ein. Sie können das Kontrollkästchen umschalten, um die Standardanimation mit derjenigen 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()
Pseudo-Element verwenden, um eine animation-duration
auf alle Ansichtstransitionsgruppen (gekennzeichnet durch den *
Bezeichner) 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 macht die Animationen 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 active-item
Klasse auf die Listenelemente angewendet, wenn deren 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 der Technologiedetails nahtlos.
Ergebnis
Klicken Sie auf eine Technologieüberschrift in der Seitenleiste und beachten Sie den Animationseffekt ihres Inhalts in den Hauptinhaltbereich.
Es gibt auch ein Kontrollkästchen, das standardmäßig ausgewählt ist, sodass view-transition-name: match-element
angewendet wird. Deaktivieren Sie das Kontrollkästchen und klicken Sie erneut auf eine Überschrift, um zu sehen, wie die Ansichtstransition ohne view-transition-name: match-element
funktioniert.
Spezifikationen
Specification |
---|
CSS View Transitions Module Level 1> # view-transition-name-prop> |
Browser-Kompatibilität
Loading…