鼠标事件的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 Validate 正则表达式实用验证代码大全
Aug 23 Javascript
js 异步操作回调函数如何控制执行顺序
Dec 24 Javascript
js判断设备是否为PC并调整图片大小
Feb 12 Javascript
JS实现div居中示例
Apr 17 Javascript
jQuery实现文件上传进度条特效
Aug 12 Javascript
jqGrid中文文档之选项设置
Dec 02 Javascript
一个非常好用的文字滚动的案例,鼠标悬浮可暂停[两种方案任选]
Dec 01 Javascript
js获取地址栏参数的两种方法
Jun 27 Javascript
Vue2.0 slot分发内容与props验证的方法
Dec 12 Javascript
在Vant的基础上实现添加表单验证框架的方法示例
Dec 05 Javascript
仿iPhone通讯录制作小程序自定义选择组件的实现
May 23 Javascript
使用Vue-cli3.0创建的项目 如何发布npm包
Oct 10 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
[原创]解决wincache不支持64位PHP5.5/5.6的问题(提供64位wincache下载)
2016/06/22 PHP
Jquery插件写法笔记整理
2012/09/06 Javascript
JQuery记住用户名密码实现下次自动登录功能
2015/04/27 Javascript
javascript自定义in_array()函数实现方法
2015/08/03 Javascript
Jquery插件easyUi实现表单验证示例
2015/12/15 Javascript
深入理解Angularjs中的$resource服务
2016/12/31 Javascript
[js高手之路]寄生组合式继承的优势详解
2017/08/28 Javascript
元素全屏的设置与监听实例
2017/11/28 Javascript
jquery3和layui冲突导致使用layui.layer.full弹出全屏iframe窗口时高度152px问题
2019/05/12 jQuery
[40:01]OG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python 正则表达式入门(初级篇)
2016/12/07 Python
python爬虫_微信公众号推送信息爬取的实例
2017/10/23 Python
Python无损音乐搜索引擎实现代码
2018/02/02 Python
python numpy格式化打印的实例
2018/05/14 Python
django反向解析和正向解析的方式
2018/06/05 Python
Python自然语言处理 NLTK 库用法入门教程【经典】
2018/06/26 Python
Python数据类型之Number数字操作实例详解
2019/05/08 Python
Python绘制堆叠柱状图的实例
2019/07/09 Python
Django文件上传与下载(FileFlid)
2019/10/06 Python
Python3的unicode编码转换成中文的问题及解决方案
2019/12/10 Python
python关于变量名的基础知识点
2020/03/03 Python
python GUI库图形界面开发之PyQt5多线程中信号与槽的详细使用方法与实例
2020/03/08 Python
python怎么自定义捕获错误
2020/06/29 Python
CSS3实现红包抖动效果
2020/12/23 HTML / CSS
瑞典领先的汽车零部件网上零售商:bildelaronline24.se
2017/01/12 全球购物
奥地利体育网上商店:Gigasport
2019/10/09 全球购物
Etam俄罗斯:法国女士内衣和家居服网上商店
2019/10/30 全球购物
计算机专业推荐信范文
2013/11/20 职场文书
播音主持女孩的自我评价分享
2013/11/20 职场文书
魅力教师事迹材料
2014/01/10 职场文书
音乐兴趣小组活动总结
2014/07/07 职场文书
2014年行政部工作总结
2014/11/19 职场文书
十岁生日答谢词
2015/01/05 职场文书
董存瑞观后感
2015/06/11 职场文书
原生JS中应该禁止出现的写法
2021/05/05 Javascript
OpenCV实现常见的四种图像几何变换
2022/04/01 Python