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

Eine interaktive 3D-Karte erstellen

Aufbau der 3D-Karte

Die 3D-Karte besteht aus einem Perspektivbereich, einem drehbaren Kartencontainer und zwei übereinanderliegenden Kartenseiten.

.card-scene {
  perspective: 1000px;
}

.card-3d {
  position: relative;
  transform-style: preserve-3d;
  transition: transform 0.8s;
}

.card-front,
.card-back {
  position: absolute;
  inset: 0;
  backface-visibility: hidden;
}

.card-back {
  transform: rotateY(180deg);
}
    
Vorder- und Rückseite befinden sich an derselben Position. Die Rückseite wird bereits in ihrer Ausgangslage um 180deg gedreht.

HTML-Struktur der Karte

Der Button und die Karte werden gemeinsam in einem Demo-Bereich angeordnet. Die beiden Kartenseiten liegen innerhalb desselben 3D-Containers.

<div class="card-scene">
  <div class="card-3d">
    <div class="card-side card-front">
      Vorderseite
    </div>

    <div class="card-side card-back">
      Rückseite
    </div>
  </div>
</div>

<button type="button" class="card-flip-button">
  Karte drehen
</button>
    

Vollständige interaktive 3D-Karte

Betätige die Schaltfläche, um die Karte zwischen Vorder- und Rückseite zu drehen.

CSS 3D-Transformationen

Moderne räumliche Effekte allein mit CSS gestalten.

Vorderseite

Verwendete Eigenschaften

  • perspective
  • transform-style
  • rotateY()
  • backface-visibility
  • transition
Rückseite

Die Vorderseite der Karte ist sichtbar.

JavaScript verändert nur eine Klasse. Die eigentliche 3D-Drehung und die Animation werden vollständig mit CSS ausgeführt.

Vorder- und Rückseite übereinanderlegen

Beide Kartenseiten werden absolut innerhalb des gemeinsamen Kartencontainers positioniert.

.card-3d {
  position: relative;
  width: 320px;
  height: 400px;
}

.card-side {
  position: absolute;
  inset: 0;
}
    

Durch inset: 0 erhalten alle vier Seitenabstände den Wert 0. Beide Kartenseiten füllen dadurch denselben Bereich aus.

Die Rückseite vorbereiten

In der Ausgangslage zeigt die Vorderseite zum Betrachter. Die Rückseite wird um 180deg gedreht.

.card-front {
  transform: rotateY(0);
}

.card-back {
  transform: rotateY(180deg);
}
    
Die Rückseite ist zwar umgedreht, befindet sich aber weiterhin an derselben Position wie die Vorderseite.

Die Rückflächen ausblenden

Ohne backface-visibility: hidden könnte die jeweils abgewandte Kartenseite spiegelverkehrt durch die andere Seite hindurch sichtbar werden.

.card-side {
  backface-visibility: hidden;
}
    

hidden

Die Rückfläche eines gedrehten Elements wird nicht dargestellt. Dadurch ist immer nur eine Kartenseite sichtbar.

visible

Die Rückfläche bleibt sichtbar. Inhalte können deshalb spiegelverkehrt erscheinen.

Den gesamten Kartencontainer drehen

Beim Drehen wird nicht nur eine einzelne Kartenseite, sondern der gemeinsame 3D-Container transformiert.

.card-3d.is-flipped {
  transform: rotateY(180deg);
}
    

Die vorbereitete Rückseite dreht sich dadurch zum Betrachter, während sich die Vorderseite abwendet.

Die Klasse is-flipped gehört auf den gemeinsamen Kartencontainer und nicht auf eine einzelne Kartenseite.

Die Drehung animieren

Mit transition wechselt die Karte nicht plötzlich, sondern dreht sich gleichmäßig.

.card-3d {
  transition: transform 0.8s ease-in-out;
}
    
Teil Bedeutung
transform Die animierte CSS-Eigenschaft
0.8s Dauer der Drehung
ease-in-out Langsamer Beginn und langsames Ende

Die Klasse mit JavaScript umschalten

Bei jedem Klick auf den Button wird die Klasse is-flipped hinzugefügt oder entfernt.

const flipButton =
  document.querySelector(".card-flip-button");

const interactiveCard =
  document.getElementById("interactiveCard");

flipButton.addEventListener("click", () => {
  interactiveCard.classList.toggle("is-flipped");
});
    

classList.toggle() gibt außerdem zurück, ob die Klasse nach dem Umschalten vorhanden ist. Diesen Wert verwenden wir für die ARIA-Angaben.

Schaltfläche und Status aktualisieren

Nach dem Drehen werden der Text der Schaltfläche, aria-pressed und die versteckte Statusmeldung angepasst.

const isFlipped =
  interactiveCard.classList.toggle("is-flipped");

flipButton.setAttribute(
  "aria-pressed",
  String(isFlipped)
);

flipButton.textContent = isFlipped
  ? "Vorderseite anzeigen"
  : "Rückseite anzeigen";
    
