鼠标事件的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 相关文章推荐
新浪中用来显示flash的函数
Apr 02 Javascript
汉化英文版的Dreamweaver CS5并自动提示jquery
Nov 25 Javascript
用JS实现一个TreeMenu效果分享
Aug 28 Javascript
使用jQuery避免鼠标双击的解决方案
Aug 21 Javascript
原生JS版和jquery版实现checkbox的全选/全不选/点选/行内点选(Mr.Think)
Oct 29 Javascript
给easyui的datebox控件添加清空按钮的实现方法
Nov 09 Javascript
jQuery层级选择器实例代码
Feb 06 Javascript
JS判断微信扫码的方法
Aug 07 Javascript
深入浅析javascript继承体系
Oct 23 Javascript
详解Vue2 添加对scss的支持
Jan 02 Javascript
vue路由--网站导航功能详解
Mar 29 Javascript
vue+echarts实现动态折线图的方法与注意
Sep 01 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 程序授权验证开发思路
2009/07/09 PHP
遭遇php的in_array低性能问题
2013/09/17 PHP
php身份证号码检查类实例
2015/06/18 PHP
标准版Eclipse搭建PHP环境的详细步骤
2015/11/18 PHP
PHP最常用的正则表达式
2017/02/13 PHP
php从数据库读取数据,并以json格式返回数据的方法
2018/08/21 PHP
禁止直接访问php文件代码分享
2020/05/05 PHP
js no-repeat写法 背景不重复
2009/03/18 Javascript
自己写了一个展开和收起的多更能型的js效果
2013/03/05 Javascript
使用js如何实现全选与全不选
2013/12/30 Javascript
jQuery实现类似标签风格的导航菜单效果代码
2015/08/25 Javascript
如何实现移动端浏览器不显示 pc 端的广告
2015/10/15 Javascript
深入解析JavaScript中的数字对象与字符串对象
2015/10/21 Javascript
jQuery1.9+中删除了live以后的替代方法
2016/06/17 Javascript
Angular2监听页面大小变化的解决方法
2017/10/09 Javascript
nodejs连接mysql数据库及基本知识点详解
2018/03/20 NodeJs
微信小程序自定义多选事件的实现代码
2018/05/17 Javascript
javascript设计模式 ? 建造者模式原理与应用实例分析
2020/04/10 Javascript
Vue中使用JsonView来展示Json树的实例代码
2020/11/16 Javascript
python益智游戏计算汉诺塔问题示例
2014/03/05 Python
Python实现好友全头像的拼接实例(推荐)
2017/06/24 Python
Python多重继承之菱形继承的实例详解
2020/02/12 Python
python虚拟环境模块venv使用及示例
2020/03/04 Python
Python新手如何理解循环加载模块
2020/05/29 Python
解决python3中os.popen()出错的问题
2020/11/19 Python
在Python中实现字典反转案例
2020/12/05 Python
HTML5实现桌面通知 提示功能
2017/10/11 HTML / CSS
餐饮业会计岗位职责
2013/12/19 职场文书
硕士研究生自我鉴定范文
2013/12/27 职场文书
市场部经理岗位职责
2014/04/10 职场文书
《少年王勃》教学反思
2014/04/27 职场文书
心得体会的写法
2014/09/05 职场文书
领导干部“四风”查摆问题个人整改措施
2014/10/28 职场文书
交通安全月活动总结
2015/05/08 职场文书
导游词之南京栖霞山
2019/10/18 职场文书
《地。-关于地球的运动-》单行本第七集上市,小说家朝井辽献上期待又害怕的推荐文
2022/03/31 日漫