transform-origin - 变换原点

控制所有变换的中心点

什么是 transform-origin?

transform-origin 定义了变换的原点(中心点)。所有的 transform 变换(旋转、缩放、倾斜)都围绕这个点进行。

  • 默认值:center center(元素的中心点,即 50% 50%)
  • 影响范围:影响 rotate、scale、skew 等所有变换
  • 不影响:translate 平移不受原点影响

语法说明

.element {
  transform-origin: x y z;
}
  • x - 水平位置(left, center, right, 百分比, 像素)
  • y - 垂直位置(top, center, bottom, 百分比, 像素)
  • z - Z 轴位置(可选,用于 3D 变换)
/* 关键字 */
transform-origin: center;          /* 中心(默认) */
transform-origin: top left;       /* 左上角 */
transform-origin: bottom right;   /* 右下角 */

/* 百分比 */
transform-origin: 50% 50%;        /* 中心 */
transform-origin: 0% 0%;          /* 左上角 */
transform-origin: 100% 100%;      /* 右下角 */

/* 像素值 */
transform-origin: 50px 50px;      /* 距离左上角 50px */

旋转原点演示

悬停查看不同原点的旋转效果(红点表示旋转中心)

左上

top left

上中

top center

右上

top right

左中

center left

中心

center(默认)

右中

center right

左下

bottom left

下中

bottom center

右下

bottom right

示例 1:时钟指针

指针从顶部旋转,模拟时钟效果

.clock-hand {
  transform-origin: center top; /* 指针从顶部旋转 */
  animation: rotate 4s linear infinite;
}

@keyframes rotate {
  from {
    transform: rotate(0deg);
  }
  to {
    transform: rotate(360deg);
  }
}

示例 2:缩放原点

不同原点的缩放效果

左上角缩放

悬停

中心缩放

悬停

右下角缩放

悬停
.box:hover {
  transform: scale(1.5);
}

/* 从左上角放大 */
.box-1 { transform-origin: top left; }

/* 从中心放大(默认) */
.box-2 { transform-origin: center; }

/* 从右下角放大 */
.box-3 { transform-origin: bottom right; }

常见应用场景

  • 🕐 时钟指针:从底部或顶部旋转
  • 📱 下拉菜单:从顶部展开(scale 或 rotate)
  • 🎯 工具提示:从箭头位置展开
  • 🎪 翻转卡片:从边缘翻转
  • 🎨 图片缩放:从特定角落放大
  • 🎮 游戏元素:围绕特定点旋转

重要注意事项

translate 不受影响:transform-origin 只影响 rotate、scale、skew,不影响 translate 平移

  • 百分比参考:百分比是相对于元素自身的尺寸,0% 0% 是左上角,100% 100% 是右下角
  • 3D 变换:可以设置第三个值控制 Z 轴原点,如 transform-origin: 50% 50% 100px
  • 组合变换:多个变换共享同一个原点
  • 动画中使用:原点在动画过程中保持不变

等价写法对照表

/* 关键字 vs 百分比 vs 像素(假设元素 100x100px) */
transform-origin: top left      = 0% 0%       = 0px 0px
transform-origin: top center    = 50% 0%      = 50px 0px
transform-origin: top right     = 100% 0%     = 100px 0px
transform-origin: center left   = 0% 50%      = 0px 50px
transform-origin: center        = 50% 50%     = 50px 50px
transform-origin: center right  = 100% 50%    = 100px 50px
transform-origin: bottom left   = 0% 100%     = 0px 100px
transform-origin: bottom center = 50% 100%    = 50px 100px
transform-origin: bottom right  = 100% 100%   = 100px 100px