很多时候需要在鼠标点击的时候获取点击的坐标来处理一些逻辑,有时候clientX、offsetX、pageX用的也不清楚,特此做了一个实验来记录。

1.含义

clientX 提供应用程序客户区域内发生事件的水平坐标(与页面内的坐标相对)
offsetX 鼠标指针在该事件与目标节点的填充边缘之间的X坐标中的偏移量
pageX 相对于整个文档的左边缘单击鼠标的X(水平)坐标(以像素为单位),这包括当前不可见的文档的任何部分。
screenX 鼠标指针在全局(屏幕)坐标中的水平坐标(偏移)

在做实验前我们先看一下他们在MDN上的说明,翻译来自谷歌翻译大家凑活看啊,clientX是点在应用程序中,理解简单一点就是浏览器窗口中,offset的解释像是点距离绑定元素,page应该是整个文档,screen好理解就是屏幕吗。那我们写代码来验证一下是不是这样的。

2.验证过程

<body><div id="move"></div><script type="application/javascript">(() => {document.querySelector('#move').addEventListener('click',function(even){document.querySelector('#move').innerHTML  = `clientX:${even.clientX}  offsetX:${even.offsetX} pageX:${even.pageX} screenX:${even.screenX}`;})})();</script>
</body>

新建一个div,给它绑定点击事件,输出它的clientX、offsetX、pageX、screenX

3.输出结果

我们是将div的宽度设置成120%,这样就产生了横向的滚动条。从最简单的开始分析,先来看screenX这个就是距离我们屏幕左侧的距离,当我们我们把浏览器窗口贴近屏幕左侧screenX从1开始,当我们像右侧拖拽浏览器窗口screenX也会跟着增长,截图中我已经将窗口拖拽中间位置,所以screenX的起始就为780多。下面我们来分析其他三个,来看一下静态图

上边这张图是将窗口放置屏幕左侧,我们随机点了一个点,可以看出  clientX与pageX相等是13,offsetX是5,为什么会相差8因为我们浏览器默认body的margin是8,那也就是说clientX、pageX的左侧距离是相对于浏览器窗口而来的,而offsetX要减去相应的边距。继续我们将窗口拖拽至屏幕右侧

上图坐标是点击屏幕最右侧的一个点,那可以看到 clientX与pageX相等是985,offsetX是978,我们在将滚动条拖拽最右侧在看一下点的输出。

可以看到,clientX没有变化还是985,当时offsetX和pageX都随着滚动条的滚动而变大了(请忽略screenX变化,不小心给浏览器拽了一下)那可以得出结论,clientX就是根据应用窗口的大小来计算X方向上的距离,而offsetX、pageX根据文档实际宽度来计算的,当没有滚动条是,clientX应该和pageX是一致的,如有疑义或者错误请留言反馈。

4.继续验证

我觉得上边只是验证了单个div,过于复杂的我们也不去验证,来验证一下两个div嵌套的把,首先改一下代码,如下

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>点在页面中的位置</title><style type="text/css">html,body{height: 100%;margin: 0;padding: 0;}#wrap {height: 200px;background: aquamarine;margin: 10px;border: solid #000 2px;padding: 10px;}#move {background-color: burlywood;height: 100%;margin: 10px;border: solid #000 2px;padding: 10px;}</style></head><body><div id="wrap"><div id="move"></div></div><script type="application/javascript">(() => {document.querySelector('#move').addEventListener('click',function(event){document.querySelector('#move').innerHTML  = `clientX:${event.clientX}  offsetX:${event.offsetX} pageX:${event.pageX} screenX:${event.screenX}`;})})();</script></body></html>

将html、body的内外边距置0,我们只研究两个div边距,样式应该简单易懂吧,我们来看一下结果吧。

结果就是,  clientX与pageX仍然相等,也即是说pageX不论点击哪个元素,它只计算点到文档的位置,offsetX只是计算当前点击元素的位置,会受到上级margin、padding、border的影响,对于自身的元素会受到margin的影响。

