鼠标事件的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下弹出窗口的变通
Apr 18 Javascript
javascript 尚未实现错误解决办法
Nov 27 Javascript
基于jquery的loading效果实现代码
Nov 05 Javascript
jquery $.ajax()取xml数据的小问题解决方法
Nov 20 Javascript
Jquery Ajax Error 调试错误的技巧
Nov 20 Javascript
Bootstrap字体图标无法正常显示的解决方法
Oct 08 Javascript
利用jQuery插件imgAreaSelect实现图片上传裁剪(同步显示图像位置信息)
Dec 02 Javascript
Javascript中构造函数要注意的一些坑
Jan 23 Javascript
移动端图片上传旋转、压缩问题的方法
Oct 16 Javascript
微信小程序使用canvas的画图操作示例
Jan 18 Javascript
JS使用canvas中的measureText方法测量字体宽度示例
Feb 02 Javascript
解决echarts vue数据更新,视图不更新问题(echarts嵌在vue弹框中)
Jul 20 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
在MongoDB中模拟Auto Increment的php代码
2011/03/06 PHP
PHP处理SQL脚本文件导入到MySQL的代码实例
2014/03/17 PHP
初识php MVC
2014/09/10 PHP
php函数与传递参数实例分析
2014/11/15 PHP
PHP微信开发之查询城市天气
2016/06/23 PHP
PHP对XML内容进行修改和删除实例代码
2016/10/26 PHP
IE6/7/8中Option元素未设value时Select将获取空字符串
2011/04/07 Javascript
Jquery插件编写简明教程
2014/03/25 Javascript
JSON+HTML实现国家省市联动选择效果
2014/05/18 Javascript
javascript使用for循环批量注册的事件不能正确获取索引值的解决方法
2014/12/20 Javascript
js实现显示当前状态的导航效果代码
2015/08/28 Javascript
jQuery使用$.ajax提交表单完整实例
2015/12/11 Javascript
javascript每日必学之继承
2016/02/23 Javascript
JS中事件冒泡和事件捕获介绍
2016/12/13 Javascript
JS完成画圆圈的小球
2017/03/07 Javascript
yii form 表单提交之前JS在提交按钮的验证方法
2017/03/15 Javascript
JavaScript实现三级联动菜单实例代码
2017/06/26 Javascript
移动端Ionic App 资讯上下循环滚动的实现代码(跑马灯效果)
2017/08/29 Javascript
微信小程序左右滑动的实现代码
2017/12/15 Javascript
深入理解Vue Computed计算属性原理
2018/05/29 Javascript
使用js实现将后台传入的json数据放在前台显示
2018/08/06 Javascript
vue 组件开发原理与实现方法详解
2019/11/29 Javascript
[01:29:42]Liquid vs VP Supermajor决赛 BO 第一场 6.10
2018/07/05 DOTA
浅谈python字符串方法的简单使用
2016/07/18 Python
python入门基础之用户输入与模块初认识
2016/11/14 Python
python机器学习之KNN分类算法
2018/08/29 Python
对Python 3.2 迭代器的next函数实例讲解
2018/10/18 Python
Django框架自定义session处理操作示例
2019/05/27 Python
施工安全协议书
2013/12/11 职场文书
超级搞笑检讨书
2014/01/15 职场文书
外国人聘用意向书
2014/04/01 职场文书
2015年司法所工作总结
2015/04/27 职场文书
校园音乐节目广播稿
2015/08/19 职场文书
浅谈JS的原型和原型链
2021/06/04 Javascript
如何利用 CSS Overview 面板重构优化你的网站
2021/10/24 HTML / CSS