1. 程式人生 > >clientX/clientY 與 screenX/screenY 的區別

clientX/clientY 與 screenX/screenY 的區別

clientX/clientY 與 screenX/screenY 的區別

在JavaScript當中有時候我們需要獲取滑鼠懸停的位置,以此來做一些特殊處理。這時候就需要用到MouseEvent物件。MouseEvent物件提供了兩組屬性來定位滑鼠的位置:clientX/clientY和screenX/screenY。除了這兩組屬性我們經常還會用到pageX/pageY和offsetX/offsetY這兩組屬性也是用來定位滑鼠的,那麼他們究竟有什麼異同呢。

屬性說明

  • clientX/clientY

    名稱 說明 返回
    clientX 返回事件觸發時滑鼠相對於元素視口 的X座標 數值
    clientY 返回事件觸發時滑鼠相對於元素視口 的Y座標 數值

    這裡的元素視口實際上代指就是瀏覽器,clientX是滑鼠距離瀏覽器左邊框的距離,clientY是滑鼠距離瀏覽器上邊框的距離。

  • screenX/screenY

    名稱 說明 返回
    screenX 返回事件觸發時滑鼠相對於螢幕 的X座標 數值
    screenY 返回事件觸發時滑鼠相對於螢幕 的Y座標 數值

    顧名思義,screenX是滑鼠距離顯示器螢幕左邊框的距離,screenY是滑鼠距離顯示器螢幕上邊框的距離。

  • pageX/pageY

    名稱 說明 返回
    pageX 返回事件觸發時滑鼠相對於文件 的X座標 數值
    pageY 返回事件觸發時滑鼠相對於文件 的Y座標 數值

    所謂文件可以簡單的理解為瀏覽器中的頁面內容,pageX是滑鼠距離文件左側的距離,pageY是滑鼠距離文件上側的距離,如果我們將滑鼠懸停在瀏覽器中間,通過滾輪滾動瀏覽器,那麼儘管沒有移動滑鼠的位置而pageY一直在變化,因為相對文件頂部的距離一直在變化。

  • offsetX/offsetY

    名稱 說明 返回
    offsetX 返回事件觸發時滑鼠相對於事件指向元素 的X座標 數值
    offsetY 返回事件觸發時滑鼠相對於事件指向元素 的Y座標 數值

    假設有一個元素<p>test</p>當滑鼠進入元素中觸發事件時這是offsetX指的就是滑鼠到P元素左邊的距離。但是這個屬性並不是標準屬性,因此IE和chrome對這個屬性的支援並不一樣。在chrome中offsetX和offsetY的值均為整數,而在IE中值為小數形式,並且如果元素有border屬性也會影響到offsetY的計算。

示例程式碼

mouseover.html

<!DOCTYPE html>
<html>
<head lang="en">
  <meta charset="UTF-8">
  <title></title>
  <link type="text/css" href="../css/test.css" rel="stylesheet">
  <script src="../js/jquery-2.1.4.js"></script>
  <script src="../js/eventtest.js"></script>
</head>
<body>

<div class="container">

  <!--可以在這裡隨意新增一些內容,方便看出pageY和其他屬性的區別-->
  <div class="section" >
  </div>
  <hr>
  <div class="section" >
    <h3>clientX 和 screenX</h3>
    <div class="example">
      <p id="position">
        please move mouse into this area.<br />
        clientX是到瀏覽器左側的距離,screenX是到顯示屏左側的距離。通過縮小瀏覽器的大小可以明顯看出變化
      </p>
    </div>
  </div>
</div>
</body>
</html>

test.css

div.container{
    width:980px;
    margin-left: auto;
    margin-right: auto;
}
div.example{
    height: 100px;
    border:solid 1px #ccc;
    background:#f8f8f8;
}

pre{
    border:solid 1px #ccc;
    background:#f8f8f8;
}

#banana{
    font-family: FreeSerif;
    font-size: 20px;
    background: yellow;
}

#position{
    border:solid 1px #ccc;
    margin-left: 20px;
}

eventtest.js

/**
 * Created by qiumingsheng on 2015/8/27.
 */

$(function(){

    $('#position')[0].addEventListener("mousemove",handlePositionEvent);
    $('#position')[0].addEventListener("mouseout",handlePositionEvent);
    function handlePositionEvent(e){
        if(e.type == 'mousemove'){
            $(e.target).html("clientX:"+ e.clientX+"  clientY:"+e.clientY
                +"<br />"+"screenX:"+ e.screenX +" screenY:"+e.screenY
                +"<br />"+"pageX:"+ e.pageX+"  pageY:"+e.pageY
                +"<br />"+"offsetX:"+ e.offsetX+"  offsetY:"+e.offsetY);
        }else{
            $(e.target).text(" please move mouse into this area.");
        }
    };
});