CSS transform 變形
transform 屬性可以對元素進行變形操作,包括平移、旋轉、縮放和傾斜,而不會影響周圍元素的佈局。
translate(平移)
移動元素的位置。
.box {
transform: translateX(50px); /* 向右移動 50px */
transform: translateY(30px); /* 向下移動 30px */
transform: translate(50px, 30px); /* X 和 Y 同時 */
}
負值會往反方向移動:
.box {
transform: translateX(-50px); /* 向左移動 */
transform: translateY(-30px); /* 向上移動 */
}
使用百分比會根據元素自身大小計算:
.box {
transform: translate(-50%, -50%); /* 向左上移動自身寬高的 50% */
}
rotate(旋轉)
旋轉元素,正值順時針,負值逆時針。
.box {
transform: rotate(45deg); /* 順時針旋轉 45 度 */
transform: rotate(-45deg); /* 逆時針旋轉 45 度 */
transform: rotate(0.5turn); /* 旋轉半圈 */
}
3D 旋轉
.box {
transform: rotateX(45deg); /* 沿 X 軸旋轉 */
transform: rotateY(45deg); /* 沿 Y 軸旋轉 */
transform: rotateZ(45deg); /* 沿 Z 軸旋轉(等同 rotate) */
}
scale(縮放)
縮放元素大小,1 是原始大小。
.box {
transform: scale(1.5); /* 放大 1.5 倍 */
transform: scale(0.5); /* 縮小為 0.5 倍 */
transform: scaleX(2); /* 只縮放寬度 */
transform: scaleY(0.8); /* 只縮放高度 */
transform: scale(2, 0.5); /* X 放大 2 倍,Y 縮小 0.5 倍 */
}
負值會產生鏡像效果:
.flip-horizontal {
transform: scaleX(-1); /* 水平翻轉 */
}
.flip-vertical {
transform: scaleY(-1); /* 垂直翻轉 */
}
skew(傾斜)
傾斜元素。
.box {
transform: skewX(20deg); /* 水平傾斜 */
transform: skewY(10deg); /* 垂直傾斜 */
transform: skew(20deg, 10deg); /* X 和 Y 同時 */
}
組合多個變形
用空格分隔,可以同時套用多個變形:
.box {
transform: translate(50px, 50px) rotate(45deg) scale(1.2);
}
變形的順序會影響結果。先旋轉再平移和先平移再旋轉的結果是不同的。
transform-origin(變形原點)
設定變形的參考點,預設是元素中心。
.box {
transform-origin: center; /* 預設,中心點 */
transform-origin: top left; /* 左上角 */
transform-origin: bottom right; /* 右下角 */
transform-origin: 50% 50%; /* 中心(等同 center) */
transform-origin: 0 0; /* 左上角 */
transform-origin: 100% 100%; /* 右下角 */
}
旋轉原點範例
/* 以左上角為中心旋轉 */
.rotate-corner {
transform-origin: top left;
transform: rotate(45deg);
}
/* 以底部中心為中心旋轉 */
.rotate-bottom {
transform-origin: bottom center;
transform: rotate(45deg);
}
3D 變形
perspective(透視)
設定 3D 變形的透視距離,讓 3D 效果更明顯。
.container {
perspective: 1000px; /* 在父元素設定 */
}
.box {
transform: perspective(1000px) rotateY(45deg); /* 或在元素本身設定 */
}
translate3d
.box {
transform: translate3d(50px, 30px, 100px); /* X, Y, Z */
transform: translateZ(100px); /* 只設 Z 軸 */
}
transform-style
讓子元素保持 3D 空間:
.container {
transform-style: preserve-3d;
}
實用範例
置中(絕對定位)
.center {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
Hover 放大效果
.card {
transition: transform 0.3s;
}
.card:hover {
transform: scale(1.05);
}
按鈕點擊效果
.button {
transition: transform 0.1s;
}
.button:active {
transform: scale(0.95);
}
圖片 Hover 效果
.image-container {
overflow: hidden;
}
.image-container img {
transition: transform 0.3s;
}
.image-container:hover img {
transform: scale(1.1);
}
旋轉圖示
.icon {
transition: transform 0.3s;
}
.icon:hover {
transform: rotate(180deg);
}
卡片翻轉
.card-container {
perspective: 1000px;
}
.card {
transform-style: preserve-3d;
transition: transform 0.6s;
}
.card-container:hover .card {
transform: rotateY(180deg);
}
.card-front, .card-back {
backface-visibility: hidden;
}
.card-back {
transform: rotateY(180deg);
}
效能考量
transform 是效能較好的動畫屬性,因為它不會觸發重排 (reflow)。建議在動畫中優先使用:
transformopacity
避免動畫 width、height、margin、padding 等會觸發重排的屬性。