图解鼠标事件的 ScreenX ,LayerX,clientX,PageX,offsetX,X

article/2025/10/15 6:51:43

前言: 完在上一篇文章
🎁如何实现原生 JS 的拖拽效果我中使用到了 MouseEvent 事件对象身上的 clienX 的属性,但同时我也注意到了事件对象身上关于 X 的相关属性还有很多,并且在移动端开发中,这些属性需要频繁的用到,所以来总结一下这些关于 X 轴身上各个属性含义的不同。


一. 前期准备

  1. 在进行下面的内容之前,我希望大家先把传统数学中坐标轴的 y 轴方向和 x 轴的正轴负轴方向的概念遗忘掉。
    image.png

  2. 对于客户端来讲,它们采用坐标系的方向有些许不同,如下图。
    image.png
    造成这个的原因其实也很简单,你想一下,对于用户来讲,有用的区域就是我们的整块屏幕,如果负轴的话就已经超出屏幕之外了(下图的黄色区域),对我们没有任何实际的意义。所以一般来讲关于屏幕坐标时,我们就默认规定从左角开始向下为 y 坐标轴。
    image.png

  3. 对上面的解释其实不太严谨,但是可以让你有个大概的认知,从而方便我们再讲解下面几个属性不同时,让你有更深刻的理解。

  4. 让我们制造一个点击事件来引入我们今天的各个属性值。
    image.png
    image.png

  5. 可以看到右侧出现了很多关于 X,Y 的属性,接下来我们一个一个去了解它们各自到底代表着什么。

二. ScreenX 、ScreeY

  1. 其实从 Screen 这个单词的意思就能大概猜出来它代表的是什么意思。“屏幕” 嘛!那肯定是相对于屏幕来讲的啊。
    image.png

  2. 最开始我在这里迷惑的是下面这种情况,当我把浏览器窗口缩小的时候,这个 screenY 是代表着那根线的距离呢?🤔
    image.png

  3. 我们验证一下这个猜想,可以看出虽然我们浏览器窗口缩小了,但是我们的 screenY 依旧代表着我们点击的点到整块电脑屏幕显示器的最顶部的距离。
    22.gif

三. LayerX、LayerY

  1. 这个属性需要搭配使用 position 定位的几个值才能看出不一样的地方。大致概念为:如果元素自身的 position 属性不是 static,那么这个元素的 layer 就相对于它自身的左上角开始计算。
    image.png

  2. 如下图所示,当我点击了该元素内部以后,它的 layerXlayerY 大小计算就是从左上角开始的。
    image.png

  3. 同理,如果自身没有设置定位的相关属性,也就是元素本身 position 属性为 static。那么它会向上寻找离得最近的 position 不为 static 的元素,然后从相对于那个元素的左上角的距离开始计算。如果都没有,那么最终寻找到 body 标签结束。

三. clientX、clientY

  1. 仅从 client 这个单词来讲,如果你看过我之前的文章,那么我想你大概可以猜出来 clienXclientY 代表着什么,它们之间其实有异曲同工之处,不然为啥都叫 client 呢?
    在这个场景,client 这个单词其实代表着 用户端(代表浏览器窗口)可视区域的意思。

  2. 如果你还不了解什么是客户端可视区域,那么我强烈建议你点开下面的文章去了解一下,尤其你以后考虑接触移动端开发的话,那么下面三个属性是你必须知道的知识点。
    🫱你必须知道的clientWidth, offsetWidth, scrollWidth.

  3. 回到 clientXclientY 上,在这里明确比告诉大家一个概念:这两个值只关心用户当前屏幕(浏览器窗口)上能够看到的区域,并且从当前区域的左上角开始计算距离。
    image.png

  4. 什么意思?我们都知道当内容宽度或者高度超出父容器设置的宽度高度的时候,会引发溢出。常见处理溢出的方案就是设置它的 overflow 属性,如 overflow-auto 等。

  5. 我们先创建一个溢出的场景,并且我把 clientX 的数值展示到了页面上。
    33.gif

  6. 可以看出其实我在滑动的时候已经多次点击触发 onMouseDown 事件了,只不过对于我们来讲,我们能看到的区域仅仅只是容器最左边开始。(溢出的部分我们是看不到的,我们 client 也不关心那溢出的那部分的距离。)
    image.png

  7. 同理 clientY 也是不关心溢出的部分,只关心能看到的那部分。

