教你javascript如何獲取指針的位置
javascript獲取指針的位置的方法:使用事件對象的pageX和pageY,或者clientX和clientY屬性,并且配合scrollLeft和scrollTop屬性,這樣就可以計算出指針的位置了。
本文操作環(huán)境:windows10系統(tǒng)、javascript 1.8.5、thinkpad t480電腦。
要想獲取指針在頁面中的位置,可以使用事件對象的pageX和pageY,或者是 clientX 和 clientY(兼容 IE)屬性,同時還需要配合 scrollLeft 和 scrollTop 屬性,這樣就可以計算出鼠標指針在頁面中的位置了。
//獲取鼠標指針的頁面位置 //參數(shù):e表示當前事件對象 //返回值:返回鼠標相對頁面的坐標,對象格式(x,y) function getMP (e) { var e = e || window.event; return { x : e.pageX || e.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft), y : e.pageY || e.clientY + (document.documentElement.scrollTop || document.body.scrollTop) } }
pageX 和 pageY 事件屬性不被 IE 瀏覽器支持,而 clientX 和 clientY 事件屬性又不被 Safari 瀏覽器支持,因此可以混合使用它們以兼容不同瀏覽器。對于怪異模式來說,body 元素代表頁面區(qū)域,而 html 元素被隱藏,但是標準模式以 html 元素代表頁面區(qū)域,而 body 元素僅是一個獨立的頁面元素,所以需要兼容這兩種解析方式。
下面示例演示了如何調(diào)用上面擴展函數(shù) getMP() 捕獲當前鼠標指針在文檔中的位置。
<body style="width:2000px;height:2000px;"> <textarea id="t" cols="15" rows="4" style="position:fixed;left:50px;top:50px;"></textarea> </body> <script> var t = document.getElementById("t"); document.onmousemove = function(e){ var m = getMP(e); t.value ="mouseX = " + m.x + "\n" + "mouseY = " + m.y } </script>
演示效果如下:
獲取指針的相對位置
使用 offsetX 和 offsetY 或者 layerX 和 layerY 可以獲取鼠標指針相對定位包含框的偏移位置。如果使用 offsetLeft 和 offsetTop 屬性獲取元素在定位包含框中的偏移坐標,然后使用 layerx 屬性值減去 offsetLeft 屬性值,使用 layery 屬性值減去 offsetTop 屬性值,即可得到鼠標指針在元素內(nèi)部的位置。
//獲取鼠標指針在元素內(nèi)的位置 //參數(shù):e表示當前事件對象,o表示當前元素 //返回值:返回相對坐標對象 function getME (e, o) { var e = e || window.event; return { x : e.offsetX || (e.layerX - o.offsetLeft), y : e.offsetY || (e.layerY - o.offsetTop) } }
在實踐中上面函數(shù)存在以下兩個問題:
- Mozilla 類型和 Safari 瀏覽器以元素邊框外壁的左上角為參照點。
- 其他瀏覽器則是以元素邊框內(nèi)壁的左上角為坐標原點。
考慮到邊框?qū)κ髽宋恢玫挠绊?,當元素邊框很寬時,必須考慮如何消除邊框?qū)τ谑髽宋恢玫挠绊?。但是,由于邊框樣式不同,它存?3 像素的默認寬度,為獲取元素的邊框?qū)嶋H寬度帶來了麻煩。需要設置更多的條件,來判斷當前元素的邊框?qū)挾取?/p>
示例
完善后的獲取鼠標指針在元素內(nèi)的位置擴展函數(shù)如下:
//完善獲取鼠標指針在元素內(nèi)的位置 //參數(shù):e表示當前事件對象,o表示當前元素 //返回值:返回鼠標相對元素的坐標位置,其中x表示x軸偏移距離,y表示y軸偏移距離 function getME(e, o){ var e = e || window.event; //獲取元素左側(cè)邊框的寬度 //調(diào)用getStyle()擴展函數(shù)獲取邊框樣式值,并嘗試轉(zhuǎn)換為數(shù)值,如果轉(zhuǎn)換成功,則賦值。 //否則判斷是否定義了邊框樣式,如果定義邊框樣式,且值不為none,則說明邊框?qū)挾葹槟J值,即為3像素。 //如果沒有定義邊框樣式,且寬度值為auto,則說明邊框?qū)挾葹? var bl = parseInt(getStyle(o, "borderLeftWidth")) || ((o.style.borderLeftStyle && o.style.borderLeftStyle != "none" )? 3 : 0); //獲取元素頂部邊框的寬度,設計思路與獲取左側(cè)邊框方法相同 var bt = parseInt(getStyle(o, "borderTopWidth")) || ((o.style.borderTopStyle && o.style.borderTopStyle !="none" ) ? 3 : 0); var x = e.offsetX || (e.layerX - o.offsetLeft - bl); // 一般瀏覽器下鼠標偏移值 //兼容Mozilla類型瀏覽器,減去邊框?qū)挾? var y = e.offsetY || (e.layerY - o.offsetTop - bt); // 一般瀏覽器下鼠標偏移值 //兼容Mozilla類型瀏覽器,減去邊框?qū)挾? var u = navigator.userAgent; // 獲取瀏覽器的用戶數(shù)據(jù) if( (u.indexOf("KHTML") > - 1) ||(u.indexOf("Konqueror") > - 1) || (u.indexOf("AppleWebKit") > - 1) ){ // 如果是Safari瀏覽器,則減去邊框的影響 x -= bl; y -= bt; } return { // 返回兼容不同瀏覽器的鼠標位置對象,以元素邊框內(nèi)壁左上角為定位原點 x : x, y : y } }
演示效果如下:
推薦學習:javascript視頻教程
到此這篇關于javascript獲取指針的位置的文章就介紹到這了,更多相關js指針的位置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
一步一步封裝自己的HtmlHelper組件BootstrapHelper(三)
一步一步封裝自己的HtmlHelper組件:BootstrapHelper,系列文章第三篇,感興趣的小伙伴們可以參考一下2016-09-09javascript Xml增刪改查(IE下)操作實現(xiàn)代碼
比較不錯的實現(xiàn)代碼,大家可以仔細的看下,思路。2009-01-01純js+css實現(xiàn)仿移動端淘寶網(wǎng)站的彈出詳情框功能
這篇文章主要介紹了純js+css實現(xiàn)仿移動端淘寶網(wǎng)站的彈出詳情框功能,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-12-12html+css+js實現(xiàn)xp window界面及有關功能
xp window界面及有關功能使用前端技術實現(xiàn)不可思議吧不夠該程序在IE調(diào)試的,其他瀏覽器可能有BUG,感興趣的朋友可以參考下哈,希望可以幫助到你2013-03-03