研究MouseEvent中的clientX、offsetX、pageX、screenX相关推荐

  1. clientX,offsetX,pageX,screenX的异同以Chrome浏览器测试

    clientX,offsetX,pageX,screenX的异同 对于这个问题我相信有不少刚刚学习DOM事件的小伙伴可能会比较懵逼,首先我们从文字上解释它的异同 首先我们要明确对于浏览器而言,它的X还 ...

  2. 【鼠标事件 MouseEvent】clientX clientY offsetX offsetX pageX screenX screenY

    鼠标事件 MouseEvent 对象,下clientX clientY offsetX offsetX pageX screenX screenY 定义转自 MDNMouseEvent MouseEv ...

  3. 区分event对象中的[clientX,offsetX,screenX,pageX]

    前言 在平时的开发中,非常讨厌的就是兼容性了,兼容性的问题总会让我们记忆混淆,所以这次来区分一下event对象中的常用获取鼠标位置. clientX clientY event.clientX eve ...

  4. html5 offsetx,event对象中offsetX,clientX,pageX,screenX的区别

    1.offsetX offset意为偏移量,是事件对象距左上角为参考原点的距离.以元素盒子模型的内容区域的左上角为参考点.不包括border. 2.clientX 事件对象相对于浏览器窗口可视区域的X ...

  5. clientX、offsetX、screenX、pageX的区别

    一.概念总结 1.event.clientX.event.clientY 鼠标相对于浏览器窗口可视区域的X,Y坐标(窗口坐标),可视区域不包括工具栏和滚动条.IE事件和标准事件都定义了这2个属性.cl ...

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

    详细区分DOM事件中鼠标指针的坐标问题 前面博客中我们讲解到了DOM事件的event对象,里边包含了鼠标事件的指针坐标属性.比如event.offsetX,event.clientX,event.pa ...

  7. Js event对象offsetX, clientX, pageX, screenX, layerX, x区别(图解)

    简介 因为实际开发中,很少用到event对象的这几个值,每当写的时候又记不清,然后就要浪费时间去查找准确的资料,很是不爽,所以就做个记录~话不多说,直接上图(ps:图是网上找的,如果侵权,可立马删除) ...

  8. event对象的offsetX, clientX, pageX, screenX

    现在需要对event对象的几大与坐标有关的属性做一个总结,以便于认识 offsetX|offsetY offsetX/Y获取到是触发点相对被触发dom的左上角距离(包括padding在内,不包括bor ...

  9. clientX、pageX、offsetX、screenX、offsetWidth、clientWidth等

    文章目录 1.clientX .clientY 2.pageX.pageY 注意: clientX和pageX的区别 3.offsetX.offsetY 4.screenX.screenY 5.off ...

最新文章

  1. linux 如何查看tomcat实时的日志
  2. PHP表单提交参数验证类(可修改)
  3. ubutnu16.04安装ros2
  4. 石油大学c语言考试答案,中石油华东2012春《C语言》在线答案
  5. [DirectX11]Gerstner波 实现简单的水面模拟
  6. JavaScript 编程精解 中文第三版 十三、浏览器中的 JavaScript
  7. 设计模式学习笔记(目录篇)
  8. ApacheCN 活动汇总 2019.6.28
  9. 订单系统新增订单接口负载测试性能问题及定位
  10. post 请求报400错误
  11. 通过百度BAE搭建微信二次开发的服务(2)
  12. 论文笔记:UCTransNet: Rethinking the Skip Connections in U-Net from a Channel-wisePerspective with Transf
  13. 仿微博系统数据库设计和er图设计
  14. ChatGPT 带火的「提示工程师」岗,不用写代码,也能获得年薪数百万?
  15. python股票分析系统代码_Python 代码学习,用于股票分析
  16. Docker基础(下)
  17. 做到这一点,你也可以成为优秀的程序员(转)
  18. [NCTF2019]Fake XML cookbook 1
  19. 马尔可夫决策过程(Markov Decision Process, MDP)
  20. 嵌入式Linux--U-Boot(三)Boot命令使用

热门文章

  1. LINUX——各个命令合集(持续性ing)
  2. 趣图:单身时 vs 有女朋友后
  3. 业务计划示例的营销推广部分
  4. 2006年湖北高考作文
  5. 安装SQL server2012 安装成功但失败失败的解决方法
  6. VM远程连接计算机,VMware虚拟机远程连接管理教程
  7. Seajs使用实例入门介绍
  8. ABAP SSCRFIELDS
  9. 【JavaScript】JS处理32位整型位运算
  10. 图文详解Linux系统引导过程及引导修复