HTML坐标系与鼠标事件坐标

在开发中处理鼠标事件时,经常会碰到 offset、scroll、client 这几个关键字,每次处理页面元素的坐标和偏移前,都要网上去搜资料,还会踩一些坑,影响开发效率。这里总结一下,一劳永逸。

一、图解HTML的四个坐标系统

HTML有四个常见的坐标系统:screen,page,client和offset,用于描述DOM元素的Box尺寸和MouseEvent中的位置。

如下图所示:

1. screen坐标系

参照点:用户显示器屏幕左上角。

screenX:鼠标点击位置相对于电脑屏幕左上角的水平偏移量。

screenY:鼠标点击位置相对于电脑屏幕左上角的垂直偏移量。

screen坐标的最大范围是 (screen.width, screen.height),最大值不会超过屏幕分辨率。

补充:

// 屏幕宽度。

screen.width

// 屏幕高度。

screen.height

// 屏幕可用宽度。即屏幕宽度减去左右任务栏后的宽度,可表示为浏览器最大化时的宽度。

screen.availWidth

// 屏幕可用高度。即屏幕高度减去上下任务栏后的高度,可表示为浏览器最大化时的高度。

screen.availHeight

// 任务栏高/宽度。如:任务栏高/宽度 = 屏幕高/宽度 - 屏幕可用高/宽度。

screen.height - screen.availHeight

2. page坐标系

参照点:整个页面的左上角(整个页面的意思就是你整个网页的全部,按照整个html文档的长度和宽度来计算)。

pageX:鼠标点击位置相对于网页左上角的水平偏移量,也就是 clientX + 水平滚动条滚动的距离。

pageY:鼠标点击位置相对于网页左上角的垂直平偏移量,也就是 clientY + 垂直滚动条滚动的距离。

*因此,坐标系上某一个元素的pageX/pageY 不会 随着滚动条滚动而改变。

page坐标的最大范围是 (document.body.clientWidth + 垂直滚动条宽度, document.body.clientHeight + 水平滚动条高度)。

*比如说网页很宽很长,宽2000px,高3000px,那 pageX/pageY 的最大值就是它们了。

补充:

// 浏览器宽度。

window.outerWidth

// 浏览器高度。

window.outerHeight

// 浏览器内页面可用宽度,此宽度包含了垂直滚动条的宽度(若存在)。可表示为浏览器当前宽度去除浏览器边框后的宽度。

window.innerWidth

// 浏览器内页面可用高度,此高度包含了水平滚动条的高度(若存在)。可表示为浏览器当前高度去除浏览器边框、工具条后的高度。

window.innerHeight

// 工具栏高/宽度,包含了地址栏、书签栏、浏览器边框等范围。如:工具栏高度 = 浏览器高度 - 页面可用高度。

window.outerHeight - window.innerHeight

3. client

参照点:浏览器内容区域左上角(即浏览器中用户所看到区域的左上角,内容区域不包括工具栏和滚动条)。

clientX:鼠标点击位置相对于浏览器可视区域的水平偏移量(不会计算水平滚动的距离)。

clientY:鼠标点击位置相对于浏览器可视区域的垂直偏移量(不会计算垂直滚动的距离)。

*因此,坐标系上某一个元素的clientX/clientY 会 随着滚动条滚动而改变。

client坐标的最大范围是 (window.innerWidth - 垂直滚动条宽度, window.innerHeight - 水平滚动条高度)。

*计算这个坐标时,由于是基于浏览器窗口中用来显示网页的可视区域,那么也就是说需要拖动滚动条才能看到的区域不算;当你将浏览器窗口缩小时,clientX/clientY 的最大值也会缩小,但始终,它们的最大值不会超过你浏览器可视区域。

补充:

// body展示的宽度,表示body在浏览器内显示的区域宽度。

document.body.clientWidth

// body展示的高度,表示body在浏览器内显示的区域高度。

document.body.clientHeight

4. offset

参照点:父级中最近的一个带有CSS定位(position为absolute/relative)的父元素,如果当前元素的父级元素中没有进行CSS定位,那么就是body。

