分析:

外层边框是浏览器边框,内部盒子是页面的一个盒子,绿点是盒子中鼠标的位置。鼠标相对盒子边框的坐标=页面中(注意不是浏览器)鼠标坐标-盒子相对于浏览器边框的偏移量
第一步:求浏览器边框位置
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>
来源:https://www.cnblogs.com/WangYujie1994/p/10249060.html