如何在已缩放元素上重新计算transform origin(变换原点)
问题解决:基于指定视觉位置设置缩放原点(无需left属性)
问题本质
transform-origin 是按元素未缩放前的原始尺寸计算位置的,不是缩放后的视觉尺寸。你直接将它设为目标视觉位置(100px),缩放后这个原点会被缩放比例“压缩”,导致实际视觉上的原点偏移到50px处,和预期的紫色线不对齐。
正确计算方法
如果需要的视觉缩放原点距离元素原始左边缘的距离为 D(这里就是100px,对应紫色线位置),元素缩放比例为 s(这里是0.5),那么正确的 transform-origin x轴值为:
transform-origin-x = D / s
代入数值就是 100px / 0.5 = 200px,这就是你代码里.example-right的正确设置——缩放后,原始坐标系里的200px会被缩小到 200*0.5=100px,正好对齐紫色线。
为什么你的公式有偏差
你尝试的 x + (x * scale) 逻辑错误,这个公式是在缩放后的尺寸上叠加,但transform-origin是先作用于原始元素,再执行缩放。正确的思路是把目标视觉位置还原回原始元素的坐标系,也就是除以缩放比例,而非叠加。
完整可运行代码
* { margin: 0; padding: 0; } .box { position: relative; width: 100px; height: 100px; margin-top: -10px; } .example-initial { background: blue; transform: scale(0.2); transform-origin: 100px 0px; } .example-wrong { background: green; transform: scale(0.5); transform-origin: 100px 0px; } .example-right { background: red; transform: scale(0.5); transform-origin: 200px 0px; } .transform-origin-line-example { position: absolute; left: 100px; width: 1px; height: 200px; background: purple; top: 0; }
<div class="example-initial box"></div> <div class="example-wrong box"></div> <div class="example-right box"></div> <div class="transform-origin-line-example"></div>
效果验证
.example-wrong设置transform-origin:100px 0,缩放后原点被压缩到100*0.5=50px,偏离紫色线.example-right设置transform-origin:200px 0,缩放后原点正好是200*0.5=100px,完美对齐紫色线
内容的提问来源于stack exchange,提问作者Niels Reijnders
相关产品推荐
相关产品推荐

