鼠标事件的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 相关文章推荐
JS宝典学习笔记(下)
Jan 10 Javascript
JS跨域总结
Aug 30 Javascript
JavaScript中的object转换成number或string规则介绍
Dec 31 Javascript
javascript中函数作为参数调用的方法
Feb 09 Javascript
JS拖动鼠标画出方框实现鼠标选区的方法
Aug 05 Javascript
javascript实现连续赋值
Aug 10 Javascript
Vue.js 父子组件通讯开发实例
Sep 06 Javascript
js实现界面向原生界面发消息并跳转功能
Nov 22 Javascript
websocket+node.js实现实时聊天系统问题咨询
May 17 Javascript
JS通过ajax + 多列布局 + 自动加载实现瀑布流效果
May 30 Javascript
JavaScript仿京东秒杀倒计时
Mar 17 Javascript
原生js实现点击按钮复制内容到剪切板
Nov 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
提升PHP执行速度全攻略(下)
2006/10/09 PHP
PHP实现取得HTTP请求的原文
2014/08/18 PHP
php+ajax实现带进度条的上传图片功能【附demo源码下载】
2016/09/14 PHP
php处理抢购类功能的高并发请求
2018/02/08 PHP
PDO::inTransaction讲解
2019/01/28 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
2020/03/24 PHP
jquery获取input的value问题说明
2010/08/19 Javascript
JS两种定义方式的区别、内部原理
2013/11/21 Javascript
简单方法判断JavaScript对象为null或者属性为空
2014/09/26 Javascript
javascript使用smipleChart实现简单图表
2015/01/02 Javascript
深入理解JavaScript系列(43):设计模式之状态模式详解
2015/03/04 Javascript
jQuery的Cookie封装,与PHP交互的简单实现
2016/10/05 Javascript
js自定义Tab选项卡效果
2017/06/05 Javascript
node.js文件上传重命名以及移动位置的示例代码
2018/01/19 Javascript
微信小程序实现人脸检测功能
2018/05/25 Javascript
jQuery中常用动画效果函数知识点整理
2018/08/19 jQuery
微信小程序分享功能onShareAppMessage(options)用法分析
2019/04/24 Javascript
VSCode写vue项目一键生成.vue模版,修改定义其他模板的方法
2020/04/17 Javascript
js里面的变量范围分享
2020/07/18 Javascript
vue3.0中setup使用(两种用法)
2020/12/02 Vue.js
js实现头像上传并且可预览提交
2020/12/25 Javascript
[01:08:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS LGD-CDEC
2014/05/22 DOTA
Python微信企业号开发之回调模式接收微信端客户端发送消息及被动返回消息示例
2017/08/21 Python
对Python中gensim库word2vec的使用详解
2018/05/08 Python
python scipy求解非线性方程的方法(fsolve/root)
2018/11/12 Python
基于Python绘制美观动态圆环图、饼图
2020/06/03 Python
Python3以GitHub为例来实现模拟登录和爬取的实例讲解
2020/07/30 Python
python的flask框架难学吗
2020/07/31 Python
pytorch 移动端部署之helloworld的使用
2020/10/30 Python
Scrapy实现模拟登录的示例代码
2021/02/21 Python
日本索尼音乐商店:Sony Music Shop
2018/07/17 全球购物
电气工程及其自动化学生实习自我鉴定
2013/09/19 职场文书
接待员岗位责任制
2014/02/10 职场文书
纪检干部对照检查材料
2014/08/22 职场文书
四查四看自我剖析材料
2014/09/19 职场文书
反四风个人对照检查材料
2014/09/26 职场文书