当鼠标移动到一个元素上时,我想获取光标相对于该元素内容区域左上角的鼠标坐标(这个区域不包括填充、边框和轮廓)。听起来很简单,对吧?到目前为止,我有一个非常受欢迎的函数:
function element_position(e) {
var x = 0, y = 0;
do {
x += e.offsetLeft;
y += e.offsetTop;
} while (e = e.offsetParent);
return { x: x, y: y };
}
我想获取鼠标相对于元素element
的位置:
p = element_position(element);
x = mouseEvent.pageX - p.x;
y = mouseEvent.pageY - p.y;
那不是完全正确的。因为offsetLeft
和offsetTop
是元素“外部”左上角和其偏移父级的“内部”左上角之间的差异,所以求和位置将跳过层次结构中的所有边框和填充。
这里有一个比较,应该(希望)能澄清我的意思。
- 如果我获取元素与其偏移父级的“内部”左上角之间的位置距离之和(外部减去内部;我正在做的事情),我得到元素的内容区域的位置,减去了偏移层次结构中的所有边框和填充。
- 如果我获取元素与其偏移父级的“外部”左上角之间的位置距离之和(外部减去外部),我得到元素的内容区域的位置,减去了所需元素的边框和填充(接近,但还不够准确)。
- 如果我获取元素与其偏移父级的“内部”左上角之间的位置距离之和(内部减去内部),我得到元素的内容区域的位置。这就是我想要的。
offsetLeft/Top
方法获取元素位置不仅会受到目标元素边框和内边距的影响,还会受到所有偏移父元素的边框和内边距的影响。请查看我重新编写的问题,并看看您是否能够对我的情况发表意见。 - Delan Azabani