四. PageX、 PageY

  1. 从上面刚刚讲过的 clientYclientX 不关心溢出的那部分。哪有人关心溢出的那部分距离吗?你别说还真有,那就是 pageXpageY

  2. 因为这个属性是相对于整个文档的左上角来开始计算的,所以我们上面的溢出例子还触发不了这个属性的变化。 我们这里借助 MDN 的页面来讲解,由上面 clientY 的知识可以得到,当我们页面没滚动的时候,这个距离其实就是 clientY 的距离。
    image.png

  3. 你可能会疑惑,奇怪,我们不是在讲解 PageY 吗?怎么又回到 clientY 了?其实一点也不奇怪,在这种情况下,我们的 pageYclientY 是一模一样的,没有任何区别。

  4. 但是!一旦发生了下面的情况,由于内容溢出导致页面发生了滚动。如下图:
    image.png
    那么我们的 PageY 属性记录的值就变成了滚动的距离+ clientY的距离。如果你知道 scroTop 所代表的含义,那么你可以很快得出下面的计算方式。
    pageY = scroTop + clientY
    如果你还不了解 scroTop 的相关知识,没关系,我同样讲过,你可以点击这里去自行了解。
    🫱关于使用 scrollTop 来完成 tab 栏的交互

  5. pageX 同理,是发生在水平方向溢出的情况,这里就不再过度赘述。

五. offsetX 、offsetY

  1. 我们恢复到最基本的样式。此时黑块没有任何 border 属性。
    image.png

  2. 那么此时的 offsetXoffsetY 就代表着距离自身左上角的距离。
    image.png

  3. 如果此时我们加上 10px 的border 的话,情况就会发生变化。
    image.png
    聪明的你可能已经看出来了,它起点的计算向内部压缩了一个 border 的宽度 。
    image.png

  4. 这里其实还有一个关键知识点,不知道你发现了没,这个属性和 layerXlayerY 很相似,我们测试一下当元素自身设置 relative 的时候,它的 layer 属性也是相对于自身开始的。
    image.png
    offsetXlayerX 有区别吗?

  5. 这里直接揭晓答案,即使我们设置了 border, layer 的属性也是没有受到任何影响的,依旧从元素最左上角开始计算距离。
    image.png

六. X、Y

  1. 是的,你没看错,就只是单纯的这两个字母,但是这两个属性也确确实实存在。
    image.png

  2. 经过查阅可知,它其实就是 clientX,所以我们不再重复。
    image.png

七. 总结:

这篇文章是由我随手做的笔记改编而来,笔记内容比较粗糙,转化为文章后个人感觉又重新复习了一遍,加深了很大的印象。如果该文章能帮助到一些人,也是一件幸事。

可能我以后也会经常来翻阅自己的这篇文章~这几个属性确实容易搞混🤔


http://chatgpt.dhexx.cn/article/04wlKO8L.shtml

相关文章

pageX,clientX,offsetLeft,scrollLeft的区别

pageX,clientX,offsetLeft,scrollLeft的区别 1、pageX / pageY pageX / pageY的值为鼠标相对于document的距离,即网页左上角的位置 2、clientX / clientY clientX / clientY的值为鼠标相对于浏览器可视区域左上角的距离 3、offsetLeft / offsetTop offsetLeft …

详细区分offsetX,clientX,pageX,screenX,layerX和X的区别

详细区分DOM事件中鼠标指针的坐标问题 前面博客中我们讲解到了DOM事件的event对象&#xff0c;里边包含了鼠标事件的指针坐标属性。比如event.offsetX,event.clientX,event.pageX,event.screenX等等。现在我们来解析一下这些坐标属性的区别。 HTML代码&#xff1a; <div c…

screenX、client X、pageX、offsetX、layerX

screenX, client X screenX: 鼠标在屏幕中的水平坐标 client X: 鼠标在客户端区域&#xff08;浏览器可视区域&#xff09;的水平坐标&#xff0c;不论页面是否有水平滚动 pageX 相对于整个文档的x&#xff08;水平&#xff09;坐标 个人认为&#xff1a;pageX clientX sc…

Page和PageInfo

Page和PageInfo 两者都能获取到数据&#xff0c;Page是一个ArrayList。 PageInfo是一个对象&#xff0c;能获取到的数据比Page多 如何使用 Page对象 参数解析 private int pageNum; //当前页码 private int pageSize; //每页数据的数量 private int startRow; //始页首行行…

正确使用pageX、pageY、offsetLeft、offsetTop

获取鼠标位置的时候&#xff0c;遇到一点疑问&#xff0c;然后验证了一下自己的疑惑&#xff1b; pageX、pageY跟clientX和clientY类似&#xff0c;是相对于浏览器文档的坐标&#xff1b; offsetLeft、offsetTop获取的是固定定位&#xff0c;也就是说&#xff0c;监听某个选择…

pageX,pageY,screenX,screenY,clientX,和clientY,offsetX ,offsetY,layerX,layerY的使用 和 区别

pageX&#xff0c;pageY&#xff0c;screenX&#xff0c;screenY&#xff0c;clientX&#xff0c;和clientY返回一个数&#xff0c;其指示物理“CSS像素”的数量的点是从参考点。事件点是用户单击的位置&#xff0c;参考点是左上角的一个点。这些属性返回该参考点的水平和垂直距…

clientX,screenX,pageX,offsetX的区别

前言 关于clientX,screenX,pageX,offsetX的区别之前也比较迷糊&#xff0c;然后自己写了几个demo算是弄明白了&#xff0c;在这记录一下。 定义 一、clientX、clientY 点击位置距离当前body可视区域的x&#xff0c;y坐标。 可以理解为距离浏览器窗口的距离&#xff0c;但注意…