Die sichtbare Beschriftung beschreibt immer, was beim nächsten Klick geschieht.

Reduzierte Bewegung berücksichtigen

Hat ein Benutzer reduzierte Bewegung eingestellt, wird die lange Drehbewegung entfernt.

@media (prefers-reduced-motion: reduce) {
  .card-3d {
    transition: none;
  }
}
    
Die Karte bleibt weiterhin bedienbar. Lediglich die animierte Übergangsbewegung wird deaktiviert.

Zusammenfassung der 3D-Transformationen

Grundprinzip der 3D-Darstellung

CSS-3D-Transformationen erweitern die zweidimensionale Darstellung um eine zusätzliche räumliche Achse. Neben der x- und y-Achse steht deshalb auch die z-Achse zur Verfügung.

Achse Richtung Beispiele
x-Achse Waagerecht: links und rechts translateX(), rotateX()
y-Achse Senkrecht: oben und unten translateY(), rotateY()
z-Achse Räumlich: zum Betrachter oder vom Betrachter weg translateZ(), rotateZ()
Die z-Achse wird erst durch eine Perspektive beziehungsweise eine räumliche Anordnung sichtbar.

Die wichtigsten CSS-Eigenschaften

Eigenschaft Beschreibung Beispiel
perspective Legt den Abstand zwischen dem Betrachter und der 3D-Szene fest. perspective: 1000px;
perspective-origin Bestimmt den Blickpunkt auf die 3D-Szene. perspective-origin: center top;
transform Verschiebt, dreht, skaliert oder verzerrt ein Element. transform: rotateY(45deg);
transform-style Bestimmt, ob untergeordnete Elemente räumlich angeordnet bleiben. transform-style: preserve-3d;
transform-origin Legt den Mittelpunkt einer Transformation fest. transform-origin: center left;
backface-visibility Bestimmt, ob die Rückseite eines gedrehten Elements sichtbar ist. backface-visibility: hidden;

3D-Transformationsfunktionen

Funktion Wirkung Beispiel
translateX() Verschiebt entlang der x-Achse. translateX(50px)
translateY() Verschiebt entlang der y-Achse. translateY(-30px)
translateZ() Verschiebt zum Betrachter oder vom Betrachter weg. translateZ(100px)
translate3d() Verbindet die Verschiebung auf allen drei Achsen. translate3d(20px, 30px, 100px)
rotateX() Dreht um die waagerechte x-Achse. rotateX(45deg)
rotateY() Dreht um die senkrechte y-Achse. rotateY(180deg)
rotateZ() Dreht innerhalb der sichtbaren Fläche um die z-Achse. rotateZ(30deg)
rotate3d() Dreht um eine frei definierbare räumliche Achse. rotate3d(1, 1, 0, 45deg)
scaleX() Skaliert entlang der x-Achse. scaleX(1.2)
scaleY() Skaliert entlang der y-Achse. scaleY(0.8)
scaleZ() Skaliert räumliche Abstände entlang der z-Achse. scaleZ(1.5)
scale3d() Verbindet die Skalierung auf allen drei Achsen. scale3d(1.2, 1.2, 1.5)
rotateZ() entspricht optisch meist der bekannten zweidimensionalen Funktion rotate().

Perspektive richtig einsetzen

Die Eigenschaft perspective wird meistens auf dem übergeordneten Szenenbereich festgelegt.

.scene {
  perspective: 1000px;
}

.element {
  transform: rotateY(45deg);
}
    
Perspektivwert Wirkung
300px Starke, auffällige räumliche Verzerrung
800px Deutliche und meist ausgewogene Tiefenwirkung
1500px Schwache und zurückhaltende Tiefenwirkung
none Keine Perspektive durch diese Eigenschaft
Ein kleiner Perspektivwert erzeugt eine starke Tiefenwirkung. Ein großer Perspektivwert erzeugt eine schwächere Tiefenwirkung.

perspective und perspective()

Die CSS-Eigenschaft und die Transformationsfunktion besitzen eine ähnliche Aufgabe, werden aber an unterschiedlichen Stellen eingesetzt.

Schreibweise Einsatz Wirkung
perspective: 1000px; Auf dem übergeordneten Element Gemeinsame Perspektive für die transformierten Kindelemente
transform: perspective(1000px); Direkt auf dem transformierten Element Eigene Perspektive für dieses einzelne Element
.scene {
  perspective: 1000px;
}

.element {
  transform:
    perspective(1000px)
    rotateY(45deg);
}
    
Für zusammengehörende 3D-Objekte wie Würfel oder Bildergalerien ist eine gemeinsame perspective auf dem Szenenbereich meistens besser geeignet.

Räumliche Unterelemente erhalten

Standardmäßig werden untergeordnete Elemente in die Ebene ihres übergeordneten Elements projiziert. Mit transform-style: preserve-3d behalten sie ihre räumlichen Positionen.

.object-3d {
  position: relative;
  transform-style: preserve-3d;
}

