Um eine frei bestimmte 3D-Achse drehen
Die Funktion rotate3d()
Mit rotate3d() kann eine Drehachse frei im dreidimensionalen Raum
festgelegt werden. Dazu werden drei Zahlen fĂĽr die Richtung der Achse und
anschlieĂźend der Drehwinkel angegeben.
transform: rotate3d(x, y, z, winkel);
| Parameter |
Aufgabe |
x |
Anteil der x-Achse an der Drehachse |
y |
Anteil der y-Achse an der Drehachse |
z |
Anteil der z-Achse an der Drehachse |
winkel |
Drehwinkel, beispielsweise in deg,
rad, grad oder turn
|
.element {
transform: rotate3d(1, 1, 0, 45deg);
}
Die ersten drei Werte sind keine Winkel und normalerweise auch keine
Längenangaben. Sie beschreiben gemeinsam einen Richtungsvektor für die
Drehachse.
Bekannte Drehachsen mit rotate3d() beschreiben
Auch die Funktionen rotateX(), rotateY() und
rotateZ() lassen sich mit rotate3d() ausdrĂĽcken.
| Kurzschreibweise |
Entsprechende rotate3d()-Schreibweise |
Drehachse |
rotateX(45deg) |
rotate3d(1, 0, 0, 45deg) |
x-Achse |
rotateY(45deg) |
rotate3d(0, 1, 0, 45deg) |
y-Achse |
rotateZ(45deg) |
rotate3d(0, 0, 1, 45deg) |
z-Achse |
Enthält nur einer der ersten drei Werte eine 1 und die beiden
anderen Werte eine 0, verläuft die Drehachse genau entlang
einer der drei Hauptachsen.
Unterschiedliche Drehachsen vergleichen
In allen Beispielen beträgt der Drehwinkel 55deg. Nur der
Richtungsvektor der Drehachse wird verändert.
x- und y-Achse
.rotate3d-xy {
transform:
rotate3d(1, 1, 0, 55deg);
}
x- und z-Achse
.rotate3d-xz {
transform:
rotate3d(1, 0, 1, 55deg);
}
Alle drei Achsen
.rotate3d-xyz {
transform:
rotate3d(1, 1, 1, 55deg);
}
Das Verhältnis der Achsenwerte
Entscheidend ist das Verhältnis der ersten drei Werte zueinander. Der Browser
normalisiert den Richtungsvektor vor der Berechnung der Drehung.
.element-a {
transform: rotate3d(1, 1, 0, 45deg);
}
.element-b {
transform: rotate3d(2, 2, 0, 45deg);
}
Beide Beispiele erzeugen dieselbe Drehachse, weil das Verhältnis der Werte
jeweils 1 : 1 : 0 beträgt.
| Richtungsvektor |
Bedeutung |
1, 1, 0 |
x- und y-Achse sind gleich stark beteiligt. |
2, 1, 0 |
Die x-Richtung ist doppelt so stark gewichtet wie die y-Richtung. |
1, 2, 0 |
Die y-Richtung ist doppelt so stark gewichtet wie die x-Richtung. |
1, 1, 1 |
Alle drei Achsen sind gleich stark beteiligt. |
Die Werte müssen nicht auf 0 und 1 beschränkt sein.
Auch negative Werte und Dezimalzahlen sind möglich.
Negative Achsenwerte und negative Winkel
Die Richtung einer Drehung kann sowohl durch einen negativen Achsenvektor als
auch durch einen negativen Drehwinkel umgekehrt werden.
.element-a {
transform: rotate3d(1, 1, 0, -45deg);
}
.element-b {
transform: rotate3d(-1, -1, 0, 45deg);
}
Diese beiden Angaben beschreiben dieselbe Drehung, weil sowohl die Richtung
der Achse als auch das Vorzeichen des Winkels die Drehrichtung beeinflussen.
Negative Achsenwerte sind gültig, können die Schreibweise aber schwerer
verständlich machen. Für gut lesbaren CSS-Code ist ein positiver
Richtungsvektor mit einem negativen Winkel häufig übersichtlicher.
Der ungĂĽltige Nullvektor
Mindestens einer der ersten drei Werte muss ungleich 0 sein.
Die folgende Angabe besitzt keine gĂĽltige Drehachse:
.element {
transform: rotate3d(0, 0, 0, 45deg);
}
rotate3d(0, 0, 0, 45deg) kann keine Drehung erzeugen, weil der
Vektor 0, 0, 0 keine Richtung beschreibt.
Wann ist rotate3d() sinnvoll?
FĂĽr Drehungen um eine einzelne Hauptachse sind
rotateX(), rotateY() und
rotateZ() meistens leichter lesbar. rotate3d()
wird vor allem dann verwendet, wenn eine schräg im Raum verlaufende Drehachse
benötigt wird.
- Räumlich drehende Karten und Kacheln
- 3D-Objekte und WĂĽrfel
- Komplexere Hover-Effekte
- Animationen mit einer frei bestimmten Drehachse
Verwende die einfachste verständliche Schreibweise: eine einzelne
Hauptachse mit rotateX(), rotateY() oder
rotateZ() und frei verlaufende Achsen mit
rotate3d().
Elemente im 3D-Raum skalieren
Skalierung entlang der drei Achsen
Mit scaleX(), scaleY() und
scaleZ() kann ein Element entlang einer einzelnen Achse
skaliert werden. Die Funktion scale3d() fasst alle drei
Achsen in einer Schreibweise zusammen.
| Funktion |
Wirkung |
scaleX() |
Skaliert entlang der waagrechten x-Achse. |
scaleY() |
Skaliert entlang der senkrechten y-Achse. |
scaleZ() |
Skaliert entlang der räumlichen z-Achse. |
scale3d() |
Skaliert entlang der x-, y- und z-Achse gleichzeitig. |
.element {
transform: scale3d(1.2, 0.8, 1.5);
}
Die Skalierungswerte sind einheitslose Zahlen. Werte größer als
1 vergrößern, Werte zwischen 0 und
1 verkleinern das Element entlang der jeweiligen Achse.
Skalierung entlang der z-Achse
Mit scaleZ() wird die räumliche Tiefe eines Elements oder
seiner 3D-Kindelemente skaliert.
.element {
transform: scaleZ(1.5);
}
scaleZ(1) behält die ursprüngliche Tiefe bei.
scaleZ(2) verdoppelt die Abstände entlang der z-Achse.
scaleZ(0.5) halbiert die Abstände entlang der z-Achse.
-
Ein negativer Wert kehrt zusätzlich die Richtung der z-Achse um.
Bei einem flachen einzelnen Element ist scaleZ() meistens
nicht unmittelbar sichtbar. Ein HTML-Element besitzt normalerweise keine
eigene geometrische Tiefe, die dadurch größer werden könnte.
Warum scaleZ() allein kaum sichtbar ist
Die Breite und Höhe einer normalen Box liegen auf der x- und y-Achse.
Eine Skalierung entlang der z-Achse verändert deshalb weder ihre sichtbare
Breite noch ihre sichtbare Höhe.
Ohne räumliche Verschiebung
.scale-z-only {
transform: scaleZ(2);
}
Mit translateZ()
scaleZ(2)
translateZ(60px)
.scale-z-translate {
transform:
scaleZ(2)
translateZ(60px);
}
Im zweiten Beispiel wirkt scaleZ(2) auf die nachfolgende
Verschiebung entlang der z-Achse. Dadurch entsteht effektiv ein größerer
Abstand zum Betrachter.
Alle drei Achsen mit scale3d() skalieren
Die Funktion scale3d() erwartet drei Zahlen in der
Reihenfolge x, y und z:
transform: scale3d(x, y, z);
| Parameter |
Aufgabe |
x |
Skalierungsfaktor entlang der x-Achse |
y |
Skalierungsfaktor entlang der y-Achse |
z |
Skalierungsfaktor entlang der z-Achse |
.element {
transform: scale3d(1.4, 0.8, 2);
}
Diese Angabe bedeutet:
- Vergrößerung der Breite auf
140 %,
- Verkleinerung der Höhe auf
80 % und
- Verdoppelung der räumlichen Abstände entlang der z-Achse.
Unterschiedliche Skalierungen vergleichen
Breiter
.scale3d-wide {
transform:
scale3d(1.4, 1, 1);
}
Höher
.scale3d-high {
transform:
scale3d(1, 1.4, 1);
}
Breiter und höher
.scale3d-large {
transform:
scale3d(1.3, 1.3, 1);
}
Der dritte Wert ist in diesen Beispielen 1. Dadurch wird die
z-Achse nicht verändert.
scale3d() und die einzelnen Funktionen vergleichen
| Einzelfunktion |
Entsprechende scale3d()-Schreibweise |
scaleX(1.5) |
scale3d(1.5, 1, 1) |
scaleY(1.5) |
scale3d(1, 1.5, 1) |
scaleZ(1.5) |
scale3d(1, 1, 1.5) |
scale(1.5) |
scale3d(1.5, 1.5, 1) |
scale(1.5, 0.8) |
scale3d(1.5, 0.8, 1) |
Werden nur Breite und Höhe verändert, sind scale(),
scaleX() und scaleY() meistens leichter
verständlich. scale3d() ist besonders bei kombinierten
räumlichen Transformationen sinnvoll.
Null und negative Skalierungswerte
Der Wert 0 reduziert die Ausdehnung entlang der betreffenden
Achse vollständig. Negative Werte skalieren das Element und spiegeln es
zusätzlich entlang dieser Achse.
Waagrecht gespiegelt
.scale3d-mirror-x {
transform:
scale3d(-1, 1, 1);
}
Senkrecht gespiegelt
.scale3d-mirror-y {
transform:
scale3d(1, -1, 1);
}
Bei negativen Skalierungswerten wird auch der Inhalt gespiegelt. Texte sind
dadurch normalerweise nicht mehr angenehm lesbar.
Reihenfolge von Skalierung und Verschiebung
Wird eine Skalierung mit einer Verschiebung kombiniert, beeinflusst die
Reihenfolge der Funktionen das Ergebnis.
.element-a {
transform:
scaleZ(2)
translateZ(60px);
}
.element-b {
transform:
translateZ(60px)
scaleZ(2);
}
Im ersten Beispiel wird die nachfolgende Verschiebung entlang der z-Achse
durch scaleZ(2) mit skaliert. Im zweiten Beispiel wird zuerst
verschoben; die anschließende z-Skalierung verändert diese bereits
ausgefĂĽhrte Verschiebung nicht auf dieselbe Weise.
Transformationsfunktionen sollten nicht beliebig vertauscht werden. Auch
wenn dieselben Funktionen und Werte verwendet werden, kann eine andere
Reihenfolge zu einem deutlich anderen Ergebnis fĂĽhren.