各浏览器的鼠标位置测试

原文地址:http://www.cnblogs.com/xesam/archive/2011/12/08/2280509.html

 

【补充】 screenX
鼠标在屏幕中的位置,指的是鼠标到电脑屏幕左侧的距离。 各个浏览器相同。
与clientX的区别是clientX是到浏览器的距离。
 例如:当网页缩小,拖动到屏幕中间时,screnX 大于 clientX

 

 

e.pageX
e.layerX(jquery里没有此属性,但可以在jquery里用e.originalEvent.layerX找到该值)
e.offsetX
e.clientX
e.x(同上,jquery里没有这个值,可以用e.originalEvent.x找到。x必须是小写的)

属性;

测试浏览器:

FF9/Chrome15/opera11.52/safari5(win)/IE6/7/8/9

测试代码:

View Code

图示:

测试结果如下:

说明:① 当前坐标系的含义,被点击对象所在的坐标系(即最近一个指定position: relative的tag的左上角的border外边界为原点)的坐标位置。
如果自身及上层均没有指定position: relative属性,则蜕变为相对于“相对可视区域的坐标”。

     ②:原作者关于layerX和offsetX的说明貌似有错误,自己用其他文档验证时两者并不是都相等的,具体待研究,

chrome:

e.pageX——相对整个页面的坐标
e.layerX——相对当前坐标系的border左上角开始的坐标
e.offsetX——相对当前坐标系的border左上角开始的坐标
e.clientX——相对可视区域的坐标
e.x——相对可视区域的坐标

ff:

e.pageX——相对整个页面的坐标
e.layerX——相对当前坐标系的border左上角开始的坐标
e.offsetX——无
e.clientX——相对可视区域的坐标
e.x——无

opera:

e.pageX——相对整个页面的坐标
e.layerX——无
e.offsetX——相对当前坐标系的内容区域左上角开始的坐标
e.clientX——相对可视区域的坐标
e.x——相对可视区域的坐标

safari:(这个和chrome是一样的)

e.pageX——相对整个页面的坐标
e.layerX——相对当前坐标系的border左上角开始的坐标
e.offsetX——相对当前坐标系的border左上角开始的坐标
e.clientX——相对可视区域的坐标
e.x——相对可视区域的坐标

 

IE9:

e.pageX——相对整个页面的坐标
e.layerX——相对当前坐标系的border左上角开始的坐标 + 滚动条滚过的距离(这个NB轰轰了····=。=)
e.offsetX——相对当前坐标系的内容区域左上角开始的坐标
e.clientX——相对可视区域的坐标
e.x——相对当前坐标系的border左上角开始

IE8:

e.pageX——无
e.layerX——无
e.offsetX——相对当前坐标系的内容区域左上角开始的坐标
e.clientX——相对可视区域的坐标
e.x——相对当前坐标系的border左上角开始

IE7:

e.pageX——无
e.layerX——无
e.offsetX——相对当前坐标系的内容区域左上角开始的坐标
e.clientX——相对可视区域的坐标
e.x——相对当前坐标系的border左上角开始

IE6:

e.pageX——无
e.layerX——无
e.offsetX——相对当前坐标系的内容区域左上角开始的坐标
e.clientX——相对可视区域的坐标
e.x——相对当前坐标系的border左上角开始

 

综合为下表:

插入表格不方便,鸭梨很大啊

 

其中clientX是W3C标准的一个属性,所以都挺符合的,其他的就看浏览器厂商的心情了。

对于非IE6/7/8来说,pageX属性都可以获取到鼠标事件发生处到整个页面左边的坐标,IE6/7/8就只能通过clientX+scrollLeft来获得相同的结果。

 

需要注意的是layerX和x这两个属性。

event.x本来是IE的,但是除了FF之外,其他的也都实现了这个属性,但是opera,chrome和safari和IE的实现并不一致,opera,chrome和safari的event.x返回值和event.clientX相同

opera没有实现layerX,IE9实现了,但是IE9又是个奇葩,layerX实现得稀奇古怪。

 

layerX与offsetX

