CSS 3D-Transforms
Optional Advanced hat gerade Zeiger, Caret und natives Chrome justiert. Diese letzte optionale Lektion ist ein anderes Werkzeug: 3D-Transforms. Eine Karte bekommt einen Fluchtpunkt und kippt in die Tiefe. Du wiederholst nicht die 2D-Hover-Lektion mit translate / scale und wählst weder Cursor noch Resize-Griff.
Direkte Antwort
CSS-3D-Transforms nutzen dieselbe transform-Eigenschaft wie 2D, plus Tiefe. Setze perspective auf ein Elternelement, damit Kinder einen gemeinsamen Fluchtpunkt haben (perspective-origin verschiebt ihn). rotateX und rotateY kippen um die horizontale und vertikale Achse; rotateZ ist die bekannte flache Drehung. translateZ bewegt sich zum Betrachter oder weg. transform-style: preserve-3d hält Kinder in einer Szene statt sie flachzudrücken. backface-visibility: hidden versteckt eine Fläche, die sich abwendet — nützlich für eine zweiseitige Karte. Der Layout-Platz bleibt wie in 2D. Halte Winkel klein. Respektiere prefers-reduced-motion.
Warum das weder 2D-Bewegung noch UI-Chrome ist
Die 2D-Transforms-Lektion lehrte Bewegung in der Ebene: translate, rotate, scale, skew und transform-origin als Scharnier. Das gilt weiter. 3D bringt eine kameraähnliche perspective und Extra-Achsen. User-Interface-CSS war Interaktions-Chrome (cursor, resize, caret-color, appearance). Eine gedrehte Karte braucht keine lügende Hand, und ein Textarea-Griff ist kein Fluchtpunkt. Reicht ein 2-Pixel-Hub, bleib bei 2D.
Perspective — Kamera auf das Elternelement
perspective ist eine Länge: kleinere Werte wirken näher und dramatischer, größere flacher. Setze sie auf die Bühne, nicht auf jede Fläche, damit Geschwister einen Fluchtpunkt teilen.
.stage {
perspective: 800px;
perspective-origin: 50% 40%;
}
.card-3d {
transform: rotateY(18deg);
transform-origin: center;
}
Du kannst auch transform: perspective(800px) rotateY(18deg) auf ein Element schreiben. Diese Kamera gehört nur zu dieser Box. Für einen Würfel oder eine Kachelreihe ist Eltern-perspective ruhiger. perspective-origin ist der Fluchtpunkt-Cousin von transform-origin — es ersetzt nicht den Pivot der drehenden Fläche.
Achsen — rotateX, rotateY, rotateZ
Denk an ein Buch. rotateY schwingt den Deckel links–rechts. rotateX nickt ihn zu dir oder weg. rotateZ dreht auf der Seite — das 2D-rotate(), das du kennst.
.tile-y {
transform: rotateY(-22deg);
}
.tile-x {
transform: rotateX(12deg);
}
.tile-z {
transform: rotateZ(8deg);
}
Kette bei Bedarf mit 2D-Funktionen: rotateY(16deg) translateZ(24px). Die Reihenfolge zählt — spätere Funktionen laufen im lokalen Raum der früheren. Eine transform-Liste reicht, wie in 2D. Großes rotateX(80deg) auf einem ganzen Artikel ist Jahrmarkt, keine UI.
translateZ — Abstand, kein Layout-Schub
Mit Perspective kommt positives translateZ oft zum Betrachter. Nachbarn im Dokument rücken nicht; nur die Malerei bewegt sich, wie 2D-translate.
.stage {
perspective: 900px;
}
.pop-face {
transform: translateZ(40px) rotateY(-8deg);
}
.back-face {
transform: translateZ(-28px);
}
Nutze translateZ, um Szenenflächen zu trennen, nicht um margin oder gewöhnliches z-index zu faken. z-index ordnet überlappende Boxen im 2D-Layout; 3D-Abstand ist ein anderer Knopf. Ist der Job „Chip um 2px heben“, reicht translateY aus der 2D-Lektion.
preserve-3d — Szene halten, nicht plätten
Standardmäßig plättet ein Elternelement transformierte Kinder (transform-style: flat). Die 3D-Beziehung geht verloren. Für Würfel, gestapelten Deckel oder zweiseitige Karte setze preserve-3d auf den drehenden Wrapper.
.scene {
perspective: 700px;
}
.rig {
transform-style: preserve-3d;
transition: transform 0.45s ease;
}
.rig.is-flipped {
transform: rotateY(180deg);
}
.face {
position: absolute;
inset: 0;
backface-visibility: hidden;
}
Jeder Vorfahr, der Tiefe halten soll, braucht preserve-3d — ein vergessenes flat stampft den Würfel zum Poster. Üblich: perspective außen, preserve-3d innen am Gestell: Kamera draußen, Gelenke drinnen.
backface-visibility — die Rückseite verstecken
Dreht sich eine Fläche über 90°, sähest du sie sonst gespiegelt. backface-visibility: hidden blendet die Rückseite aus. Zwei Flächen: vorn rotateY(0), hinten rotateY(180deg), beide position: absolute auf demselben Gestell.
.card-rig {
position: relative;
transform-style: preserve-3d;
}
.card-front,
.card-back {
position: absolute;
inset: 0;
backface-visibility: hidden;
}
.card-back {
transform: rotateY(180deg);
}
Ohne versteckte Rücken siehst du ein Gespenst der Vorderseite. Das ist nicht user-select: none und nicht appearance: none. Du versteckst eine gemalte Fläche in 3D, du ziehst keinem Checkbox das Fell ab.
3D vs. 2D-Transform vs. UI-Chrome
📊 3D vs 2D transform vs UI chrome
| Tool | Job | Poor fit |
|---|---|---|
perspective + rotateX / rotateY / translateZ |
Tiefenszene: Kipp, Abstand, gemeinsamer Fluchtpunkt | Alltagshover um 2px; Zeigerform |
2D translate / rotate / scale / skew |
Bewegung in der Ebene; Origin-Scharnier | Würfel ohne preserve-3d |
transform-style / backface-visibility |
Verschachtelte 3D-Flächen; Rückseiten ausblenden | Caret-Farbe; Textarea-Resize |
UI (cursor, resize, appearance…) |
Interaktions-Chrome an Steuerelementen | Fluchtpunkte; Kartenumdrehen |
Optional Advanced hat schon Steuerelemente gestylt. Effects & Motion hat 2D-Abbildung gelehrt. Hier kommt die Tiefen-Schicht auf transform. cursor: pointer auf einer Überschrift, weil sie rotateY hat, macht sie nicht 3D. perspective auf einem Login ersetzt nicht resize am Notizfeld.
Ruhige Gewohnheiten
Halte Perspective für UI-Karten im Bereich einiger hundert Pixel (600px–1200px ist vernünftig). Setze nicht perspective: 40px auf body. Kombiniere :hover oder Klassen mit kurzem transition auf transform — wie in 2D. Dämpfe mit prefers-reduced-motion: reduce (none oder kleiner 2D-Nudge). Tastaturfokus braucht weiter einen sichtbaren Ring; ein Flip ist kein Fokus-Stil.
.preview {
perspective: 1000px;
}
.preview .plate {
transition: transform 0.3s ease;
}
.preview:hover .plate {
transform: rotateY(-10deg) rotateX(4deg);
}
@media (prefers-reduced-motion: reduce) {
.preview .plate,
.preview:hover .plate {
transition: none;
transform: none;
}
}
Dieser Hover ist ein Kipp, nicht der 2D-Chip-Hub translateY(-0.15rem) und nicht resize: vertical am Feld. Wollen Nutzer mit weniger Bewegung eine ruhige Karte, glaub ihnen.
Selbst ausprobieren
- Wickle eine Karte in
.stage { perspective: 800px; }und setzerotateY(20deg)auf das Kind — dann legeperspectivein dastransformdes Kindes und vergleiche Geschwisterkacheln. - Baue eine zweiseitige Karte:
preserve-3dam Gestell,backface-visibility: hiddenauf beiden Flächen, RückseiterotateY(180deg). - Setze
translateZ(32px)auf die Vorderfläche; prüfe, dass Layout-Nachbarn nicht rücken. - Flippe per Klasse +
transition: transform— dann plätte mitprefers-reduced-motion. - Löse das nicht mit
cursor,resizeoder nur 2D-translateY.
Typische Fehler
perspective: 50pxaufbody, bis die ganze Seite verzerrtpreserve-3dam Wrapper vergessen und sich wundern, dass der Würfel flach ist- Den 2D-Chip-Hub (
translateY) für eine 3D-Lektion halten - UI-Chrome (
cursor,resize,appearance) als Tiefenersatz backface-visibilityauf der Bühne statt auf den Flächenprefers-reduced-motionbei großenrotateY-Flips ignorieren- Erwarten, dass 3D den Dokumentfluss wie
marginändert
Zusammenfassung
- 3D-Transforms geben
transformTiefe: Perspective,rotateX/rotateY,translateZ - Perspective auf die Eltern-Szene; preserve-3d, damit verschachtelte Flächen im Raum bleiben
- backface-visibility: hidden versteckt eine abgewandte Fläche
- Weder 2D-Hover-Hub noch User-Interface-Chrome
- Winkel klein halten; reduzierte Bewegung achten
- Letzte CSS-Lektion dieses Kurses — Optional Advanced endet hier; kein weiterer CSS-Slug in der Karte
🧠 Testen Sie Ihr Wissen
Testen Sie Ihr Wissen
Fordern Sie sich mit diesem interaktiven Quiz heraus und sehen Sie, wie gut Sie das Thema verstehen
📝 Anweisungen
- Lesen Sie jede Frage sorgfältig
- Wählen Sie die beste Antwort für jede Frage
- Sie können das Quiz so oft wiederholen, wie Sie möchten
- Ihr Fortschritt wird oben angezeigt