研究MouseEvent中的clientX、offsetX、pageX、screenX
很多时候需要在鼠标点击的时候获取点击的坐标来处理一些逻辑,有时候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相关推荐
- clientX,offsetX,pageX,screenX的异同以Chrome浏览器测试
clientX,offsetX,pageX,screenX的异同 对于这个问题我相信有不少刚刚学习DOM事件的小伙伴可能会比较懵逼,首先我们从文字上解释它的异同 首先我们要明确对于浏览器而言,它的X还 ...
- 【鼠标事件 MouseEvent】clientX clientY offsetX offsetX pageX screenX screenY
鼠标事件 MouseEvent 对象,下clientX clientY offsetX offsetX pageX screenX screenY 定义转自 MDNMouseEvent MouseEv ...
- 区分event对象中的[clientX,offsetX,screenX,pageX]
前言 在平时的开发中,非常讨厌的就是兼容性了,兼容性的问题总会让我们记忆混淆,所以这次来区分一下event对象中的常用获取鼠标位置. clientX clientY event.clientX eve ...
- html5 offsetx,event对象中offsetX,clientX,pageX,screenX的区别
1.offsetX offset意为偏移量,是事件对象距左上角为参考原点的距离.以元素盒子模型的内容区域的左上角为参考点.不包括border. 2.clientX 事件对象相对于浏览器窗口可视区域的X ...
- clientX、offsetX、screenX、pageX的区别
一.概念总结 1.event.clientX.event.clientY 鼠标相对于浏览器窗口可视区域的X,Y坐标(窗口坐标),可视区域不包括工具栏和滚动条.IE事件和标准事件都定义了这2个属性.cl ...
- 详细区分offsetX,clientX,pageX,screenX,layerX和X的区别
详细区分DOM事件中鼠标指针的坐标问题 前面博客中我们讲解到了DOM事件的event对象,里边包含了鼠标事件的指针坐标属性.比如event.offsetX,event.clientX,event.pa ...
- Js event对象offsetX, clientX, pageX, screenX, layerX, x区别(图解)
简介 因为实际开发中,很少用到event对象的这几个值,每当写的时候又记不清,然后就要浪费时间去查找准确的资料,很是不爽,所以就做个记录~话不多说,直接上图(ps:图是网上找的,如果侵权,可立马删除) ...
- event对象的offsetX, clientX, pageX, screenX
现在需要对event对象的几大与坐标有关的属性做一个总结,以便于认识 offsetX|offsetY offsetX/Y获取到是触发点相对被触发dom的左上角距离(包括padding在内,不包括bor ...
- clientX、pageX、offsetX、screenX、offsetWidth、clientWidth等
文章目录 1.clientX .clientY 2.pageX.pageY 注意: clientX和pageX的区别 3.offsetX.offsetY 4.screenX.screenY 5.off ...
最新文章
- linux 如何查看tomcat实时的日志
- PHP表单提交参数验证类(可修改)
- ubutnu16.04安装ros2
- 石油大学c语言考试答案,中石油华东2012春《C语言》在线答案
- [DirectX11]Gerstner波 实现简单的水面模拟
- JavaScript 编程精解 中文第三版 十三、浏览器中的 JavaScript
- 设计模式学习笔记(目录篇)
- ApacheCN 活动汇总 2019.6.28
- 订单系统新增订单接口负载测试性能问题及定位
- post 请求报400错误
- 通过百度BAE搭建微信二次开发的服务(2)
- 论文笔记:UCTransNet: Rethinking the Skip Connections in U-Net from a Channel-wisePerspective with Transf
- 仿微博系统数据库设计和er图设计
- ChatGPT 带火的「提示工程师」岗,不用写代码,也能获得年薪数百万?
- python股票分析系统代码_Python 代码学习,用于股票分析
- Docker基础(下)
- 做到这一点,你也可以成为优秀的程序员(转)
- [NCTF2019]Fake XML cookbook 1
- 马尔可夫决策过程(Markov Decision Process, MDP)
- 嵌入式Linux--U-Boot(三)Boot命令使用