screenX / Y,clientX / Y和pageX / Y有什么区别?


581

screenX/ YclientX/ YpageX/有Y什么区别?

另外,对于iPad Safari,计算结果是否与台式机相似?还是因为视口而有所不同?

如果您能指出一个例子,那就太好了。


2
另一个演示使用五个不同的属性(屏幕,客户端,页面,图层,偏移)来获取鼠标坐标。
akinuri

Answers:


504

在JavaScript中:

pageXpageYscreenXscreenYclientX,和clientY返回一个数,其指示物理“CSS像素”的数量的点是从参考点。事件点是用户单击的位置,参考点是左上角的点。这些属性返回到该参考点的水平和垂直距离。

pageXpageY
相对于浏览器中完整呈现的内容区域的左上角。该参考点在URL栏下方,并且在左上方是“后退”按钮。该点可能在浏览器窗口中的任何位置,并且如果页面中嵌入了嵌入式可滚动页面并且用户移动了滚动条,则实际上可以更改位置。

screenXscreenY
相对于物理屏幕/监视器的左上角,仅当您增加或减少监视器的数量或监视器分辨率时,此参考点才会移动。

clientXclientY
相对于浏览器窗口内容区域(视口)的左上边缘。即使用户从浏览器内部移动滚动条,此点也不会移动。

有关哪些浏览器支持哪些属性的视觉效果:

http://www.quirksmode.org/dom/w3c_cssom.html#t03

w3schools拥有一个在线Java解释器和编辑器,因此您可以看到各自的功能

http://www.w3schools.com/jsref/tryit.asp?filename=try_dom_event_clientxy

<!DOCTYPE html>
<html>
<head>
<script>
function show_coords(event)
{
  var x=event.clientX;
  var y=event.clientY;
  alert("X coords: " + x + ", Y coords: " + y);
}
</script>
</head>

<body>

<p onmousedown="show_coords(event)">Click this paragraph, 
and an alert box will alert the x and y coordinates 
of the mouse pointer.</p>

</body>
</html>


4
并在jquery中offsetX和offsetY相对于父容器
Muhammad Umer 2014年

2
到w3schools的链接现在似乎仅在参考部分可用:w3schools.com/jsref/tryit.asp?filename=try_dom_event_clientxy
有效

1
我认为这是对pageX / pageY的误导或至少无效的解释(并因此产生了问题),因为它引用了URL栏和后退按钮,而最好在页面内容方面进行解释,例如视觉解释答案说明。另外,w3schools示例也无济于事,因为它仅输出一对x / y对,并且其中没有滚动显示差异。
罗伯特·蒙菲拉

4
PageX / PageY和ClientX / clientY的说明已互换。您应该纠正它。它的误导
Navpreet考尔

1
我认为@NavpreetKaur是正确的。对于clientX vs pageX,此答案与之相反
zhouji '19

496

这是一张解释之间的差异pageYclientY

pageY vs clientY

pageX和和clientX分别相同。


pageX/Y 坐标相对于整个渲染页面的左上角(包括通过滚动隐藏的部分),

clientX/Y坐标是相对于页面可见部分(通过浏览器窗口“可见”)的左上角。

观看演示

您可能永远都不需要 screenX/Y


21
太棒了,谢谢您的演示,它的解释远胜于文字。
Rahul Prasad

我喜欢@ SimoEndre的解释最好
皮埃尔·

9
关心可视化是什么screenX/Y
ayjay 2015年

1
我想在页面上的特定矩形区域上绑定单击事件,因此pageX/pageY应该使用它而不是clientX/clientY
techie_28 '16

1
那么简单的x和y呢?当我尝试使用它们时,它们似乎与clientX / Y相同,但是找不到确切的参考文献
zhouji

117
  1. pageX / Y给出相对于<html>CSS像素中元素的坐标。
  2. clientX / Y给出相对于viewportCSS像素的坐标。
  3. screenX / Y给出相对于screen设备内像素的坐标。

关于您的最后一个问题,台式机和移动浏览器上的计算是否相似...为了更好地理解-在移动浏览器上-我们需要区分两个新概念:布局视口可视视口。视觉视口是当前屏幕上显示的页面的一部分。布局视口是在桌面浏览器上呈现的整个页面的同义词(所有元素在当前视口中不可见)。

在移动浏览器中,pageXpageY仍然相对于页面以CSS像素为单位,因此您可以获得相对于文档页面的鼠标坐标。另一方面clientXclientY定义与视觉视口相关的鼠标坐标

这里还有另一个关于视觉视口和布局视口之间差异的stackoverflow线程:视觉视口和布局视口之间的差异?

另一个很好的资源:http : //www.quirksmode.org/mobile/viewports2.html


27

帮助我的是,直接在此页面中添加了一个事件,然后自己点击了!在开发人员工具/ Firebug等中打开控制台,然后粘贴以下内容:

document.addEventListener('click', function(e) {
  console.log(
    'page: ' + e.pageX + ',' + e.pageY,
    'client: ' + e.clientX + ',' + e.clientY,
    'screen: ' + e.screenX + ',' + e.screenY)
}, false);
Click anywhere

使用此代码段,您可以在滚动,移动浏览器窗口等时跟踪点击位置。

注意,当您一直滚动到顶部时,pageX / Y和clientX / Y是相同的!


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.