元素在使用transform:rotate旋转后,如何获得其绝对定位?

我尝试使用了jquery中的offset(),但这得到的数据很奇怪,这个位置似乎会随着旋转而逐渐偏离元素的左上角,请问还有别的方法可以得到这个旋转元素的绝对定位吗?

很抱歉我不能给出任何例子,但我觉得这个问题描述得还算清晰,如果有需要的话,我愿意补充更多信息

编辑:我截图了屏幕以显示我遇到的问题,图中,我将右侧的圆点逆时针旋转了120度,其中红色的正方形是这个黑色长方形的offset位置,代码如下:

var left = $(line_inner).offset().left
var top = $(line_inner).offset().top
$("#pointer").offset({
    left: left,
    top: top,
})

image.png
image.png
image.png
image.png

我想知道如何让这个红色的正方形的位置随着黑色长方形一起改变,并始终在其左上角。当然,如果能够知道这个红色正方形的位置移动规律,并可以以此求得黑色长方形的某个固定位置,我也可以使用。

编辑2:AI的回答并没有效果,它给出的函数与JQuery提供的.offset()效果相同,返回的值仍然会受到旋转的影响。
我最后通过在这个黑色长方形外包裹一层没有实际大小的父元素解决了这个问题,这个父元素的绝对定位始终在黑色长方形的左上角,但我希望得到我的问题的答案,我认为经过那么久的发展,或许我们有一个更简单的或直观的方法解决这个问题。

阅读 1.7k
avatarAI BotBETA

这个问题涉及到CSS的transform属性与JavaScript定位方法之间的交互。在CSS中,transform: rotate()会旋转元素,但不会改变元素的实际位置。然而,这可能会导致元素的视觉位置发生变化,从而影响使用JavaScript方法获取的元素位置。

jQuery的offset()方法获取的是元素的相对于文档的位置。然而,当你旋转元素后,这个位置可能会与元素的实际视觉位置不符。这是因为transform属性只影响元素的视觉位置,而不改变元素的实际位置。

如果你想获取旋转元素的绝对定位,也就是元素在页面上的实际位置,你可以尝试使用原生的JavaScript方法getBoundingClientRect()。这个方法会返回一个对象,其中包含元素的大小和相对于视口的位置。

以下是一个简单的例子:

var element = $('#yourElement').get(0);
var rect = element.getBoundingClientRect();

console.log(rect.top, rect.left); // 这将给出元素左上角相对于视口的坐标

这种方法获取的是元素的实际位置,而不是元素在文档中的位置,即使元素被旋转也不会受到影响。这是因为getBoundingClientRect()方法获取的是元素的大小和位置,而旋转不会改变这些属性。

希望这个回答能够解决你的问题。如果你还有其他问题或需要进一步的解释,请随时提问。

1 个回答

元素transform之后,其位置实际上还在原地,大小实际上也没有变化,所以 offset 不受影响。这也是做动画的时候使用 transform 代替修改真实尺寸可以提升性能的原因——它不改变布局,不会引起回流或者重绘。

在二维坐标系上做线性矩阵变换的时候,如果没有发生位移,那么无论怎么变换,坐标原点 [0,0] 的位置都是不会变的:

$$ \begin{bmatrix} a_1 & b_1 & 0 \\ a_2 & b_2 & 0 \\ 0 & 0 & 0 \end{bmatrix} \begin{bmatrix} 0\\ 0\\ 1 \end{bmatrix} \equiv \begin{bmatrix} 0\\ 0\\ 1 \end{bmatrix} $$

在 CSS 中,这个坐标原点默认在{position: relative;left: 0; top: 0}所在位置,可以通过修改 transfrom-origin 的值来控制此原点位置,例如 transfrom-origin:center就可以实现元素旋转而不偏离自己的中心位置。

如果期望两个元素绕着同一个中心点旋转的话,需要从黑色正方形的尺寸和offset计算出确切的变换原点坐标,然后赋值给红点的transform-origin(红点不旋转只需要定点的话,可以直接设置为其位置left&top)。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