.object-part {
  position: absolute;
  transform: translateZ(100px);
}
    
preserve-3d wird auf das gemeinsame übergeordnete 3D-Element angewendet, nicht auf den äußeren Perspektivbereich.

Die Reihenfolge der Transformationen

Mehrere Transformationsfunktionen werden nicht unabhängig voneinander ausgeführt. Ihre Reihenfolge verändert das Ergebnis.

Zuerst drehen, dann lokal verschieben

transform:
  rotateY(60deg)
  translateZ(300px);
        

Diese Reihenfolge eignet sich beispielsweise zum kreisförmigen Anordnen der Bilder in unserer 3D-Galerie.

Zuerst verschieben, dann drehen

transform:
  translateZ(300px)
  rotateY(60deg);
        

Hier entsteht eine andere Position, weil die Transformationen in einem anderen Koordinatensystem wirken.

Die Transformationsfunktionen werden als Gesamtausdruck verarbeitet. Vertauschte Funktionen können deshalb ein deutlich anderes Ergebnis erzeugen.

Vorderseiten und Rückseiten

Bei gedrehten Karten und Flächen kann die Rückseite des Elements sichtbar werden. Mit backface-visibility wird ihre Darstellung gesteuert.

.card-side {
  backface-visibility: hidden;
}

.card-back {
  transform: rotateY(180deg);
}
    
Wert Wirkung
visible Die Rückseite bleibt sichtbar. Dies ist der Standardwert.
hidden Die Rückseite wird ausgeblendet.

3D-Transformationen animieren

Transformationen lassen sich mit transition oder @keyframes animieren.

Übergang mit transition

.card {
  transition:
    transform 0.8s ease-in-out;
}

.card.is-flipped {
  transform: rotateY(180deg);
}
        

Diese Variante eignet sich für eine durch den Benutzer ausgelöste Zustandsänderung.

Daueranimation mit @keyframes

.object {
  animation:
    rotate-object 10s linear infinite;
}

@keyframes rotate-object {
  to {
    transform: rotateY(360deg);
  }
}
        

Diese Variante eignet sich für automatisch wiederholte Bewegungen.

Animationen barrierearm gestalten

Starke und dauerhafte 3D-Bewegungen können für manche Menschen unangenehm sein. Die Benutzereinstellung für reduzierte Bewegung sollte deshalb berücksichtigt werden.

@media (prefers-reduced-motion: reduce) {
  .animated-object {
    animation: none;
    transition: none;
  }
}
    
  • Daueranimationen sollten angehalten oder deaktiviert werden.
  • Die Funktion eines Elements muss auch ohne Animation erhalten bleiben.
  • Interaktive Animationen sollten mit Maus und Tastatur bedienbar sein.
  • Ein sichtbarer Tastaturfokus darf nicht entfernt werden.
Bewegung sollte die Bedienung unterstützen und nicht vom eigentlichen Inhalt ablenken.

Typischer Aufbau eines 3D-Elements

Viele CSS-3D-Beispiele verwenden denselben dreiteiligen Grundaufbau.

<div class="scene">
  <div class="object-3d">
    <div class="object-part">
      Inhalt
    </div>
  </div>
</div>
    
.scene {
  perspective: 1000px;
}

.object-3d {
  position: relative;
  transform-style: preserve-3d;
}

.object-part {
  position: absolute;
  backface-visibility: hidden;
}
    
Ebene Aufgabe
.scene Erzeugt den Blick auf die räumliche Szene.
.object-3d Hält die Bestandteile zusammen und bewahrt ihre räumliche Anordnung.
.object-part Bildet eine einzelne Fläche oder einen Bestandteil des 3D-Objekts.

Checkliste für eigene 3D-Beispiele

  • Besitzt der äußere Szenenbereich eine passende perspective?
  • Verwendet der gemeinsame Objektcontainer transform-style: preserve-3d?
  • Sind die einzelnen Flächen korrekt positioniert und transformiert?
  • Wurde die Reihenfolge mehrerer Transformationsfunktionen geprüft?
  • Soll die Rückseite mit backface-visibility: hidden ausgeblendet werden?
  • Funktioniert die Darstellung auch auf kleinen Bildschirmen?
  • Sind interaktive Elemente mit der Tastatur bedienbar?
  • Wird prefers-reduced-motion berücksichtigt?
  • Bleiben wichtige Inhalte auch ohne 3D-Effekt verständlich?

Fazit

Mit CSS-3D-Transformationen können Elemente räumlich verschoben, gedreht und animiert werden. Die wichtigsten Grundlagen bilden perspective, transform-style: preserve-3d, die Transformationsfunktionen und backface-visibility.

Auf dieser Seite wurden diese Techniken schrittweise erklärt und unter anderem auf Karten, einen Würfel, eine Bildergalerie und eine interaktive 3D-Karte angewendet.

Damit ist die Lernseite zu den CSS-3D-Transformationen vollständig.