JavaScript--獲取頁面盒子中滑鼠相對於盒子上、左邊框的坐標

来源:https://www.cnblogs.com/WangYujie1994/archive/2019/01/10/10249060.html
-Advertisement-
Play Games

分析: 外層邊框是瀏覽器邊框,內部盒子是頁面的一個盒子,綠點是盒子中滑鼠的位置。滑鼠相對盒子邊框的坐標=頁面中(註意不是瀏覽器)滑鼠坐標-盒子相對於瀏覽器邊框的偏移量 第一步:求瀏覽器邊框位置 x=element.offsetLeft; y=element.offsetTop; 代碼如下: 第二步: ...


分析:

外層邊框是瀏覽器邊框,內部盒子是頁面的一個盒子,綠點是盒子中滑鼠的位置。滑鼠相對盒子邊框的坐標=頁面中(註意不是瀏覽器)滑鼠坐標-盒子相對於瀏覽器邊框的偏移量

 

 

第一步:求瀏覽器邊框位置

x=element.offsetLeft;

y=element.offsetTop;

代碼如下:

 1 /*************樣式表********************/
 2 <style>
 3             *{
 4                 padding: 0px;
 5                 margin: 0px;
 6             }
 7             body {
 8                 height: 2000px;
 9             }
10             #box{
11                 border: 1px solid black;
12                 margin: 100px;
13                 width: 400px;
14                 height: 400px;
15             }
16 </style>
17 
18 
19 /*************網頁主體********************/
20 <body>
21         <div id="box"></div>
22                 /*************JS代碼********************/
23         <script>
24             //獲取盒子邊框相當於瀏覽器邊框的距離
25             var box=document.getElementById('box');
26             var x=box.offsetLeft;
27             var y=box.offsetTop;
28             console.log(x);
29             console.log(y);
30         </script>
31 </body>

 

 

 

第二步:求滑鼠在頁面中的位置

滑鼠在頁面中的位置:

e.PageX  e.PageY ---------->滑鼠在整個文檔中的位置

e.ClientX  e.ClientY --------->滑鼠在整個瀏覽器中的位置

上面二者的區別在於文檔中有沒有滾動條,如果有滾動條,則兩個不一樣,沒有滾動條的情況下,二者沒有區別。在本文要求中,需要使用e.PageX  e.PageY

不過,e.PageX  e.PageY有瀏覽器相容性問題,從IE9以後才支持。

e.PageX=e.ClientX+滾動條滾動距離

e.PageY=e.ClientY+滾動條滾動距離

滾動條滾動距離也具有瀏覽器相容問題,瀏覽器相容問題解決如下:

2.1 滾動條的滾動距離的相容問題

一般求滾動條滾動距離有兩種方式,如下:

第一種:

scroll_x=document.body.scrollLeft

scroll_y=document.body.scrollTop

第二種:

scroll_x=document.documentElement.scrollLeft;

scroll_y=document.documentElement.scrollTop;

但是發現使用第一種方式,獲得的滾動條滾動距離一直是0。

查資料發現是DTD的問題。

頁面指定了DTD,即指定了DOCTYPE時,使用document.documentElement.scrollTop。

頁面沒有DTD,即沒指定DOCTYPE時,使用document.body.scrollTop。
當然,針對上述問題,本文做瞭如下調整:

//滾動條滾動距離
var scroll_x=document.body.scrollLeft || document.documentElement.scrollLeft;
var scroll_y=document.body.scrollTop || document.documentElement.scrollTop;

2.2e.PageX  e.PageY有瀏覽器相容性問題

var page_x=e.pageX || e.clientX + scroll_x;
var page_y=e.pageY || e.clientY + scroll_y;

第二步和第一步做差,即能得到獲取頁面盒子中滑鼠相對於盒子上、左邊框的坐標