offsetX:鼠标点击位置相对于触发事件对象的水平距离。

offsetY:鼠标点击位置相对于触发事件对象的垂直距离。

offset坐标的最大范围是 (document.body.offsetWidth, document.body.offsetHeight)。

补充:

// body总宽度。

document.body.offsetWidth

// body总高度。

document.body.offsetHeight

二、图解鼠标事件坐标

鼠标事件都是在特定位置发生的,我们可以通过event事件对象的各种属性来获得事件发生的坐标位置。

常见的鼠标事件有下面这几种:

1. onclick

鼠标点击事件

let el = document.querySelector('#element-id');

el.onclick = function(e){

console.log(e)

}

2. onmousedown

鼠标按下事件

let el = document.querySelector('#element-id');

el.onmousedown = function(e){

console.log(e)

}

3. onmouseup

鼠标松开事件

let el = document.querySelector('#element-id');

el.onmouseup = function(e){

console.log(e)

}

4. onmousemove

鼠标移动事件

let el = document.querySelector('#element-id');

el.onmousemove = function(e){

console.log(e)

}

5. onmouseover

鼠标经过事件

let el = document.querySelector('#element-id');

el.onmouseover = function(e){

console.log(e)

}

6. onmouseout

鼠标划出事件

let el = document.querySelector('#element-id');

el.onmouseout = function(e){

console.log(e)

}

根据以上打印的e的信息,大致为:

事实上,e.layerX/e.layerY 与 e.x/e.y 这两个属性比较特殊。考虑到它们不那么常见(因为受浏览器种类影响),而且使用时需要考虑的情况相对复杂(layerX/layerY对于absolute绝对定位元素,参考点是当前点击元素的左上角;对于relative相对定位元素,通常与pageX/pageY的值是相同的),这里不展开讨论(实用主义,感兴趣的可以单独拎出来尝试)。

三、不同浏览器对这些属性的支持

Chrome

Firefox

IE8 -

IE9

IE10 +

offsetX

×

clientX

pageX

×

screenX

layerX

×

x

×

上面列举的这些浏览器都在不断迭代版本,而且市面上还有很多其它浏览器,所以这部分内容需要实时参考MDN上的浏览器兼容性表格。

四、总结

上面那些属性都是很容易搞混的,常用的记在这里方便以后速查。一些特殊的属性尤其要注意不同的浏览器中可能存在的差别,使用的时候测试一下就能更准确的应用了。

整理这篇文章的契机,就是我在编写cceditor这个项目的时候。

如有异议,可以在留言区评论,或直接发送您宝贵的意见至我的邮箱。

参考

MDN

若干文章

