PFAD: ./module/css/css4/

DATEI: string(25) "00Inhaltsverzeichnis4.php"
DATEI: string(21) "22CSS-Animationen.php"
DATEI: string(26) "23AnimationenUndPraxis.php"
DATEI: string(26) "24AnimationenUndKarten.php"
DATEI: string(26) "26 2D-Transformationen.php"
DATEI: string(19) "27rotateUndskew.php"
DATEI: string(30) "28Mehrere Transformationen.php"
DATEI: string(26) "29 3D-Transformationen.php"
DATEI: string(14) "30 3D-Raum.php"
DATEI: string(22) "31 3D-AchseUndRaum.php"
DATEI: string(22) "32EinUndAusblenden.php"
DATEI: string(28) "33WürfelUndBildergalerie.php"
DATEI: string(15) "34 3D-Karte.php"

css mit Adi Prinz

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:

  1. Ein äußerer Bereich stellt mit perspective den Betrachtungsabstand bereit.
  2. Ein innerer 3D-Container erhält transform-style: preserve-3d.
  3. 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

hinten
Mitte
vorne
.transform-style-flat {
  transform-style: flat;
  transform:
    rotateX(-18deg)
    rotateY(35deg);
}
        

Räumliche Positionen erhalten

hinten
Mitte
vorne
.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.

hinten
Mitte
vorne
.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

0deg
.backface-rotate-0 {
  transform: rotateY(0);
}
        

Seitlich gedreht

90deg
.backface-rotate-90 {
  transform: rotateY(90deg);
}
        

RĂĽckseite nach vorne

180deg
.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

RĂĽckseite sichtbar
.backface-visible {
  backface-visibility: visible;
  transform: rotateY(180deg);
}
        

RĂĽckseite ausgeblendet

RĂĽckseite verborgen
.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>
    
  1. .flip-card stellt die Perspektive bereit.
  2. .flip-card-inner enthält beide Seiten und wird gedreht.
  3. Vorder- und RĂĽckseite liegen mit position: absolute deckungsgleich ĂĽbereinander.
  4. Beide Seiten erhalten backface-visibility: hidden.
  5. 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.