JS Dom Event 中的clientX、screenX、pageX、offsetX、layerX

在前面的幾篇文章中,我們討論過offset、client和scroll。

JS offset系列簡明教程
JS client系列簡明教程
JS scroll系列簡明教程

在這裏面,我們討論的,是DOM裏面的element的屬性,是window的方法。

這是,關於offset、client和scroll這幾個東西,還有一部分是關於Dom裏Event的屬性的。


Dom Event中的座標屬性

  • event.clientX/Y
  • event.pageX/Y
  • event.offsetX/Y
  • event.layerX/Y
  • event.screenX/Y
  • event.x/y

==屬性有這麼多,但是clientX 和 screenX用得最多。==

區別

clientX/Y

clientX/Y獲取到的是觸發點相對瀏覽器可視區域左上角距離,不隨頁面滾動而改變。

兼容性:所有瀏覽器均支持

pageX/Y

pageX/Y獲取到的是觸發點相對文檔區域左上角距離,會隨着頁面滾動而改變

兼容性:除IE6/7/8不支持外,其餘瀏覽器均支持

offsetX/Y

offsetX/Y獲取到是觸發點相對被觸發dom的左上角距離,不過左上角基準點在不同瀏覽器中有區別,其中在IE中以內容區左上角爲基準點不包括邊框,如果觸發點在邊框上會返回負值,而chrome中以邊框左上角爲基準點。

兼容性:IE所有版本,chrome,Safari均完美支持,Firefox不支持

layerX/Y

layerX/Y獲取到的是觸發點相對被觸發dom左上角的距離,數值與offsetX/Y相同,這個變量就是firefox用來替代offsetX/Y的,基準點爲邊框左上角,但是有個條件就是,被觸發的dom需要設置爲position:relative或者position:absolute,否則會返回相對html文檔區域左上角的距離。

兼容性:IE6/7/8不支持,opera不支持,IE9/10和Chrome、Safari均支持

screenX/Y

screenX/Y獲取到的是觸發點相對顯示器屏幕左上角的距離,不隨頁面滾動而改變。

兼容性:所有瀏覽器均支持

屬性/瀏覽器 chrome firefox ie6/7/8 ie9 ie10+
offsetX ✔️ ✔️ ✔️ ✔️
clientX ✔️ ✔️ ✔️ ✔️ ✔️
pageX ✔️ ✔️ ✔️ ✔️
screenX ✔️ ✔️ ✔️ ✔️ ✔️
layerX ✔️ ✔️ ✔️ ✔️
x ✔️ ✔️ ✔️ ✔️

綜上所述,clientX 和 screenX 是一路路燈,暢行無阻

測試代碼

<!DOCTYPE HTML>
<html lang="zh-cn">
<head>
    <meta charset="utf-8" />
    <title>Javascript</title>
    <style>
        body{margin:0;padding:0;background:#ccc;font-size:12px;overflow:auto}
        .main{width: 500px;height: 330px;position: relative;margin: 250px auto 0;background-color: #eee;}
        .box{position: absolute;width: 220px;height: 180px;background-color: orange;top: 80px;left: 80px;}
    </style>
</head>

<body style="height:1600px;">
<div class="main">
    <div class="box" id="box"></div>
</div>

<script>
    var oBox = document.getElementById('box');

    window.onload = function(){

        oBox.onmousedown = function(ev){
            ev = ev || window.event;

            console.log(ev.offsetX, ev.offsetY);
            console.log(ev.clientX, ev.clientY);
            console.log(ev.pageX, ev.pageY);
            console.log(ev.screenX, ev.screenY);
            console.log(ev.layerX, ev.layerY);
            console.log(ev.x, ev.y);
        }
    }

</script>
</body>
</html>

圖解 event.offsetX,event.clientX,event.pageX,event.screenX屬性

image.png

圖解 event.layerX,event.layerY 屬性

image.png

圖解 event.x,event.y 屬性

image.png

Jquery 兼容寫法

Jquery event 事件對象,包含有 event.offsetX, event.clientX,event.pageX,event.screenX等屬性(firefox 瀏覽器中, offsetX 爲 undefined)。firefox 獲取 offsetX / offsetY 的值,需要通過 event 對象的屬性 originalEvent。

<script>
$(function(){
    $("#box").mousedown(function(event){
        console.log(event.offsetX, event.offsetY);
        console.log(event.clientX, event.clientY);
        console.log(event.pageX, event.pageY);
        console.log(event.screenX, event.screenY);
 
        /* firefox */
        console.log(event.originalEvent.layerX, event.originalEvent.layerY);
    });
});
</script>

以上內容圖解部分參考自圖解Js event對象offsetX, clientX, pageX, screenX, layerX, x區別。感謝原作者的文章。

本文完。


參考:

JS基礎篇--瞭解JS的clientX、pageX、screenX等方法來獲取鼠標座標詳解

圖解Js event對象offsetX, clientX, pageX, screenX, layerX, x區別

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章