除了ff,其他浏览器都实现了offsetX,opera跟随IE系列,与IE实现相同,就是从内容区域边界开始算起,就是上面图示中的B点,chrome和safari从border边界开始算起,就是上面图示中的A点。

 

除了上面的一些区别,另外一个重要区别就是各个浏览器默认的边界零点也不一致,计算的时候还需要根据浏览器不同来补充或删减。

 

附录:sf上一篇文章  https://segmentfault.com/q/1010000000392716

在获取鼠标的坐标 使用e.pageX和e.originalEvent.x 都能获取到 这两个区别是后者将滚动条计算进去了?而e.pageX只有在ff中才把滚动条计算进去了? 当然 e.originalEvent.x 也有兼容性的问题....

 

答案:

根据出现的“originalEvent”一词可猜测题主的本意是比较jquery下e.pageX和e.originalEvent.x的区别(因为originalEvent是jq在对构造一个jq版e对象后引用的原始e对象)。

根据jq源码,jq版e对象下的pageX和原生的pageX是一致的,但是增加了对旧版本IE的实现部分。

于是题目可蜕化为原生e.pageX与e.x的区别,以及jq为IE8-浏览器实现的e.pageX与原生e.x的区别。考虑jq的跨平台特性,我们在不清楚具体情况的时候,直接通过其补丁的实现方式来猜测属性的定义。

根据jq对无原生pageX的浏览器的补丁实现

event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );

到这里我们已经基本清楚pageX的涵义,是包含了滚动条的计算的。

实际上,e.pageX在各(支持的)浏览器下的表现都是一致的,都是表达点击位置相对于整个文档的位置,用题主的话说就是“计算了滚动条”。 兼容性来说,e.pageX除了在IE系列中低于IE9的版本中是不支持的,IE9+和其它主流浏览器全部一致支持。

可是e.x的情况很复杂…… 首先,fx不支持e.x。这没啥好说的。

其次,除IE外的其它主流浏览器,opera、chrome(以及其它同内核的浏览器),都支持e.x属性,其值为“相对可视区域的坐标”——没错,对它们来说,e.x == e.clientX。用题主的话说就是“没有计算滚动条”。

再来看看e.x属性的发明者IE。IE全系列支持e.x,但其涵义坑爹的很……
被点击对象所在的坐标系(即最近一个指定position: relative的tag的左上角的border外边界为原点)的坐标位置。
如果自身及上层均没有指定position: relative属性,则蜕变为相对于“相对可视区域的坐标”。

题外话,通过F12发现,IE一旦涉及滚动条后计算居然不是整像素数,而是会出现误差小数的!在此进行强烈吐槽。

<!DOCTYPE html>
<html>
<head>
<title></title>
<style type="text/css">
*{ margin: 0; padding: 0;}
#view{ position: relative; left: 25px; top:25px; width: 400px; height: 100px; border: 100px solid #adff2f; background: yellow;}
#view_2{ position: absolute; left: 75px; top:375px; width: 300px; height: 100px; background: lightgreen;}
#view_3{ position: absolute; left: 75px; top:375px; width: 300px; height: 100px; background: lightblue; }
#view_4{ position: relative; background: lightpink;}
#view_5{ position: relative; background: lightcyan;}
</style>
</head>
<body>
<div id="fake" style=" position: absolute; left: 10px; top:10px; width: 3000px; height: 2000px; background: #d3d3d3; padding: 50px;">
<div id="view"><span>3<span>2<span>1</span></span></span><div id="view_2"><span>3<span>2<span>1</span></span></span></div></div>
<div id="view_3"><span>3<span>2<span>1</span></span></span><div id="view_4"><span>3<span>2<span>1</span></span></span></div></div>
</div>
<div id="view_5"><span>3<span>2<span>1</span></span></span></div>
<script type="text/javascript">
document.onclick = function(e){
e = e || window.event;
console.log('e.pageX:',e.pageX);
console.log('e.layerX:',e.layerX);
console.log('e.offsetX:',e.offsetX);
console.log('e.clientX:',e.clientX);
console.log('e.x:',e.x);
}
</script>
</body>
</html>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值