clientX、offsetX、screenX、pageX的区别

一、概念总结 1、event.clientX、event.clientY 鼠标相对于浏览器窗口可视区域的X&#xff0c;Y坐标&#xff08;窗口坐标&#xff09;&#xff0c;可视区域不包括工具栏和滚动条。IE事件和标准事件都定义了这2个属性.clientX指可视区域内离左侧的距离&#xff0c;以滚动条滚…

页面上pageX、offsetLeft等的使用方法

页面上pageX、offsetLeft等的使用方法 pageX: 页面X坐标位置 pageY: 页面Y坐标位置 <script>window.onmousemovefunction(e){// 鼠标移动的时候得到鼠标实时的位置console.log(${e.pageX},${e.pageY});} </script>screenX: 屏幕X坐标位置 screenY: 屏幕Y坐标位置…

【arduino 问题记录】 psram: PSRAM ID read error: 0xffffffff

问题描述&#xff1a;采用ESP32-s将数据通过4G模块发送到阿里云的时候&#xff0c;只要数据一发送&#xff0c;esp32-s就一直重新连接4G模块。 图一中红色框就是我要传输到阿里云的内容&#xff0c;蓝色框显示的就是报错信息&#xff0c;接下来显示的就是一直重新连接&#xff…

为什么0xffffffff是-1?(计算机对整型的存储)

一个数字在计算机中都是以二进制补码的形式存储的。 先了解这句核心。。。 我们认为中的int整型数值顺序 java中int类型是4个字节&#xff0c;也就是32位&#xff0c;其中第一位是符号位&#xff0c; int数值的存储结构 我们利用 System.out.println(Integer.toBinaryStri…

ESP32-C3烧录后打印报错invalid header: 0xffffffff【flash_download_tool_3.9.3.exe工具烧录】

ESP32-C3没有一键下载电路的情况下是使用的乐鑫官方下载工具flash_download_tool_3.9.3.exe 【工具 | 乐鑫科技 (espressif.com.cn)】 在下载工具中&#xff0c;你选择你的下载地址非常重要。 如果你是ESP32其他系列&#xff0c;你需要选择你的bootloader.bin是0x1000开始 如果…

C语言>>8 0xFF; 0xFF;作用

示例 Buff[0] data & 0xFF;Buff[1] data >> 8 & 0xFF;比如数据data 0xAA33&#xff0c;二进制是1010 1010 0011 0011。 Buff[0] 1010 1010 0011 0011 & 1111 1111 0011 0011&#xff0c;十六进制是0x33。 Buff[1] 1010 1010 0011 0011>> 8 &am…

一个数和0xFFFF与运算的意义

记录下今天困扰自己的一个问题&#xff0c;关键还是自己基础不够扎实。 昨天看到一段代码一个数与0xFFFF进行与运算&#xff0c;但是一直没想明白为什么要这么做&#xff0c;粗看上去一个数与0xFFFF运算后不就等于其本身吗&#xff1f;后来经过实验后发现并不是自己预想的样子。…

遇到代码为 4294967295 (0xffffffff)问题解决

突然打开终端遇见这个问题 [已退出进程&#xff0c;代码为 4294967295 (0xffffffff)] 尝试许多晚上的解决方案&#xff0c;在此总结&#xff0c;有的方法应该会帮助一部分人 方法1 管理身份运行终端然后 输入netsh winsock reset 然后重启并未解决 方法二 在终端输入WS…

0xffffffff是多少?

&#xff08;1&#xff09;正数的补码与原码相同&#xff1b;&#xff08;2&#xff09;负数的符号位为1&#xff0c;其余位为该数绝对值的原码按位取反&#xff0c;然后整个数加1&#xff0c;即为其补码。 &#xff08;总的来说&#xff1a;补码原码取反1&#xff0c;只不过…

使用wsimport将wsdl生成java

使用管理员打开cmd wsimport -encoding utf-8 -keep -s D:\temp -p com.lamcy.webService -verbose http://服务地址?wsdl -encoding : 指定编码格式 -keep&#xff1a;是否生成java源文件 -d&#xff1a;指定.class文件的输出目录 -s&#xff1a;指定.java文件的输出目录…

使用wsimport命令将wsdl文件生成服务端以及客户端

使用wsimport命令将wsdl文件生成服务端以及客户端 背景介绍WSDL文件介绍APACHE.CXF介绍soapui介绍自身系统作为客户端流程验证WSDL文件有效命令生成java代码将代码存放到系统指定位置Apache CXF引用代码整合 自身作为webService服务端流程发布webService服务 总结 背景介绍 最…

java wsimport方式生成webservice客户端代码

wsimport方法 1.在jdk安装目录bin下wsimport.exe&#xff0c;执行命令(修改红色部分的信息即可) wsimport -keep -d D:\1 -s D:\2 -p com.example.demo.webservice -verbose http://xxxxxxx?wsdl 对应下列命令说明&#xff1a;-keep&#xff1a;是否生成java源文件-d&#x…