但是你懂的,浏覽器實在太不和諧了,兼容性且不說,各種坐標屬性看得人頭昏眼花,極容易混淆。好吧,我來總結一下:
測試浏覽器:IE8, Chrome13, FF8, Safari5, Opera11
先上測試用例(用HTML5的doctype測試,也可看出未來的發展趨勢,其他doctype可自行測試):
復制代碼 代碼如下:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
<style type="text/css">
html {
background:red;
}
body {
background:green;
}
#null {
height:1000px;
}
#btn {
cursor:default;
background:blue;
width:50px;
height:30px;
line-height:30px;
text-align:center;
}
</style>
</head>
<body>
<div id='null'>空白區</div>
<div id="btn">點擊</div><!-- 按鈕用DIV是因為原生按鈕有圓角,不確定邊界 -->
</body>
<script type="text/javascript">
window.onload = function(){
var btn = document.getElementById('btn');
btn.onclick = function(e){
e = e|| window.event;
var box = (e.target || e.srcElement).getBoundingClientRect(),
offsetX = e.clientX - box.left,
offsetY = e.clientY - box.top;
p('x: '+ e.x+', y: '+e.y);
p('pageX: '+ e.pageX+', pageY: '+e.pageY);
p('offsetX: '+ e.offsetX+', offsetY: '+e.offsetY);
p('FF實現 offsetX: '+offsetX+', offsetY: '+offsetY);
p('layerX: '+ e.layerX+', layerY: '+e.layerY);
p('clientX: '+ e.clientX+', clientY: '+e.clientY);
p('body.scrollLeft: '+ document.body.scrollLeft+', body.scrollTop: '+document.body.scrollTop);
p('body.clientLeft: ' + document.body.clientLeft + ', body.clientTop: '+document.body.clientTop);
p('documentElement.scrollLeft: '+ document.documentElement.scrollLeft+', documentElement.scrollTop: '+document.documentElement.scrollTop);
p('documentElement.clientLeft: ' + document.documentElement.clientLeft + ', documentElement.clientTop: '+document.documentElement.clientTop);
}
}
function p(s){
console.log(s);
}
</script>
</html>
問:怎樣獲取鼠標相對於浏覽器可視文檔區域左上角的位置?
答:x, y和clientX, clientY皆可,但是x, y在IE下表示鼠標相對於文檔開頭的位置(即如果有滾到條的話,會計算在內),還有FF也不支持x, y
推薦: clientX, clientY
問:怎樣獲取鼠標相對於文檔開頭的位置?
答: IE:使用x, y(前提是事件源的父元素(一直到documentElement)沒有設置position:relative之類的,否則相對於最近元素,而非相對於文檔)
非IE:使用pageX, pageY
layerX, layerY其實也可以,但是IE和Opera不支持!
那麼如何確保IE正常取值呢?答:event.clientX + document.documentElement.scrollLeft, event.clientY + document.documentElement.scrollTop
問:怎樣獲取鼠標相對於事件源(event.target||event.srcElement)左上角的位置?
答:offsetX, offsetY。但是FF不支持,怎樣辦呢?
1. 先獲取鼠標相對於浏覽器可視文檔區域左上角的位置
2. 然後獲取事件源相對於浏覽器可視文檔區域左上角的位置
3. 相減,收工
也許有人會問,這第2步怎麼做啊?好吧,好人做到底!
HTMLElement.getBoundingClientRect()方法
返回值為:{top:xx, right:xx, bottom:xx, left:xx, width:xx, height:xx}
也就是說,一個元素的位置信息都給了,我們要做的就是:
復制代碼 代碼如下:
var box = (e.target || e.srcElement).getBoundingClientRect(),
offsetX = e.clientX - box.left,
offsetY = e.clientY - box.top;
經測試,所有浏覽器都和event.offsetX, event.offsetY保持一致(當然FF除外)
我的例子中,最後還檢測了scrollLeft, scrollTop, clientLeft, clientTop,本來以為它們幾個會作怪,可測試結果表明:
除了scrollTop,其他都是0(當然scrollLeft是因為沒出現橫向滾動條所致)
scrollTop各浏覽器表現不盡相同,如下:
body.scrollTop的情況
IE, FF, Opera:0
Chrome, Safari:向上滾動的距離
documentElement.scrollTop的情況
IE, FF, Opera:向上滾動的距離
Chrome, Safari:0