鼠标事件的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 相关文章推荐
jQuery的实现原理的模拟代码 -3 事件处理
Aug 03 Javascript
Jquery插件写法笔记整理
Sep 06 Javascript
jQuery实现dialog设置focus焦点的方法
Jun 10 Javascript
微信小程序 wxapp画布 canvas详细介绍
Oct 31 Javascript
详解js树形控件—zTree使用总结
Dec 28 Javascript
js分页之前端代码实现和请求处理
Aug 04 Javascript
JS实现的计数排序与基数排序算法示例
Dec 04 Javascript
JS/HTML5游戏常用算法之路径搜索算法 随机迷宫算法详解【普里姆算法】
Dec 13 Javascript
微信小程序位置授权处理方法
Jun 13 Javascript
bootstrap table实现横向合并与纵向合并
Jul 18 Javascript
Vue可自定义tab组件用法实例
Oct 24 Javascript
nuxt+axios实现打包后动态修改请求地址的方法
Apr 22 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源代码加密?PHP二进制加密与解密的解决办法
2013/04/22 PHP
PHP实现Soap通讯的方法
2014/11/03 PHP
php字符串的替换,分割和连接方法
2016/05/23 PHP
PHP错误处理函数register_shutdown_function使用示例
2017/07/03 PHP
PHP变量的作用范围实例讲解
2020/12/22 PHP
一段实时更新的时间代码
2006/07/07 Javascript
javascript 判断中文字符长度的函数代码
2012/08/27 Javascript
jQuery获取样式中颜色值的方法
2015/01/29 Javascript
ajax读取数据后使用jqchart显示图表的方法
2015/06/10 Javascript
用JavaScript判断CSS浏览器类型前缀的两种方法
2015/10/08 Javascript
jQuery Easyui 验证两次密码输入是否相等
2016/05/13 Javascript
javascript之Array 数组对象详解
2016/06/07 Javascript
简单实现js无缝滚动效果
2017/02/05 Javascript
BootStrap 表单控件之单选按钮水平排列
2017/05/23 Javascript
vue过渡和animate.css结合使用详解
2017/06/14 Javascript
javaScript字符串工具类StringUtils详解
2017/12/08 Javascript
Angular CLI在Angular项目中如何使用scss详解
2018/04/10 Javascript
Vue监听数据渲染DOM完以后执行某个函数详解
2018/09/11 Javascript
javascript设计模式 ? 策略模式原理与用法实例分析
2020/04/21 Javascript
原生js实现html手机端城市列表索引选择城市
2020/06/24 Javascript
Python正则匹配判断手机号是否合法的方法
2020/12/09 Python
python函数与方法的区别总结
2019/06/23 Python
python是否适合网页编程详解
2019/10/04 Python
Python如何在main中调用函数内的函数方式
2020/06/01 Python
python中not、and和or的优先级与详细用法介绍
2020/11/03 Python
基于Python中Remove函数的用法讨论
2020/12/11 Python
瑞士国际航空官网:SWISS
2016/07/21 全球购物
四方通行旅游网:台湾订房、出国旅游
2017/09/20 全球购物
幼儿园教师培训方案
2014/02/04 职场文书
本科毕业生专业自荐书范文
2014/02/05 职场文书
人事主管岗位职责说明书
2014/07/30 职场文书
纪念九一八事变演讲稿:牢记九一八,屈辱怎能忘
2014/09/14 职场文书
西部计划志愿者工作总结
2015/08/11 职场文书
2016年端午节红领巾广播稿
2015/12/18 职场文书
领导干部学习三严三实心得体会
2016/01/05 职场文书
我对PyTorch dataloader里的shuffle=True的理解
2021/05/20 Python