一、页面元素坐标种类

根据DOM的鼠标事件(参见https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent),浏览器响应鼠标事件时,会上报四类坐标:

1、(pageX,pageY):相对于整个网页的坐标,因此坐标点可能比实际屏幕尺寸大。该坐标属于绝对坐标,不随着页面滚动而变化,当网页渲染完毕后,每个元素的page坐标就已固定。

2、(clientX, clientY):相对于当前视图区域的坐标,如果元素属于iframe,则是相对于iframe窗口坐标。

3、(offsetX,offsetY):鼠标位置相对于捕获事件的目标节点的坐标,如果点击位置没有元素,则为相对于body元素的坐标。

4、(screenX,screenY):相对于显示屏幕的坐标。

5、(layerX, layerY):非标准的特性,可能存在兼容性问题。表示鼠标点相对于该布局层顶端和左端的坐标,一般情况下与pageX、pageY相同,属于该层的绝对坐标。

但上述坐标中,哪些坐标是Web内核计算输出的,哪些坐标是传给Web内核的呢?其实,浏览器内核的输入坐标只有两个:屏幕坐标(screenX、screenY)和视图坐标(鼠标点相较于浏览器视图窗口的坐标)。其余4类坐标均是计算而来。

二、Chromium/Chrome浏览器鼠标事件捕获

Chromium浏览器在触发鼠标(如点击)事件时,主程序首先获得鼠标相对于视图区域(即去除浏览器应用顶部条、地址栏、工具栏、底部栏)的坐标(视图坐标),并在传给WebKit内核(或Render进程)前计算出该坐标对应的屏幕坐标(即screenX和screenY),将此两类坐标封装成WebMouseEvent对象。流程参见RenderWidgetHostViewAura::OnMouseEvent(ui::MouseEvent* event)。上述page、client、offset、layer坐标均是在Chromium内核中通过输入的视图区域坐标计算生成。

因此,对于点击某元素而言,浏览器视图窗口坐标是最重要的。

三、元素视图窗口坐标计算方法

元素相对于当前DOM视图窗口的坐标可通过getBoundingClientRect()计算而得。但当要计算该元素相对于浏览器视图区域的坐标,尤其针对该元素嵌入在某iframe中的情况,则需要利用getBoundingClientRect()迭代计算而成。代码如下:

  1. var targetObj=document.getElementById('test'); //假设网页中存在一个id为test的元素
  2. function calcViewportLocation(obj, winObj) {
  3. var currentWindow = winObj;
  4. var rect = obj.getBoundingClientRect(); //获取该元素在当前窗口视图区域的位置
  5. var top = rect.top;
  6. var left = rect.left;
  7. var width = rect.width;
  8. var height = rect.height;
  9. //若该元素在某iframe中,则计算该frame相较于父窗口的位置,并向上迭代直到主frame。元素的位置坐标需要累加iframe的偏移。
  10. while (currentWindow.frameElement != null) {
  11. var obj1 = currentWindow.frameElement;
  12. currentWindow = currentWindow.parent;
  13. rect = obj1.getBoundingClientRect();
  14. if (rect.top > 0) { top += rect.top; }
  15. if (rect.left > 0) { left += rect.left; }
  16. }
  17. var final_x = Math.round(left);
  18. var final_y = Math.round(top);
  19. return {y:final_y, x:final_x, w:width, h:height};
  20. }
  21. //将该元素对象及所在window作为参数传入。
  22. var result = calcViewportLocation(targetObj, window);

将上述脚本注入到目标元素所在DOM上下文中即可。(注意,若所在元素在iframe中,则Chrome类浏览器需要设定--disable-web-security --allow-file-access-from-files启动参数,否则会因跨域问题无法计算iframe尺寸。)

诸如下图例子(假设要计算子frame中iframeButton2元素的浏览器视图坐标):

蓝色横线表示iframeButton2元素坐上角相对于其所在iframe视图窗口的坐标,数值为X(92,51),只需要targetObj.getBoundingClientRect()即可计算得到。而相对于浏览器视图窗口的坐标则为(380,59),是X加上元素所在iframe的视图窗口位置所得。

转:https://blog.csdn.net/weixin_42080566/article/details/80105259

