Verschachtelte Elemente im 3D-Raum darstellen
Die Eigenschaft transform-style
Die Eigenschaft transform-style bestimmt, ob die
Kindelemente eines transformierten Elements gemeinsam in einem
dreidimensionalen Raum dargestellt oder auf die Fläche ihres
Elternelements reduziert werden.
.element {
transform-style: flat;
}
.element {
transform-style: preserve-3d;
}
| Wert |
Wirkung |
flat |
Die Kindelemente werden auf die zweidimensionale Fläche des
Elternelements reduziert.
|
preserve-3d |
Die Kindelemente behalten ihre räumlichen Positionen im
gemeinsamen 3D-Raum.
|
Der Standardwert ist flat. Für räumlich angeordnete
Kindelemente muss deshalb meistens ausdrĂĽcklich
transform-style: preserve-3d verwendet werden.
Perspektive, 3D-Container und Kindelemente
Ein typischer Aufbau fĂĽr verschachtelte 3D-Elemente besteht aus drei
Ebenen:
-
Ein äußerer Bereich stellt mit
perspective den
Betrachtungsabstand bereit.
-
Ein innerer 3D-Container erhält
transform-style: preserve-3d.
-
Seine Kindelemente werden mit Funktionen wie
translateZ() oder rotateY() räumlich
angeordnet.
.scene {
perspective: 600px;
}
.object {
transform-style: preserve-3d;
transform: rotateY(35deg);
}
.front {
transform: translateZ(50px);
}
.back {
transform: translateZ(-50px);
}
perspective und transform-style erfĂĽllen
unterschiedliche Aufgaben: Die Perspektive bestimmt die Betrachtung des
Raums. transform-style bestimmt, ob die Kindelemente diesen
3D-Raum beibehalten.
flat und preserve-3d vergleichen
Beide Beispiele enthalten gleich angeordnete Kindelemente. Der einzige
Unterschied liegt im Wert von transform-style.
Kindelemente abgeflacht
.transform-style-flat {
transform-style: flat;
transform:
rotateX(-18deg)
rotateY(35deg);
}
Räumliche Positionen erhalten
.transform-style-preserve {
transform-style: preserve-3d;
transform:
rotateX(-18deg)
rotateY(35deg);
}
Bei preserve-3d bleiben die unterschiedlichen
translateZ()-Positionen der Ebenen sichtbar. Bei
flat werden sie auf die Fläche des Elternelements
projiziert.
transform-style wirkt auf die Kindelemente
Die Eigenschaft legt nicht fest, ob das Element selbst dreidimensional
transformiert werden darf. Sie bestimmt, wie dessen Kindelemente
dargestellt werden.
.parent {
transform-style: preserve-3d;
}
.child-a {
transform: translateZ(60px);
}
.child-b {
transform: translateZ(-60px);
}
Erst die räumlichen Transformationen der Kindelemente erzeugen die
unterschiedlichen Positionen. preserve-3d sorgt dafĂĽr, dass
diese Positionen beim Darstellen des Elternelements erhalten bleiben.
transform-style: preserve-3d erzeugt allein noch keinen
sichtbaren 3D-Effekt. Dazu werden zusätzlich räumlich transformierte
Kindelemente und normalerweise eine Perspektive benötigt.
Mehrere verschachtelte 3D-Container
Bei tiefer verschachtelten 3D-Strukturen muss
transform-style: preserve-3d auf jeder Ebene gesetzt werden,
deren Kindelemente räumlich dargestellt werden sollen.
.object {
transform-style: preserve-3d;
}
.object-part {
transform-style: preserve-3d;
}
.object-part-child {
transform: translateZ(40px);
}
Wird eine Zwischenebene mit flat dargestellt, werden ihre
Nachkommen an dieser Stelle abgeflacht.
Unterbrochene 3D-Verschachtelung
.level-1 {
transform-style: preserve-3d;
}
.level-2 {
transform-style: flat;
}
Die zweite Ebene reduziert ihre räumlich angeordneten Kindelemente auf
eine gemeinsame Fläche.
Durchgehende 3D-Verschachtelung
.level-1 {
transform-style: preserve-3d;
}
.level-2 {
transform-style: preserve-3d;
}
Beide Ebenen erhalten die räumlichen Positionen ihrer jeweiligen
Kindelemente.
transform-style wird nicht automatisch vererbt. Bei mehreren
verschachtelten 3D-Containern muss preserve-3d daher auf den
benötigten Ebenen erneut angegeben werden.
Zusammenspiel mit perspective
Die Perspektive wird üblicherweise auf dem äußeren Szenenbereich
festgelegt. Der darin liegende 3D-Container erhält
transform-style: preserve-3d.
.scene {
perspective: 700px;
}
.object {
transform-style: preserve-3d;
}
| Eigenschaft |
Element |
Aufgabe |
perspective |
Äußerer Szenenbereich |
Legt den Betrachtungsabstand fĂĽr seine transformierten
Kindelemente fest.
|
transform-style |
3D-Container |
Erhält die räumlichen Positionen seiner Kindelemente.
|
transform |
3D-Container oder Kindelement |
Verschiebt, dreht oder skaliert das jeweilige Element.
|
Wird statt der Eigenschaft perspective die Funktion
perspective() verwendet, gehört diese direkt in die
transform-Liste des betreffenden Elements.
Den gesamten 3D-Container bewegen
Sind die Kindelemente mit preserve-3d räumlich angeordnet,
kann der gesamte Container gedreht oder animiert werden. Die Kindelemente
bewegen sich dabei als zusammengehöriges 3D-Objekt.
.object {
transform-style: preserve-3d;
animation: rotate-object 6s linear infinite;
}
@keyframes rotate-object {
from {
transform:
rotateX(-18deg)
rotateY(0);
}
to {
transform:
rotateX(-18deg)
rotateY(360deg);
}
}
Die Animation liegt auf dem gemeinsamen Container. Die einzelnen Ebenen
behalten dabei ihre mit translateZ() festgelegten Abstände.
Eigenschaften, die eine flache Darstellung erzwingen können
Bestimmte CSS-Eigenschaften können dazu führen, dass ein Element trotz
angegebenem transform-style: preserve-3d tatsächlich flach
dargestellt wird.
Das kann unter anderem bei folgenden Eigenschaften auftreten:
overflow mit einem Wert wie hidden,
opacity mit einem Wert kleiner als 1,
filter mit einem anderen Wert als none,
clip-path mit einem anderen Wert als none,
mask-image mit einem anderen Wert als none.
Wird ein 3D-Objekt unerwartet flach dargestellt, sollte nicht nur
transform-style geprĂĽft werden. Auch Eigenschaften des
3D-Containers, die eine gemeinsame Darstellungsebene erzeugen, können die
Ursache sein.
Die RĂĽckseite eines Elements ein- oder ausblenden
Die Eigenschaft backface-visibility
Die Eigenschaft backface-visibility bestimmt, ob die RĂĽckseite
eines gedrehten Elements sichtbar ist, wenn sie zum Betrachter zeigt.
.element {
backface-visibility: visible;
}
.element {
backface-visibility: hidden;
}
| Wert |
Wirkung |
visible |
Die RĂĽckseite bleibt sichtbar. Ihr Inhalt erscheint dabei
spiegelverkehrt.
|
hidden |
Die RĂĽckseite wird ausgeblendet, sobald sie zum Betrachter zeigt.
|
Der Standardwert ist visible. Für Wendekarten und ähnliche
3D-Effekte wird meistens backface-visibility: hidden
benötigt.
Wann wird die RĂĽckseite sichtbar?
Eine normale Vorderseite zeigt zunächst zum Betrachter. Bei einer Drehung um
180deg zeigt ihre RĂĽckseite nach vorne.
Keine Drehung
.backface-rotate-0 {
transform: rotateY(0);
}
Seitlich gedreht
.backface-rotate-90 {
transform: rotateY(90deg);
}
RĂĽckseite nach vorne
.backface-rotate-180 {
transform: rotateY(180deg);
}
Bei 90deg steht das Element seitlich zur Betrachtungsfläche
und erscheint deshalb nahezu unsichtbar. Bei 180deg zeigt
seine Rückseite vollständig zum Betrachter.
visible und hidden vergleichen
Beide Elemente sind um 180deg gedreht. Der einzige Unterschied
liegt im Wert von backface-visibility.
RĂĽckseite sichtbar
.backface-visible {
backface-visibility: visible;
transform: rotateY(180deg);
}
RĂĽckseite ausgeblendet
.backface-hidden {
backface-visibility: hidden;
transform: rotateY(180deg);
}
Bei visible bleibt der spiegelverkehrte Inhalt sichtbar. Bei
hidden wird das Element nicht gezeichnet, solange seine
RĂĽckseite zum Betrachter zeigt.
Eine Karte mit Vorder- und RĂĽckseite aufbauen
Eine klassische Wendekarte besteht aus einem äußeren Perspektivbereich,
einem drehbaren Kartencontainer sowie zwei ĂĽbereinanderliegenden
Kartenseiten.
<div class="flip-card">
<div class="flip-card-inner">
<div class="flip-card-front">
Vorderseite
</div>
<div class="flip-card-back">
RĂĽckseite
</div>
</div>
</div>
-
.flip-card stellt die Perspektive bereit.
-
.flip-card-inner enthält beide Seiten und wird gedreht.
-
Vorder- und RĂĽckseite liegen mit
position: absolute
deckungsgleich ĂĽbereinander.
-
Beide Seiten erhalten
backface-visibility: hidden.
-
Die RĂĽckseite wird bereits in ihrer Ausgangslage um
180deg gedreht.
Drehbare Vorder- und RĂĽckseite
Bewege den Mauszeiger ĂĽber die Karte oder setze mit der Tastatur den Fokus
auf die Karte.
Vorderseite
CSS 3D
Karte drehen
RĂĽckseite
backface-visibility
RĂĽckseite sichtbar
.flip-card {
perspective: 800px;
}
.flip-card-inner {
position: relative;
width: 240px;
height: 160px;
transform-style: preserve-3d;
transition: transform 0.8s;
}
.flip-card:hover .flip-card-inner,
.flip-card:focus .flip-card-inner {
transform: rotateY(180deg);
}
.flip-card-front,
.flip-card-back {
position: absolute;
inset: 0;
backface-visibility: hidden;
}
.flip-card-back {
transform: rotateY(180deg);
}
Gedreht wird nur der gemeinsame Kartencontainer. Die RĂĽckseite ist bereits
um 180deg ausgerichtet und zeigt deshalb nach der Drehung des
Containers korrekt zum Betrachter.
Was geschieht während der Drehung?
| Zustand |
Vorderseite |
RĂĽckseite |
| Ausgangslage |
Zeigt mit rotateY(0) zum Betrachter.
|
Ist um 180deg gedreht und wird wegen
backface-visibility: hidden nicht angezeigt.
|
| Halbe Drehung |
Steht ungefähr seitlich zum Betrachter.
|
Steht ebenfalls ungefähr seitlich zum Betrachter.
|
| Vollständig gewendet |
Ihre RĂĽckseite zeigt zum Betrachter und wird ausgeblendet.
|
Ihre sichtbare Vorderfläche zeigt jetzt zum Betrachter.
|
Weil beide Kartenseiten backface-visibility: hidden verwenden,
ist jeweils nur die zum Betrachter gerichtete Vorderfläche sichtbar.
Die Eigenschaft muss auf den Kartenseiten liegen
backface-visibility wird auf jene Elemente gesetzt, deren
Rückseiten verborgen werden sollen – in diesem Fall auf Vorder- und
RĂĽckseite der Karte.
.flip-card-face {
backface-visibility: hidden;
}
Wird backface-visibility: hidden nur auf dem äußeren
Kartencontainer angegeben, werden die RĂĽckseiten der beiden inneren
Kartenseiten dadurch nicht automatisch verborgen.
Darstellung in verschiedenen Browsern
Moderne Browser unterstĂĽtzen backface-visibility. Bei komplexen
3D-Animationen können dennoch kleine Darstellungsunterschiede auftreten,
beispielsweise flackernde Kanten oder kurz sichtbare RĂĽckseiten.
.flip-card-face {
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
}
Die Schreibweise mit -webkit- kann als zusätzliche Absicherung
für ältere Browser oder bestimmte WebKit-Darstellungen ergänzt werden. In
aktuellen Browsern genĂĽgt normalerweise die standardisierte Eigenschaft.
Bedienung und Barrierefreiheit
Ein reiner Hover-Effekt funktioniert nicht fĂĽr alle Eingabemethoden. Das
Beispiel verwendet deshalb zusätzlich :focus, damit die Karte
auch mit der Tastatur gedreht werden kann.
.flip-card:hover .flip-card-inner,
.flip-card:focus .flip-card-inner {
transform: rotateY(180deg);
}
-
Mit
tabindex="0" kann die Karte den Tastaturfokus erhalten.
-
Ein sichtbarer Fokusrahmen zeigt an, welches Element aktiv ist.
-
Wichtige Informationen sollten nicht ausschlieĂźlich durch Hover
erreichbar sein.
-
Bei reduzierter Bewegung kann die Dreh-Transition deaktiviert werden.
Enthält eine Wendekarte Links oder Schaltflächen, sollte sie nicht nur als
fokussierbarer Container umgesetzt werden. Die eigentlichen Bedienelemente
mĂĽssen ebenfalls sinnvoll mit Tastatur und Screenreader erreichbar bleiben.