CSS 3D-Würfel: Wie kann ich die Rückseite so wie die anderen Würfelseiten bewegen lassen?
Ich habe einen 3D-Würfel per CSS erstellt und würde ihm nun gerne eine 3D-Animation beim Hovern verleihen.
An sich komme ich auf das richtige Ergebnis, aber irgendwie verstehe ich die Rotation der Rückseite nicht und würde gerne wissen, wie ich sie so wie die anderen Würfelseiten bewegen lasse und nicht über diese komische Seitwärtsbewegung. Beziehungsweise ich möchte wissen, weswegen es bei rotateX überhaupt eine Seitwärtsbewegung durchführt.
Hier der Code:
HTML:
<div class="scene">
<div class="cube">
<div class="cube__face cube__face--front"></div>
<div class="cube__face cube__face--back">back</div>
<div class="cube__face cube__face--right">right</div>
<div class="cube__face cube__face--left">left</div>
<div class="cube__face cube__face--top">top</div>
<div class="cube__face cube__face--bottom">bottom</div>
</div>
</div>
CSS:
.scene {
width: 200px;
height: 200px;
border: 1px solid #CCC;
margin: 80px;
perspective: 400px;
transition-duration: 1s
}
.cube {
transition-duration: 1s;
width: 100%;
height: 100%;
position: relative;
transform-style: preserve-3d;
transform: translateZ(-100px);
}
.scene:hover .cube {
transform: translateZ(-10px);
}
.cube__face {
;
border: 3px solid black;
position: absolute;
width: 200px;
height: 200px;
color: white;
font-size: 2.5em;
transform: scale(2.5);
text-align: center;
font-weight: bold;
line-height: 200px;
transform: perspective(500px) translateZ(250px)
}
.cube__face--front {
transition-duration: 1s;
transform: rotateY(0deg) translateZ(100px);
background: url(Gesichr.png) hsla(214, 100%, 46%, 0.7);
opacity: 0.5;
background-size: cover;
}
.cube__face--right {
transition-duration: 1s;
transform: rotateY(90deg) translateZ(100px);
background: hsla(99, 100%, 36%, 0.7);
}
.cube__face--back {
transition-duration: 1s;
transform: rotateY(180deg) translateZ(100px);
background: hsla(63, 99%, 59%,0.7)
}
.cube__face--left {
transition-duration: 1s;
transform: rotateY(-90deg) translateZ(100px);
background: hsla(10, 100%, 50%, 0.7)
}
.cube__face--top {
transition-duration: 1s;
transform: rotateX(90deg) translateZ(100px);
background: hsla(181, 100%, 67%,0.8)
}
.cube__face--bottom {
transition-duration: 1s;
transform: rotateX(-90deg) translateZ(100px);
background: hsla(38, 100%, 52%,0.7)
}
.scene:hover .cube__face--front {
transform: rotatex(-30deg) translateZ(100px);
}
.scene:hover .cube__face--right {
transform: rotateY(90deg) translateZ(100px) rotatez(-30deg);
}
.scene:hover .cube__face--back {
transform: rotateY(0deg) rotateX(150deg) translateZ(100px) rotate(-180deg);
}
.scene:hover .cube__face--left {
transform: rotateY(-90deg) translateZ(100px) rotatez(30deg);
}
.scene:hover .cube__face--top {
transform: rotateX(60deg) translateZ(100px);
}
.scene:hover .cube__face--bottom {
transform: rotateX(-120deg) translateZ(100px);
}
1 Antwort
Ich denke, dieser Effekt kommt aufgrund der vielen Rotationen zustande, die du vornimmst. Visuell sichtbar wird das dann aufgrund der zeitlichen Verzögerung beim Übergang (transition).
Lasse doch zunächst die Rotation auf der y-Achse weg und orientiere dich für den hover-Effekt an dem Selektor für die Vorderseite.
.cube__face--back {
transition-duration: 1s;
transform: translateZ(-100px);
/* ... */
}
.scene:hover .cube__face--back {
transform: rotateX(-30deg) translateZ(-100px);
}
Den Text würde ich in ein separates Element packen, um ihn spiegelverkehrt ausgeben zu lassen. Das geht hardkodiert mit dem bdo-Element:
<div class="cube__face cube__face--back"><bdo dir="rtl">back</bdo></div>
oder mit einem span-Element (statt bdo) und CSS:
.cube__face--back span {
display: inline-block;
transform: scaleX(-1);
}