pageX,clientX,offsetX,layerX的区别

在各个浏览器的JS中,有很多个让你十分囧的属性,由于各大厂商对标准的解释和执行不一样,导致十分混乱,也让我们这些前端攻城狮十分无语和纠结>_<

John Resig大神说过,动态元素有3个至关重要的元素,位置,尺寸和可见性.所以,今天,先拿几个页面位置属性开刀.

一.PageX和clientX

PageX和clientX ,这个两个比较容易搞混,
PageX:鼠标在页面上的位置,从页面左上角开始,即是以页面为参考点,不随滑动条移动而变化
clientX:鼠标在页面上可视区域的位置,从浏览器可视区域左上角开始,即是以浏览器滑动条此刻的滑动到的位置为参考点,随滑动条移动 而变化.
真拗口,直接上图,


两个DIV接触点(黑点位置)
如果将浏览器Y轴方向缩小,出现了滑动条就可以分辨出两者的区别

很明显,红色参考块已经被滑动条截取部分,PageY不变,但是clientY已经变了

可是悲剧的是,PageX只有FF特有,IE这个悲剧没有啊T_T,所以大牛们想出了一个办法
PageY=clientY+scrollTop-clientTop;(只讨论Y轴,X轴同理,下同)

页面上的位置=可视区域位置+页面滚动条切去高度-自身border高度,还是直接上图比较清楚

很明显,模块交界处,scrollTop代表的是被浏览器滑动条滚过的长度,和clientY相加,刚好等于100,最后还要再减去一个clientTop,即是border-top的宽度

Jquery中的PageX的代码如下.十分精炼..

1 2 3 4 5 6
// Calculate pageX/Y if missing and clientX/Y available if ( event.pageX == null && event.clientX !=  null ) { 	var doc = document.documentElement, body = document.body; 	event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft  || body && body.clientLeft || 0); 	event.pageY = event.clientY + (doc && doc.scrollTop  ||  body && body.scrollTop  || 0) - (doc && doc.clientTop  || body && body.clientTop  || 0); }

二.screenX

screenX:鼠标在屏幕上的位置,从屏幕左上角开始,这个没有任何争议,不讨论 ^_^

三.offsetX和layerX

接下来是offsetX和layerX
offsetX:IE特有,鼠标相比较于触发事件的元素的位置,以元素盒子模型的内容区域的左上角为参考点,如果有boder,可能出现负值

IE以内容区域开始,向上进入border将出现负值

layerX:FF特有,鼠标相比较于当前坐标系的位置,即如果触发元素没有设置绝对定位或相对定位,以页面为参考点,如果有,将改变参考坐标系,从触发元素盒子模型的border区域的左上角为参考点
也就是当触发元素设置了相对或者绝对定位后,layerX和offsetX就幸福地生活在一起^-^,几乎相等,唯一不同就是一个从border为参考点,一个以内容为参考点

FF从border开始,

x/y:IE特有,这个本来和layerX/layerY的作用基本一样,但是IE的当前坐标选择十分混乱,能不用就不用,不讨论

网上别人总结的关于这六个纠结的纠结表..

1 2 3 4 5 6
offsetX/offsetY:W3C- IE+ Firefox- Opera+ Safari+ chrome+ x/y:W3C- IE+ Firefox- Opera+ Safari+ chrome+ layerX/layerY:W3C- IE- Firefox+ Opera- Safari+ chrome+ pageX/pageY:W3C- IE- Firefox+ Opera+ Safari+ chrome+ clientX/clientY:W3C+ IE+ Firefox+ Opera+ Safari+ chrome+ screenX/screenY:W3C+ IE+ Firefox+ Opera+ Safari+ chrome+

只有clientX和screenX 皆大欢喜是W3C标准.其他的,都纠结了.
最给力的是,chrome和safari一条龙通杀!完全支持所有属性.其中(offsetX和layerX都是以border为参考点)…


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title></title>

<style type="text/css">

*{margin:0;padding:0}

span{padding-right:10px;}



</style>



</head>



<body>

	<div id="father" style="border:0px solid red;width:200px;">

	<div id="a" style="background:red;width:100px;height:100px">长,宽都是100px</div>

	<div id="b" style="border-top:0px solid red;background:yellow;width:100px;height:100px;margin-left:100px;"></div>

	</div>

	<table>

	<tr>

		<td>pageX:<span id="pageX"></span></td>

		<td>clientX:<span id="clientX"></span></td>

		<td>scrollLeft:<span id="scrollLeft"></span></td>

		<td>screenX:<span id="screenX"></span></td>

		<td>offsetX:<span id="offsetX"></span></td>

		<td>layerX:<span id="layerX"></span></td>

	</tr>

	<tr>

		<td>pageY:<span id="pageY"></span></td>

		<td>clientY:<span id="clientY"></span></td>

		<td>scrollTop:<span id="scrollTop"></span></td>

		<td>screenY:<span id="screenY"></span></td>

		<td>offsetY:<span id="offsetY"></span></td>

		<td>layerY:<span id="layerY"></span></td>

	</tr>

	

	</table>

<br/>



<br/>

	<pre>

offsetX/offsetY:W3C- IE+ Firefox- Opera+ Safari+ chrome+

x/y:W3C- IE+ Firefox- Opera+ Safari+ chrome+

layerX/layerY:W3C- IE- Firefox+ Opera- Safari+ chrome+

pageX/pageY:W3C- IE- Firefox+ Opera+ Safari+ chrome+

clientX/clientY:W3C+ IE+ Firefox+ Opera+ Safari+ chrome+

screenX/screenY:W3C+ IE+ Firefox+ Opera+ Safari+ chrome+

	</pre>



</body>

<script>

var $=function(id){

	return ("string"==typeof id) ? document.getElementById(id):id;

};





function text(e){

	e=e||window.event;

	//IE

	var doc=document.documentElement;

	//chrome

	var body = document.body;

	$("pageX").innerHTML=e.pageX;

	$("pageY").innerHTML=e.pageY;

	$("clientX").innerHTML=e.clientX;

	$("clientY").innerHTML=e.clientY;

	$("screenX").innerHTML=e.screenY;

	$("screenY").innerHTML=e.screenY;

	$("scrollTop").innerHTML=doc && doc.scrollTop;

	$("scrollLeft").innerHTML=doc && doc.scrollLeft;

	$("offsetX").innerHTML=e.offsetX;

	$("offsetY").innerHTML=e.offsetY;

	$("layerX").innerHTML=e.layerX;

	$("layerY").innerHTML=e.layerY;

}

$("a").οnmοusemοve=function(e){ text(e);}	

$("b").οnmοusemοve=function(e){ text(e);}	



</script>

</html>


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值