本篇同步發表於我的 Hashnode 部落格:
Eva Chen | 網頁設計師下班後 (hashnode.dev)
CSS 的 3D transform 讓我們可以在網頁上建立 3D 立體效果,讓元素看起來像是在一個 3D 空間中移動或旋轉。
要使用 3D transform,除了了解各種 3D 函數,還必須正確設置場景的深度和視角。在本篇文章中,我們將先了解如何建立 3D 場景,再學習常見的 3D transform 函數。
在開始 3D transform 之前,我們需要設置一個具有深度的 3D 場景。這可以透過 perspective、perspective-origin 和 transform-style: preserve-3d; 這三個屬性來實現。
perspective - 設定場景的深度perspective 屬性決定了觀察者距離 3D 場景的距離,也就是說,它控制了元素的透視效果。
語法:
perspective: value;
value: 距離值,單位為 px。數值越小,透視效果越強烈,數值越大,則效果越弱。範例:
.scene {
perspective: 1000px; /* 距離場景 1000px,產生適度的透視效果 */
}
perspective-origin - 控制視角perspective-origin 控制透視效果的視角點,默認是視窗的中心點,這個屬性可以用來改變觀察者的視角。
語法:
perspective-origin: x-axis y-axis;
x-axis: 定義水平視角位置,可以是 left、center、right,或者具體的 px、% 值。
y-axis: 定義垂直視角位置,可以是 top、center、bottom,或者具體的 px、% 值。
範例:
.scene {
perspective: 1000px;
perspective-origin: left top; /* 從場景的左上角觀看 3D 場景 */
}
transform-style: preserve-3d - 保留 3D transform 效果當我們對子元素應用 3D transform 時,需要讓父容器使用 transform-style: preserve-3d;,以保留其子元素的 3D transform 效果。
語法:
transform-style: preserve-3d;
範例:
.scene {
transform-style: preserve-3d;
}
現在,我們已經建立了一個 3D 場景,可以開始使用 3D transform 函數來操作元素了。
transform 函數3D transform 函數的使用方式與 2D transform 類似,只不過它們允許我們沿著三個軸進行操作:X 軸、Y 軸、Z 軸。
rotateX() - 沿 X 軸旋轉rotateX() 函數用來讓元素沿著 X 軸進行旋轉。
語法:
transform: rotateX(angle);
angle: 旋轉角度(正值順時針,負值逆時針)範例:
.box {
transform: rotateX(45deg); /* 沿 X 軸旋轉 45 度 */
}
rotateY() - 沿 Y 軸旋轉rotateY() 函數讓元素沿著 Y 軸進行旋轉。
語法:
transform: rotateY(angle);
範例:
.box {
transform: rotateY(60deg); /* 沿 Y 軸旋轉 60 度 */
}
rotateZ() - 沿 Z 軸旋轉雖然 Z 軸的旋轉實際上也能在 2D transform 中使用,但它在 3D 場景中同樣重要。Z 軸旋轉會讓元素在平面內旋轉。
語法:
transform: rotateZ(angle);
範例:
.box {
transform: rotateZ(90deg); /* 沿 Z 軸旋轉 90 度 */
}
translateZ() - 沿 Z 軸移動translateZ() 函數讓元素在 Z 軸上移動,創造出遠離或接近觀察者的效果。
語法:
transform: translateZ(value);
value: 移動的距離,正值靠近觀察者,負值遠離觀察者範例:
.box {
transform: translateZ(200px); /* 元素將向觀察者靠近 200px */
}
scaleZ() - 沿 Z 軸縮放scaleZ() 用來控制元素在 Z 軸上的縮放。
語法:
transform: scaleZ(value);
範例:
.box {
transform: scaleZ(1.5); /* 在 Z 軸方向放大 1.5 倍 */
}
<div class="scene">
<div class="container">
<div class="box">3D 物件</div>
</div>
</div>
<style>
.scene {
perspective: 800px;
}
.container {
transform-style: preserve-3d;
}
.box {
width: 100px;
height: 100px;
background: lightblue;
transform: rotateX(30deg) rotateY(45deg) translateZ(100px);
}
</style>
transform 的應用場景我們可以使用多個面組成一個立方體,並且將每一個面做不同的 3D transform 來構建立方體效果。
<div class="scene">
<div class="cube">
<div class="face front">Front</div>
<div class="face back">Back</div>
<div class="face left">Left</div>
<div class="face right">Right</div>
<div class="face top">Top</div>
<div class="face bottom">Bottom</div>
</div>
</div>
.scene {
perspective: 800px;
}
.cube {
position: relative;
transform-style: preserve-3d;
transform: rotateX(45deg) rotateY(45deg);
width: 100px;
height: 100px;
}
.face {
position: absolute;
width: 100px;
height: 100px;
background: rgba(255, 165, 0, 0.8);
border: 1px solid #fff;
}
.front { transform: translateZ(50px); }
.back { transform: rotateY(180deg) translateZ(50px); }
.left { transform: rotateY(-90deg) translateZ(50px); }
.right { transform: rotateY(90deg) translateZ(50px); }
.top { transform: rotateX(90deg) translateZ(50px); }
.bottom { transform: rotateX(-90deg) translateZ(50px); }

DEMO: 3D Cube Cartoon Menu