鼠标事件的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 相关文章推荐
javascript &&和||运算法的另类使用技巧
Nov 28 Javascript
jQuery设置div一直在页面顶部显示的方法
Oct 24 Javascript
JQuery性能优化的几点建议
May 14 Javascript
js利用prototype调用Array的slice方法示例
Jun 09 Javascript
jquery图形密码实现方法
Mar 11 Javascript
innerHTML属性,outerHTML属性,textContent属性,innerText属性区别详解
Mar 13 Javascript
js本地图片预览实现代码
Oct 09 Javascript
使用vue.js实现checkbox的全选和多个的删除功能
Feb 17 Javascript
vue.js todolist实现代码
Oct 29 Javascript
浅谈Vuex的状态管理(全家桶)
Nov 04 Javascript
原生JS实现留言板
Mar 26 Javascript
深入分析JavaScript 事件循环(Event Loop)
Jun 19 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
《APMServ 5.1.2》使用图解
2006/10/23 PHP
PHP源码分析之变量的存储过程分解
2014/07/03 PHP
PHP遍历数组的三种方法及效率对比分析
2015/02/12 PHP
PHP查询大量数据内存耗尽问题的解决方法
2016/10/28 PHP
tp5(thinkPHP5)框架连接数据库的方法示例
2018/12/24 PHP
PHP 命名空间和自动加载原理与用法实例分析
2020/04/29 PHP
JS焦点图切换,上下翻转
2011/05/12 Javascript
javascript实现简单的进度条
2015/07/02 Javascript
常用javascript表单验证汇总
2020/07/20 Javascript
设置jQueryUI DatePicker默认语言为中文
2016/06/04 Javascript
jQuery中get方法用法分析
2016/12/07 Javascript
vue-cli如何添加less 以及sass
2017/07/06 Javascript
React如何利用相对于根目录进行引用组件详解
2017/10/09 Javascript
JS立即执行的匿名函数用法分析
2019/11/04 Javascript
vue 对axios get pust put delete封装的实例代码
2020/01/05 Javascript
element-ui树形控件后台返回的数据+生成组织树的工具类
2020/03/05 Javascript
python重试装饰器示例
2014/02/11 Python
详解Django中Request对象的相关用法
2015/07/17 Python
python实现用户登录系统
2016/05/21 Python
Python实现定时执行任务的三种方式简单示例
2019/03/30 Python
python实现kmp算法的实例代码
2019/04/03 Python
python调试神器PySnooper的使用
2019/07/03 Python
Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
2019/08/05 Python
python批量图片处理简单示例
2019/08/06 Python
Python Django 添加首页尾页上一页下一页代码实例
2019/08/21 Python
Python使用itchat模块实现群聊转发,自动回复功能示例
2019/08/26 Python
tensorflow模型保存、加载之变量重命名实例
2020/01/21 Python
CSS3之2D与3D变换的实现方法
2019/01/28 HTML / CSS
英国现代市场:ARKET
2019/04/10 全球购物
安全的后院和健身蹦床:JumpSport
2019/07/15 全球购物
利用异或运算实现两个无符号数的加法运算
2013/12/20 面试题
简历中个人求职的自我评价模板
2013/11/29 职场文书
本科毕业生求职自荐信
2014/04/09 职场文书
记账会计岗位职责
2014/06/16 职场文书
基层医务人员三严三实心得体会
2016/01/05 职场文书
vue-element-admin项目导入和导出的实现
2021/05/21 Vue.js