具體代碼如下:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3     <head>
 4         <meta charset="UTF-8">
 5         <title>Document</title>
 6         <style>
 7             *{
 8                 padding: 0px;
 9                 margin: 0px;
10             }
11             body {
12                 height: 2000px;
13             }
14             #box{
15                 border: 1px solid black;
16                 margin: 100px;
17                 width: 400px;
18                 height: 400px;
19             }
20         </style>
21     </head>
22 
23     <body>
24         <div id="box"></div>
25         <script>
26             //獲取盒子邊框相當於瀏覽器邊框的距離
27             var box=document.getElementById('box');
28             var box_x=box.offsetLeft;
29             var box_y=box.offsetTop;
30         
31          //滾動條滾動距離
32          var scroll_x=document.body.scrollLeft || document.documentElement.scrollLeft;
33          var scroll_y=document.body.scrollTop || document.documentElement.scrollTop;
34          
35          
36          
37          
38          //滑鼠點擊事件
39          document.onclick=function(e){
40              //e.pageX  e.pageY坐標
41              var page_x=e.pageX || e.clientX + scroll_x;
42              var page_y=e.pageY || e.clientY + scroll_y;
43              //相對坐標
44              var x=page_x - box_x;
45              var y=page_y - box_y;
46              console.log(x);
47              console.log(y);
48          }
49         </script>
50     </body>
51 </html>

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • setTimeout() 可以理解為 定時炸彈 >隔一段事件執行,並且只會執行一次 函數語法: setTimeout(參數1,參數2) 參數1:待執行的函數,可以在方法裡面寫匿名函數,也可以在外面寫好函數,這裡直接傳入函數名 參數2:執行函數觸發到執行的時間間隔,單位是毫秒 1s=1000ms 返回 ...
  • 1.onload事件 onload,頁面載入後執行,所謂頁面載入完成,指頁面上所有的元素創建完畢,引用的所有的外部資源(js、css、圖片)等下載完畢。 所以onload執行的比較晚,因為如果頁面上有好多好多圖片,它需要等這些圖片完成下載後才能執行。而寫在body後的< script >< /scr ...
  • 又開始公司的新項目了。。。又到了無聊的切圖時間,沒辦法,拿人錢財替人消災啊 ! 那當我們拿到公司新項目的時候我們需要做些什麼呢? 下麵就來分享一下我的工作步驟吧(僅使用於初學者,大神勿見怪 ,有不好的地方希望指出,十分感謝) 1. 整版瀏覽 這是一個廢話的過程。。。但是缺是必不可少的一步,我也不得不 ...
  • font-size 字型大小大小 一般推薦使用相對長度(px ,em),不推薦使用絕對長度(in,cmm,mm,pt) font-family 字體 1.可以同時指定多個字體,中間用英文狀態的逗號隔開,英文字體一般不需要加引號,中文字體需要添加英文狀態下的引號,當需要設置英文字體時,英文字體必須位於中文 ...
  • 在web網頁中,尤其是某些提交表單操作,需要驗證文本框輸入內容,本文利用文本框鍵盤事件和事件對象,對文本框只允許輸入數字方法進行總結。 1.鍵盤事件 keydown >鍵盤按下事件 keydown的時候,我們所按的鍵並沒有落入文本框 keyup >鍵盤彈起事件 keyup的時候,我們所按的鍵已經落入 ...
  • //查詢圖表數據 function GetData() { var qs = $("#qs").val(); var js = $("#js").val(); $.ajax({ url: '/YCGL_YCYSJLHIS/GetErrorOperate', type: 'GET', data: { ...
  • $('#a')是返回一個jquery對象 $('#a')[0]是一個element對象 document.getElementById('a') return 一個element對象 ...
  • 微信小程式更新以後今天<radio>全部變成垂直排列了,佈局亂了。 一開始嘗試給外層<view>添加display:flex;flex-direction:row;未果。 後來在開發者社區查找,發現是微信更新後的bug,很多線上的項目都受影響了。 解決: 1、在<radio-group>里添加包一個 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...