← 🔷 SVG × CSS:一块能被 CSS 管的画布 / transform-origin:旋转枢轴在哪 待审核 4 / 9
transform · 枢轴 ★

transform-origin:旋转枢轴在哪

给 SVG 图形写一句 transform: rotate(30deg),结果常常不是「原地转一下」,而是整块图形被甩到一边。根源是两个默认值合力:SVG 内部图形元素transform-origin 初始值是 0 0(并非自身中心),而 transform-box 初始值是 view-box——于是旋转枢轴落在 viewBox 坐标系的原点(画布左上角),图形绕着画布角「公转」。

同一个方块(虚线框是不动的原始位置),拖角度滑块旋转它。橙色十字标出当前的旋转枢轴,切三种写法看它移到哪:

SVG 与 HTML 的关键差异: 普通 HTML 元素 transform-origin 默认 50% 50%(自身中心),而 SVG 内部图形元素默认 0 0。同一句 rotate(),在 <div> 上原地转、在 <rect> 上却绕画布原点甩——不少「图标 hover 旋转却飞出去」的问题都源于此。(根 <svg> 元素本身是例外,默认仍是 50% 50%。)

把枢轴钉回图形自己身上: transform-box: fill-boxtransform-origin 的百分比改为相对元素自己的包围盒计算,此时 transform-origin: center 才是图形中心、rotate() 原地自转。这与 paint-server 一页 gradientUnitsobjectBoundingBox 是同一条主线——值相对哪个盒子,正是 SVG 坐标系最常见的困惑点。若不想动 CSS 盒子,也可以用 SVG 自带的 transform="rotate(angle cx cy)" 三参数语法,把旋转中心直接写成 user 坐标。