html鼠标各种坐标,HTML坐标系与鼠标事件坐标相关推荐

  1. python截取图片的ROI+OpenCV 在坐标中显示图片+鼠标点击图片显示点坐标

    又来做下笔记了.现在我的毕业设计进行到数据处理的阶段,要在乳腺图像上截取4张相同大小的1024*1024图片,并且每张图片都必须覆盖微钙化点,以下是我现在用到的一些简单程序. 1.首先是截图程序如下: ...

  2. php控制鼠标,HTML_用VBS控制鼠标的实现代码(获取鼠标坐标、鼠标移动、鼠标单击、鼠标双击、鼠标右击),怎么用VBS模拟鼠标左键单击、 - phpStudy...

    用VBS控制鼠标的实现代码(获取鼠标坐标.鼠标移动.鼠标单击.鼠标双击.鼠标右击) 怎么用VBS模拟鼠标左键单击.左键双击.右键单击?-- 网上搜到的答案普遍是VBS无法实现,或者是要用第三方COM( ...

  3. 【Unity鼠标从屏幕空间(坐标)转换为世界空间(坐标)】

    Unity鼠标从屏幕空间(坐标)转换为世界空间(坐标) Vector3 screenPos = Camera.main.WorldToScreenPoint(transform.position); ...

  4. android鼠标滚轮事件坐标,Android触摸滑动全解(四)——MotionEvent详解

    Android触摸滑动全解(四)--MotionEvent详解 在分析View和ViewGroup的触摸事件时,我们已经接触到了MotionEvent类,它是用来存储我们当前手指移动的状态的,比如按下 ...

  5. python怎么模拟鼠标移动点击_Python模拟鼠标点击——如何正确的肝阴阳师

    本来嘛,说好了要写Selenium自动化搜电影的笔记的,然后正好今天上课无聊玩阴阳师开了个SSR,发现还有600体!准备怒刷之,但是又肝不动了.打算尝试用Python写个脚本来代替我自动点击(PC端, ...

  6. 773-780---DOM事件高级(常用鼠标事件,案例:跟随鼠标的天使,常用的键盘事件,案例:模拟京东按键输入内容,案例:模拟京东快递单号查询)

    文章目录 事件高级 7 常用的鼠标事件 7.1常用的鼠标事件 7.2 鼠标事件对象 案例:跟随鼠标的天使 8 常用的键盘事件 8.1 常用的键盘事件 8.2 键盘事件对象 8.3 ASCII 表 案例 ...

  7. Unity鼠标拖动物体、按下鼠标左键旋转观察物体、鼠标滚轮缩放视野

    如题目所示,本文实现这三个效果.所有代码都在pc端成功运行,移植到手机端改变相应的判断条件即可,核心算法没有问题. 一. 鼠标拖拽移动物体 效果演示 源代码 public class mousedra ...

  8. Win32 鼠标消息 - 客户区鼠标消息、非客户区鼠标消息、击中测试、鼠标滚轮

    注:以下内容为学习笔记,多数是从书本.资料中得来,只为加深印象,及日后参考.然而本人表达能力较差,写的不好.因非翻译.非转载,只好选原创,但多数乃摘抄,实为惭愧.但若能帮助一二访客,幸甚! 注:以下内 ...

  9. Unity3D 鼠标拖动和旋转物体以及鼠标拖动图片

    1.鼠标拖动物体Cube using System.Collections; using System.Collections.Generic; using UnityEngine; using Un ...

最新文章

  1. docker高级应用之赋予容器独立外网ip
  2. Prolog基本程序
  3. Asterisk标准通道变量
  4. 文末送书 | 阿里资深员工撰写:深度实践OCR
  5. 昔年浅谈成都的百度推广公司靠谱吗这个问题?!
  6. linux内存中的文件权限,理解Linux文件权限
  7. 【语音加密】基于matlab语音加密【含Matlab源码 1303期】
  8. Linux命令九---Linux进程管理命令---ps-kill-nohup-jobs-fg-bg-top等
  9. matlab矩阵两个乘法运算,MATLAB矩阵运算-乘法
  10. 低成本,高效率,更成熟的实时数据采集方案来了
  11. 微信小程序图片上传java后台
  12. Bootstrap响应式布局之 col-xs col-sm col-md
  13. 制作透明背景的微信头像
  14. 面试官问我new Vue阶段做了什么?
  15. 【RBF预测】基于时空 RBF-NN 实现混沌时间序列预测附matlab代码
  16. 关闭LOL等电脑进程小程序
  17. js+java 实现图片在线预览功能
  18. Java调整图片大小合并PNG图片生成ICON(保持背景透明)
  19. Centos7快速单机搭建ceph(Octopus版)
  20. WinForm,可能是Windows上手最快的图形框架了

热门文章

  1. Windbg调试命令详解(2)
  2. 初学者学习JS很吃力怎么办?到底该如何学习JS?
  3. 5板斧---分析短信、彩信收发异常
  4. 【07月05日】北上资金持股比例排名
  5. h5 c3 特效网站
  6. 角度转换之度分秒的转换成度
  7. 啊哈算法之水管工游戏
  8. 第4章第6节-水管工游戏
  9. 【OpenCV入门教程之十三】OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放
  10. 追书神器 三星s8+ 语音朗读锁屏后中断问题解决办法