网页元素坐标表示及坐标计算方法相关推荐

  1. python获取网页元素坐标_html网页元素在屏幕上的坐标获取

    今天在用python调用IE获取html网页元素在屏幕上的坐标,当然为了截图啦,(*^__^*) 嘻嘻-- xtop=ie.document.forms[i].elements[j].getBound ...

  2. JS获取网页大小和鼠标当前坐标

    JS获取网页大小和鼠标当前坐标 var s = ""; s += "/r/n网页可见区域宽:"+ document.body.clientWidth; s += ...

  3. js中的事件对象event (获取元素的,x,y坐标)

    event的使用 获取元素的,x,y坐标 如图所示 当鼠标放在上面那个框上时获取其坐标,并且在下面框中显示 其实需要使用到鼠标移动事件 onmousemove event 事件对象中封装了当前事项相关 ...

  4. 求出N×M整型数组的最大元素及其所在的行坐标及列坐标(如果最大元素不唯一,选择位置在最前面的一个)。

    功能:求出N×M整型数组的最大元素及其所在的行坐标及 列坐标(如果最大元素不唯一,选择位置在最前面 的一个). 例如:输入的数组为: 1 2 3 4 15 6 12 18 9 10 11 2 求出的最 ...

  5. Javascript, 得到元素的左上角绝对坐标

    //得到元素的左上角绝对坐标 function getObjPos(o){ var x=y=0; if(o.getBoundingClientRect){ var box=o.getBoundingC ...

  6. 网页元素常见的定位方式

    1. 流式定位 这是网页元素默认的定位方式,网页元素按照其HTML标签的先后顺序,在网页内依次显示,就像液体一样"流动",所以称为"流式定位",这种方式将所有网 ...

  7. C# webbrowser 获取网页元素 示例代码

    在应用webbrowser对网页进行自动化操作时,不能有效地获取网页元素,往往是后续编程的拦路虎,原因是webbrowser提供的GetElementById().GetElementFromPoin ...

  8. 如何截取网页以及切割网页元素进行图像识别

    1. 使用   driver.save_screenshot('login.png') 可以保存当前网页的截图到当前文件目录 2.使用   yzm = driver.find_element_by_x ...

  9. JavaScript--JQuery事件 当网页元素加载完成后再去执行事件

    1. JQuery事件 JQuery帮助文档: 这里的selector都是CSS选择器的语法 CSS选择器 示例1 弹出提示框: <!DOCTYPE html> <html lang ...

最新文章

  1. 如何让两个div在同一行显示?一个float搞定
  2. 什么是BGP,BGP的优点有哪些?-Vecloud
  3. linux6下kdump的配置
  4. Open vSwitch系列实验(一):Open vSwitch使用案例扩展实验
  5. 基于DSP的汽车减震弹簧故障诊断仪的设计
  6. Dubbo监控平台安装
  7. 绑定dictionary 给定关键字不再字典中_VBA数组与字典解决方案第51讲:字典嵌套及二级下拉菜单的制作...
  8. mysql 升序_mysql 的 查找 与 排序
  9. 蚂蚁员工人均都能买一套杭州的房子了?!加油啊,打工人!
  10. Android自动化测试之路——技术准备
  11. 开源cms 和 开源博客_宝马自动驾驶汽车开发人员,用于IT的开源CMS和更多新闻
  12. DSP28335笔记 —— 定时器
  13. (matlab代码)绘制地震记录的F-K谱
  14. ArcGIS Engine开发的汉化小技巧-来自arcchen和记忆De残骸
  15. Telink IDE 泰凌微IDE C语言静态库的生成和使用
  16. android 放大镜功能,利用Android实现一个放大镜功能
  17. 315前瞻:哪些互联网消费领域今年可能上榜?
  18. python constants_Python constants.SUCCESS属性代码示例
  19. dependency check工具的使用
  20. win2008服务器系统玩红警,win10系统玩红警卡死的两种方法

热门文章

  1. Qt Creator使用Memcheck检测内存泄漏
  2. C++字节序反转的实现算法(附完整源码)
  3. C++演示std :: sort(),std :: reverse()的函数(附完整源码)
  4. C++ Opengl 3D世界源码
  5. c++多个对象构造和析构
  6. php 反向截取,反向PHP功能
  7. 指令系统寻址方式——指令寻址,数据寻址
  8. matlab修改矩阵元素,怎么修改矩阵中的某些元素 或者简单点说保留矩阵中的元素...
  9. 13_线性回归分析、线性模型、损失函数、最小二乘法之梯度下降、回归性能评估、sklearn回归评估API、线性回归正规方程,梯度下降API、梯度下降 和 正规方程对比
  10. IntelliJ IDEA2017 修改缓存文件的路径(转载:https://www.cnblogs.com/acm-bingzi/p/ideaCachePath.html)