JS:clientX/Y、screenX/Y、pageX/Y、offsetX/Y、layerX/Y、x/y

Event对象

Event对象代表事件的状态,比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态。

Event对象只在事件发生的过程中才有效。

浏览器兼容性

FF:没有window.event对象。可以通过给函数的参数传递event对象。

示例代码:

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8"/>
	<title>鬼眼邪神的博客</title>
</head>

<body>
	<input type="button" name="" value="按钮" id="button"/>
	<script>
		var button=document.getElementById("button");

		button.οnclick=function (event){
		var event=window.event||event;
		alert(event.clientX);
		}
	</script>
</body>
</html>

clientX

clientX事件属性返回当事件被触发时鼠标指针相对于浏览器窗口(有效显示区域,不含滚动条)的水平坐标。

clientY

clientY事件属性返回当事件被触发时鼠标指针相对于浏览器窗口(有效显示区域,不含滚动条)的垂直坐标。

测试clientX、clientY及其它事件属性用到的代码:

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8"/>
	<title>鬼眼邪神的博客</title>
	<style>
		*{
			margin:0;
			padding:0;
		}
		body {
			margin:0 0 0 100px;
			width:200px;
			height:800px;
			border:5px solid #000;
			background:yellow;
		}
		.green {
			position:relative;
			margin:50px auto;
			padding:20px;
			width:80px;
			height:80px;
			border:10px solid #000;
			background:rgb(0,255,0);
		}
		.red {
			width:1px;
			height:1px;
			background:rgb(255,0,0);
		}
		.con {
			width:200px;
			height:100px;
		}
	</style>
	<script>
		(function(){
			window.οnlοad=function (){
				var con=document.getElementById("con");

				document.οnclick=function (event){
					var event=window.event||event;

					con.innerHTML=
						"clientX="+event.clientX+","+
						"clientY="+event.clientY+"<br/>"+
						"screenX="+event.screenX+","+
						"screenY="+event.screenY+"<br/>"+
						"pageX="+event.pageX+","+
						"pageY="+event.pageY+"<br/>"+
						"offsetX="+event.offsetX+","+
						"offsetY="+event.offsetY+"<br/>"+
						"layerX="+event.layerX+","+
						"layerY="+event.layerY+"<br/>"+
						"x="+event.x+","+
						"y="+event.y+"<br/>";
				}
			}
		})();
	</script>
</head>

<body id="body">
	<div class="green" id="green">
		<div class="red"></div>
	</div>
	<div class="con" id="con"></div>
</body>
</html>

下图中显示了页面滚动前后用鼠标点击绿色块上的红点时clientX和clientY。


浏览器兼容性

各浏览器都支持。在IE7中,clientX和clientY的计算起点不是浏览器窗口的有效显示区域,而是包括了有效显示区域边缘的2px的边框。

下图中的红色方框所在的位置是clientX和clientY的计算起点,而黄色的部分是浏览器窗口的有效显示区域。


screenX

screenX事件属性返回事件发生时鼠标指针相对于屏幕的水平坐标。

screenY

screenY事件属性返回事件发生时鼠标指针相对于屏幕的垂直坐标。

浏览器兼容性

所有的浏览器都支持,并且解释都一样。

pageX

pageX事件属性返回事件发生时鼠标指针相对于页面的水平坐标。不随页面滚动而发生变化。

pageY

pageY事件属性返回事件发生时鼠标指针相对于页面的垂直坐标。不随页面滚动而发生变化。

浏览器兼容性

只有IE不支持。解决方法是pageX/Y=clientX/Y+(页面滚去的宽度/高度)。

知识扩展

对于获取页面滚动条滚动的高度,除IE外的浏览器可以通过window对象的pageXOffset/pageYOffset属性来获取。对于IE来说就比较麻烦一点,它依赖当前文档类型。文档类型分为Standards Mode和Quirks Mode,页面声明了DOCTYPE时为Standards Mode,反之为Quirks Mode。可以使用document.compatMode来获取,该方法也同时支持其它浏览器,其返回值为BackCompat或CSS1Compat。

当文档类型为Standards Mode,获取方式为:document.documentElement.scrollTop;而Quirks Mode时则为:document.body.scrollTop。

示例代码:

function scrollLeft(){
    if ('pageXOffset' in window) {
        return window.pageXOffset;
    } else if (document.compatMode === "BackCompat") {
        return document.body.scrollLeft;
    } else {
        return document.documentElement.scrollLeft;
    }
}

offsetX

offsetX事件属性返回发生事件的地点在事件源元素的坐标系统中的x坐标。

offsetY

offsetY事件属性返回发生事件的地点在事件源元素的坐标系统中的y坐标。

浏览器兼容性
  • 在Chrome、Safari、Opera中,事件源元素的坐标系统从border-box开始
  • 在IE中,事件源元素的坐标系统从content-box开始。如果鼠标指针在border上,则会出现负值。
  • FireFox不支持。
  • 在IE7中,页面的坐标系统也包括了浏览器窗口的有效显示区域边缘的2px的灰色边框,但是起点还是和其它浏览器一样,即页面左上角(不包括灰色边框)。如果点击灰色边框,则会出现负值。
layerX

layerX事件属性返回鼠标相比较于当前坐标系的x坐标,即如果触发元素没有定位属性,以页面为参考点。如果有,将改变参考坐标系,以触发元素的border-box的左上角为参考点。

layerY

layerY事件属性返回鼠标相比较于当前坐标系的y坐标,即如果触发元素没有定位属性,以页面为参考点。如果有,将改变参考坐标系,以触发元素的border-box的左上角为参考点。

浏览器兼容性

只有IE不支持。

x

x事件属性返回鼠标相比较于当前坐标系的x坐标。

y

y事件属性返回鼠标相比较于当前坐标系的y坐标。

浏览器兼容性
  • FireFox不支持。
  • 在Chrome、Safari、Opera中,始终以页面为参考系。
  • 在IE中,如果触发元素没有定位属性,以页面为参考点;如果有,将改变参考坐标系,以触发元素的border区域的左上角为参考点。
  • 在IE8中,页面和触发元素的坐标系统的起点则比其它浏览器下移了2px。当点击页面起点时,结果是(-2,-2)。当点击触发元素的border-box的左上角时,结果是(-2,-2)。
  • 在IE7中,(1)当以页面为参考时,页面的坐标系统也包括了浏览器窗口的有效显示区域边缘的2px的灰色边框,但是起点还是和其它浏览器一样,即页面左上角(不包括灰色边框);如果点击灰色边框,则会出现负值。(2)当以触发元素为参考时,触发元素的坐标系统的起点则比其它浏览器下移了2px。当点击触发元素的border-box的左上角时,结果是(-2,-2)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值