鼠标事件的screenY,pageY,clientY,layerY,offsetY属性详解


Posted in Javascript onMarch 12, 2015

鼠标事件的screenY,pageY,clientY,layerY,offsetY属性详解

screenY

         鼠标相对于显示器屏幕左上角的偏移

pageY

         鼠标相对于页面左上角的偏移 (其值不会受滚动条的影响)

         IE9之下并不支持这个属性

         但是可以写点代码计算出来。 jQuery中的实现:

 // Calculate pageX/Y if missing and clientX/Y available

 if ( event.pageX == null && original.clientX != null ) {

     eventDoc = event.target.ownerDocument || document;

     doc = eventDoc.documentElement;

     body = eventDoc.body;

     event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft||body&&body.clientLeft || 0 );

     event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );

 }   

简单点实现就是。 

鼠标相对于浏览器视口的偏移加上文档的滚动条隐藏的高度减去文档的clientTop.

var pageY = event.clientY +document.documentElement. scrollTop-document.documentElement.clientTop

为何要减去document.documentElement.clientTop

这是IE8之下浏览器特有的文档的偏移,即使设置html,body的padding和margin为0也不会影响其值。

在iE7下测试,得到                              

 document.documentElement.clientTop --> 2px  document.documentElement.clientLeft --> 2px

 document.bocy.clientTop --> 0px  document.body.clientLeft --> 0px

clientY

         鼠标相对于浏览器视口左上角的偏移

         注意clientY和pageY的区别,clientY在页面无滚动条的情况下值等同于pageY

----------------------------------分割-----------------------------------------------

layerY

         如果元素的position样式不是默认的static,我们说这个元素具有定位属性。

         在当前触发鼠标事件的元素和它的祖先元素中找到最近的具有定位属性的元素,计算鼠标与其的偏移值,以找到元素的border的左上角的外交点作为相对点。如果找不到具有定位属性的元素,那么就相对于当前页面计算偏移,此时等同于pageY。

鼠标事件的screenY,pageY,clientY,layerY,offsetY属性详解

         IE9之下并不支持这个属性,但是可以用其特有的offsetY替换

offsetY  

 

  IE专有的属性

         offsetY和layerY的不同在于,前者的在计算偏移值时,相对于元素的border左上角的内交点,因此当鼠标位于元素的border上时,偏移值是一个负值。 另外offsetY并不在乎触发事件的元素是否有定位属性,它总是相对于触发事件的元素来计算偏移值。

鼠标事件的screenY,pageY,clientY,layerY,offsetY属性详解

   鉴于layerY和offsetY的不同,要兼容的使用二者要注意

        

1.触发事件的元素一定要设置定位属性。

       

2.在元素具有上边框border-top的情况下, layerY比offsetY的值多一个border-top的宽度值。

 //这里的element.borderTopWidth必须是实际计算出的元素的上边框宽度。

 var borderTopWidth =  window.getComputedStyle ? window.getComputedStyle(element,null).borderTopWidth: element.currentStyle.borderTopWidth; 

 var offsetY = event.offsetY||(event.layerY + borderTopWidth);

通过layerY和offsetY属性,可以很方便的计算鼠标相对于绑定鼠标事件元素的偏移,这在某些时候非常有用。   

这里详细说了鼠标竖直方向的偏移属性,水平方向的偏移类似,不再讨论。

以上就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
Prototype 学习 工具函数学习($A方法)
Jul 12 Javascript
在jquery中处理带有命名空间的XML数据
Jun 13 Javascript
javaScript复制功能调用实现方案
Dec 13 Javascript
两种方法实现文本框输入内容提示消失
Mar 17 Javascript
jQuery 属性选择器element[herf*='value']使用示例
Oct 20 Javascript
JavaScript数据结构与算法之集合(Set)
Jan 29 Javascript
jQuery取消特定的click事件
Feb 29 Javascript
JS实现微信弹出搜索框 多条件查询功能
Dec 13 Javascript
js前端日历控件(悬浮、拖拽、自由变形)
Mar 02 Javascript
基于vue 开发中出现警告问题去除方法
Jan 25 Javascript
wepy--用vantUI 实现上弹列表并选择相应的值操作
Nov 03 Javascript
原生JS实现音乐播放器
Jan 26 Javascript
JavaScript中return false的用法
Mar 12 #Javascript
JavaScript中神奇的call()方法
Mar 12 #Javascript
jquery实现无限分级横向导航菜单的方法
Mar 12 #Javascript
JavaScript中定义函数的三种方法
Mar 12 #Javascript
javascript实时显示北京时间的方法
Mar 12 #Javascript
jquery实现焦点图片随机切换效果的方法
Mar 12 #Javascript
JavaScript数据结构与算法之栈详解
Mar 12 #Javascript
You might like
PHP永久登录、记住我功能实现方法和安全做法
2015/04/27 PHP
Laravel中注册Facades的步骤详解
2016/03/16 PHP
基于jQuery实现左右div自适应高度完全相同的代码
2012/08/09 Javascript
GRID拖拽行的实例代码
2013/07/18 Javascript
JS返回上一页实例代码通过图片和按钮分别实现
2013/08/16 Javascript
javascript 循环调用示例介绍
2013/11/20 Javascript
JavaScript 判断用户输入的邮箱及手机格式是否正确
2013/12/08 Javascript
单击某一段文字改写文本颜色
2014/06/06 Javascript
BootStrap selectpicker
2016/06/20 Javascript
原生JS实现的放大镜效果实例代码
2016/10/15 Javascript
jQuery中图片展示插件highslide.js的简单dom
2018/04/22 jQuery
js运算符的一些特殊用法
2018/07/29 Javascript
js中对象和面向对象与Json介绍
2019/01/21 Javascript
微信小程序实现banner图轮播效果
2020/06/28 Javascript
Nodejs异步流程框架async的方法
2019/06/07 NodeJs
ES6对象操作实例详解
2020/05/23 Javascript
如何使用vue slot创建一个模态框的实例代码
2020/05/24 Javascript
基于javascript处理二进制图片流过程详解
2020/06/08 Javascript
python网络爬虫之如何伪装逃过反爬虫程序的方法
2017/11/23 Python
tensorflow学习笔记之mnist的卷积神经网络实例
2018/04/15 Python
对python制作自己的数据集实例讲解
2018/12/12 Python
pandas ix &iloc &loc的区别
2019/01/10 Python
python-numpy-指数分布实例详解
2019/12/07 Python
Python Handler处理器和自定义Opener原理详解
2020/03/05 Python
Python如何在windows环境安装pip及rarfile
2020/06/15 Python
Python数据库封装实现代码示例解析
2020/09/05 Python
Python 测试框架unittest和pytest的优劣
2020/09/26 Python
如何解决python多种版本冲突问题
2020/10/13 Python
简单整理HTML5的基本特性和语法
2016/02/18 HTML / CSS
英国豪华真皮和布艺沙发销售网站:Darlings of Chelsea
2018/01/05 全球购物
法国一家芭蕾舞鞋公司:Repetto
2018/11/12 全球购物
初三物理教学反思
2014/01/21 职场文书
局火灾防控工作方案
2014/05/25 职场文书
中层干部培训方案
2014/06/16 职场文书
女性励志书籍推荐
2019/08/19 职场文书
SpringCloud项目如何解决log4j2漏洞
2022/04/10 Java/Android