window.screenX/Y
在IE浏览器上不支持。但对于其他浏览器来说,位置的近似值如下:
var top = $("#myelement").offset().top + window.screenY;
var left = $("#myelement").offset().left + window.screenX;
具体位置取决于哪些工具栏是可见的。您可以使用window
对象的outer/innerWidth
和outer/innerHeight
属性来近似更接近。
IE浏览器提供的窗口属性不多,但奇怪的是,单击事件对象将为您提供单击的屏幕位置。因此,我想您可以有一个校准页面,要求用户“单击红点”,并使用以下代码处理该事件:
function calibrate(event){
var top = event.screenY;
var left = event.screenX;
}
或者你可以使用mouseenter/leave
事件,并利用该事件的坐标进行校准。但是,你可能会很难确定鼠标是从左侧、右侧、顶部还是底部进入。
当然,一旦他们移动屏幕,你就需要重新校准。
了解更多有关浏览器属性兼容性的信息,请参见PPK的对象模型表。
我不同意jvenema的答案。
我在谷歌浏览器上找到了一个解决方案,但我希望这也适用于许多其他浏览器(也许不适用于某些旧版Internet Explorer)。
在<script>
标签内声明两个全局变量:pageX和pageY,并使用var
关键字。
这些全局变量应始终存储渲染页面左上角相对于屏幕监视器左上角的坐标,但为了实现此目标,window.onmousemove
应引用一个函数,该函数将pageX设置为event.screenX和event.clientX之差,将pageY设置为event.screenY和event.clientY之差。
然后,您只需要获取元素的坐标(相对于渲染页面的左上角),并添加pageX和pageY即可。这些表达式的结果将是该元素相对于屏幕监视器左上角的坐标!
代码示例(仅限JavaScript):
<script>
var pageX;
var pageY;
window.onmousemove = function (e) {
pageX = e.screenX - e.clientX;
pageY = e.screenY - e.clientY;
}
function getScreenCoordinatesOf(obj) {
var p = {};
p.x = pageX + obj.clientLeft;
p.y = pageY + obj.clientTop;
return p;
}
</script>
我认为这是不可能的。
元素坐标相对于渲染页面的左上角。
窗口坐标相对于屏幕。
据我所知,没有任何东西将渲染页面的左上角与窗口的左上角联系起来。因此,无法考虑边框、滚动条、chrome等因素。所以我认为您在这个问题上已经失败了。
这是我正在做的方式。
const pos = {x:number, y:number}
const scrollY = window.scrollY;
const targetArea = window?.document?.elementFromPoint(
pos.x,
pos.y - scrollY
);
这并没有考虑到 X 滚动因素。我认为这基本上就是 @joel 11 年前说的话。