网页元素坐标表示及坐标计算方法
一、页面元素坐标种类
根据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()迭代计算而成。代码如下:
- var targetObj=document.getElementById('test'); //假设网页中存在一个id为test的元素
- function calcViewportLocation(obj, winObj) {
- var currentWindow = winObj;
- var rect = obj.getBoundingClientRect(); //获取该元素在当前窗口视图区域的位置
- var top = rect.top;
- var left = rect.left;
- var width = rect.width;
- var height = rect.height;
- //若该元素在某iframe中,则计算该frame相较于父窗口的位置,并向上迭代直到主frame。元素的位置坐标需要累加iframe的偏移。
- while (currentWindow.frameElement != null) {
- var obj1 = currentWindow.frameElement;
- currentWindow = currentWindow.parent;
- rect = obj1.getBoundingClientRect();
- if (rect.top > 0) { top += rect.top; }
- if (rect.left > 0) { left += rect.left; }
- }
- var final_x = Math.round(left);
- var final_y = Math.round(top);
- return {y:final_y, x:final_x, w:width, h:height};
- }
- //将该元素对象及所在window作为参数传入。
- 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
网页元素坐标表示及坐标计算方法相关推荐
- python获取网页元素坐标_html网页元素在屏幕上的坐标获取
今天在用python调用IE获取html网页元素在屏幕上的坐标,当然为了截图啦,(*^__^*) 嘻嘻-- xtop=ie.document.forms[i].elements[j].getBound ...
- JS获取网页大小和鼠标当前坐标
JS获取网页大小和鼠标当前坐标 var s = ""; s += "/r/n网页可见区域宽:"+ document.body.clientWidth; s += ...
- js中的事件对象event (获取元素的,x,y坐标)
event的使用 获取元素的,x,y坐标 如图所示 当鼠标放在上面那个框上时获取其坐标,并且在下面框中显示 其实需要使用到鼠标移动事件 onmousemove event 事件对象中封装了当前事项相关 ...
- 求出N×M整型数组的最大元素及其所在的行坐标及列坐标(如果最大元素不唯一,选择位置在最前面的一个)。
功能:求出N×M整型数组的最大元素及其所在的行坐标及 列坐标(如果最大元素不唯一,选择位置在最前面 的一个). 例如:输入的数组为: 1 2 3 4 15 6 12 18 9 10 11 2 求出的最 ...
- Javascript, 得到元素的左上角绝对坐标
//得到元素的左上角绝对坐标 function getObjPos(o){ var x=y=0; if(o.getBoundingClientRect){ var box=o.getBoundingC ...
- 网页元素常见的定位方式
1. 流式定位 这是网页元素默认的定位方式,网页元素按照其HTML标签的先后顺序,在网页内依次显示,就像液体一样"流动",所以称为"流式定位",这种方式将所有网 ...
- C# webbrowser 获取网页元素 示例代码
在应用webbrowser对网页进行自动化操作时,不能有效地获取网页元素,往往是后续编程的拦路虎,原因是webbrowser提供的GetElementById().GetElementFromPoin ...
- 如何截取网页以及切割网页元素进行图像识别
1. 使用 driver.save_screenshot('login.png') 可以保存当前网页的截图到当前文件目录 2.使用 yzm = driver.find_element_by_x ...
- JavaScript--JQuery事件 当网页元素加载完成后再去执行事件
1. JQuery事件 JQuery帮助文档: 这里的selector都是CSS选择器的语法 CSS选择器 示例1 弹出提示框: <!DOCTYPE html> <html lang ...
最新文章
- 如何让两个div在同一行显示?一个float搞定
- 什么是BGP,BGP的优点有哪些?-Vecloud
- linux6下kdump的配置
- Open vSwitch系列实验(一):Open vSwitch使用案例扩展实验
- 基于DSP的汽车减震弹簧故障诊断仪的设计
- Dubbo监控平台安装
- 绑定dictionary 给定关键字不再字典中_VBA数组与字典解决方案第51讲:字典嵌套及二级下拉菜单的制作...
- mysql 升序_mysql 的 查找 与 排序
- 蚂蚁员工人均都能买一套杭州的房子了?!加油啊,打工人!
- Android自动化测试之路——技术准备
- 开源cms 和 开源博客_宝马自动驾驶汽车开发人员,用于IT的开源CMS和更多新闻
- DSP28335笔记 —— 定时器
- (matlab代码)绘制地震记录的F-K谱
- ArcGIS Engine开发的汉化小技巧-来自arcchen和记忆De残骸
- Telink IDE 泰凌微IDE C语言静态库的生成和使用
- android 放大镜功能,利用Android实现一个放大镜功能
- 315前瞻:哪些互联网消费领域今年可能上榜?
- python constants_Python constants.SUCCESS属性代码示例
- dependency check工具的使用
- win2008服务器系统玩红警,win10系统玩红警卡死的两种方法
热门文章
- Qt Creator使用Memcheck检测内存泄漏
- C++字节序反转的实现算法(附完整源码)
- C++演示std :: sort(),std :: reverse()的函数(附完整源码)
- C++ Opengl 3D世界源码
- c++多个对象构造和析构
- php 反向截取,反向PHP功能
- 指令系统寻址方式——指令寻址,数据寻址
- matlab修改矩阵元素,怎么修改矩阵中的某些元素 或者简单点说保留矩阵中的元素...
- 13_线性回归分析、线性模型、损失函数、最小二乘法之梯度下降、回归性能评估、sklearn回归评估API、线性回归正规方程,梯度下降API、梯度下降 和 正规方程对比
- IntelliJ IDEA2017 修改缓存文件的路径(转载:https://www.cnblogs.com/acm-bingzi/p/ideaCachePath.html)